怎样用51单片机做计算器啊?
1、硬件仿真图 硬件部分比较简单,当键盘按键按下时它的那一行、那一列的端口为低电平。因此,只要扫描行、列端口是否都为低电平就可以确定是哪个键被按下。 2、主程序流程图 程序的主要思想是:将按键抽象为字符,然后就是对字符的处理。将操作数分别转化为字符串存储,操作符存储为字符形式。然后调用compute()函数进行计算并返回结果。具体程序及看注释还有流程图。 3、Altium Designer画的PCB图 4、程序源代码 #include #include #include #include #define uchar unsigned char #define uint unsigned int uchar operand1[9], operand2[9]; uchar operator; void delay(uint); uchar keyscan(); void disp(void); void buf(uint value); uint compute(uint va1,uint va2,uchar optor); uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff}; uchar dbuf[8] = {10,10,10,10,10,10,10,10}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } uchar keyscan() { uchar skey; P1 = 0xfe; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xee: skey = '7'; break; case 0xde: skey = '8'; break; case 0xbe: skey = '9'; break; case 0x7e: skey = '/'; break; default: skey = '#'; } while((P1 & 0xf0) != 0xf0) ; } } P1 = 0xfd; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xed: skey = '4'; break; case 0xdd: skey = '5'; break; case 0xbd: skey = '6'; break; case 0x7d: skey = '*'; break; default: skey = '#'; } while((P1 & 0xf0) != 0xf0) ; } } P1 = 0xfb; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xeb: skey = '1'; break; case 0xdb: skey = '2'; break; case 0xbb: skey = '3'; break; case 0x7b: skey = '-'; break; default: skey = '#'; } while((P1 & 0xf0) != 0xf0) ; } } P1 = 0xf7; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xe7: skey = '$'; break; case 0xd7: skey = '0'; break; case 0xb7: skey = '='; break; case 0x77: skey = '+'; break; default: skey = '#'; } while((P1 & 0xf0) != 0xf0) ; } } return skey; } void main() { uint value1, value2, value; uchar ckey, cut1 = 0, cut2 = 0; uchar operator; uchar i, bool = 0; init: buf(0); disp(); value = 0; cut1 = cut2 = 0; bool = 0; for(i = 0;i < 9;i++) { operand1[i] = '\0'; operand2[i] = '\0'; } while(1) { ckey = keyscan(); if(ckey != '#') { if(isdigit(ckey)) { switch(bool) { case 0: operand1[cut1] = ckey; operand1[cut1+1] = '\0'; value1 = atoi(operand1); cut1++; buf(value1); disp(); break; case 1: operand2[cut2] = ckey; operand2[cut2+1] = '\0'; value2 = atoi(operand2); cut2++; buf(value2); disp(); break; default: break; } } else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/') { bool = 1; operator = ckey; buf(0); dbuf[7] = 10; disp(); } else if(ckey == '=') { value = compute(value1,value2,operator); buf(value); disp(); while(1) { ckey = keyscan(); if(ckey == '$') goto init; else { buf(value); disp(); } } } else if(ckey == '$') { goto init;} } disp(); } } uint compute(uint va1,uint va2,uchar optor) { uint value; switch(optor) { case '+' : value = va1+va2; break; case '-' : value = va1-va2; break; case '*' : value = va1*va2; break; case '/' : value = va1/va2; break; default : break; } return value; } void buf(uint val) { uchar i; if(val == 0) { dbuf[7] = 0; i = 6; } else for(i = 7; val > 0; i--) { dbuf[i] = val % 10; val /= 10; } for( ; i > 0; i--) dbuf[i] = 10; } void disp(void) { uchar bsel, n; bsel=0x01; for(n=0;n<8;n++) { P2=bsel; P0=table[dbuf[n]]; bsel=_crol_(bsel,1); delay(3); P0=0xff; } } 扩展资料: PROTEUS 是单片机课堂教学的先进助手 PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。 它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。 课程设计、毕业设计是学生走向就业的重要实践环节。由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台 随着科技的发展,“计算机仿真技术”已成为许多设计部门重要的前期设计手段。它具有设计灵活,结果、过程的统一的特点。可使设计时间大为缩短、耗资大为减少,也可降低工程制造的风险。相信在单片机开发应用中PROTEUS也能茯得愈来愈广泛的应用。 使用Proteus 软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力; 在单片机课程设计和全国大学生电子设计竞赛中,我们使用 Proteus 开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。 实践证明,在使用 Proteus 进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。因此,Proteus 有较高的推广利用价值。 参考资料来源:百度百科-protues
哪位大神能帮我写一个基于单片机C51的电子时钟设计报告?
老师给我的
电子钟设计
1、 电路图:
2功能实现:
(1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;
(2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;
(3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;
3、程序框图:
6. 汇编源程序
HOURK BIT P1.2
MINITEK BIT P1.1
SECONDK BIT P1.0
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
ORG 0030H
START:
MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#12
MOV R0,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
NEXT: MOV A,#7FH
MOV P3,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0BFH
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0DFH
MOV P3,A
mov p2,#40h
call delay
mov a,#0efh
mov p3,a
MOV A,MINITE
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0F7H
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0FBH
MOV P3,A
mov p2,#40h
call delay
MOV A,#0FDH
MOV P3,A
MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,#0FEH
MOV P3,A
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
WT: JB SECONDK,NK1
LCALL DELY10MS
JB SECONDK,NK1
JNB SECONDK,$
INC SECOND
MOV A,SECOND
CJNE A,#60,NK1
MOV SECOND,#00H
NK1: JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
JNB MINITEK,$
INC MINITE
MOV A,MINITE
CJNE A,#60,NK2
MOV MINITE,#00H
NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
JNB HOURK,$
INC HOUR
MOV A,HOUR
CJNE A,#24,NK3
MOV HOUR,#00
NK3:
MOV A,R0
CJNE A,#20,NEXT1
MOV R0,#0
INC SECOND
MOV A,SECOND
CJNE A,#60,NEXT1
MOV SECOND,#0
INC MINITE
MOV A,MINITE
CJNE A,#60,NEXT1
MOV MINITE,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXT1
MOV HOUR,#0
next1:JMP NEXT
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
INT_T0: CLR TR0
INC R0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
RETI
DELAY:
MOV R6,#2
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DELY10MS:
MOV R6,#10
DD1: MOV R7,#248
DJNZ R7,$
DJNZ R6,DD1
RET
END
推荐阅读
- ○ 火影忍者338
- ○ 25岁眼霜哪个牌子好
- ○ 斗破苍穹第四季第12集
- ○ 我的2010
- ○ 308激光治疗
- ○ 美人心计4
- ○ 金刚狼1电影国语
- ○ 英文字母26个字母表
- ○ 山东2020高考录取分数线
- ○ 300分左右的专科
最新文章
- ○ 火影忍者338
- ○ 25岁眼霜哪个牌子好
- ○ 斗破苍穹第四季第12集
- ○ 我的2010
- ○ 308激光治疗
- ○ 美人心计4
- ○ 金刚狼1电影国语
- ○ 英文字母26个字母表
- ○ 山东2020高考录取分数线
- ○ 300分左右的专科