单片机简易计算器设计_第1页
单片机简易计算器设计_第2页
单片机简易计算器设计_第3页
单片机简易计算器设计_第4页
单片机简易计算器设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选文档一、设计要求1设计4*4的键盘,其中10个数字键09,其余6个为“+” “-” “*”“/” “=”和“C”2设计2位LED接口电路3实现1位数的简单运算二、硬件系统设计1、LED接口电路简易计算器需要2位8段码LED显示电路。用8031单片机经8255A扩展2位8段码LED显示器,用8255A的A口作为段码(字形代码)数据口,PB0和PB1作为位控制端口。在位控制口加集电极开路的反相高压驱动器74LS06以提供驱动LED显示器所需的足够大的电流,然后接至各数码显示器的共阴极端。同理,在段码数据口集电极开路的正相高压驱动器74LS07提供足够大的电流,然后接到数码显示器的各段。逻辑电路

2、结构如下: 2、键盘接口电路简易计算器需要4*4的行列式键盘。用8031单片机经8255A扩展4*4行列式键盘,8255A的B口和C口用于扩展键盘接口,B口高4位作为输出口,C口低4位作为输入口。逻辑电路结构如下:3、计算器逻辑电路图将LED接口电路和键盘接口电路结合到一起就是简易计算器的逻辑电路图,如下:三、软件设计1、LED显示程序设计LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示:为了显示数字或符号,要为LED显示器提供代码,即字形代码。七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。简易计算器用到

3、的数字09的共阴极字形代码如下表:09七段数码管共阴级字形代码显示字型gfedcba段码001111113fh1000011006h210110115bh310011114fh4110011066h511011016dh611111017dh7000011107h811111117fh911011116fh2位LED显示的程序框图如下:2、读键输入程序设计 为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框图如下:3、主程序设计 (1)数值送显示缓冲程序设计简易计算器所显示的数值最大位两位。要显示

4、数值,先判断数值正负,如果是负值,则符号位显示“-”,然后将数值除以10,余数送显最最低位,判断商是否为0,若为0则返回,若不为0,则将商除以10,将余数送显高位。程序框图如下: (2)运算主程序设计 首先初始化参数,送LED低位显示“0”,高位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=” ),是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。运算主程序框图如下所示:4、简易计算器源程序OUTBIT e

5、qu 07FFDh ; 位控制口OUTSEG equ 07FFCh ; 段控制口IN equ 07FFEh ; 键盘读入口data1 equ 70hdata2 equ 71hdizhi1 equ 72hdizhi2 equ 73hLEDBuf equ 60h ; 显示缓冲 ljmp StartLEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序 mov r7, #0DelayLoop: djnz r7, DelayLoo

6、p djnz r6, DelayLoop retDisplayLED: mov r0, #LEDBuf mov r1, #2 ; 共2个八段管 mov r2, #00000010b ; 从左边开始显示Loop: mov dptr, #OUTBIT mov a, #0 movx dptr, a ; 关所有八段管 mov a, r0 mov dptr, #OUTSEG movx dptr, a mov dptr, #OUTBIT mov a, r2 movx dptr, a ; 显示一位八段管 mov r6, #1 call Delay mov a, r2 ; 显示下一位 rr a mov r2,

7、 a inc r0 djnz r1, Loop retTestKey: mov dptr, #OUTBIT mov a, #0 movx dptr, a ; 输出线置为0 mov dptr, #IN movx a, dptr ; 读入键状态 cpl a anl a, #0fh ; 高四位不用 retKeyTable: ; 键码定义 db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07hGetKey: mov dptr, #OUTBIT mov P2, dph mov r0,

8、#Low(IN) mov r1, #00100000b mov r2, #4KLoop: mov a, r1 ; 找出键所在列 cpl a movx dptr, a cpl a rr a mov r1, a ; 下一列 movx a, r0 cpl a anl a, #0fh jnz Goon1 ; 该列有键入 djnz r2, KLoop mov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp ExitGoon1: mov r1, a ; 键值 = 列 X 4 + 行 mov a, r2 dec a rl a rl a mov r2, a ; r2 = (r2-1)*4 mo

9、v a, r1 ; r1中为读入的行值 mov r1, #4LoopC: rrc a ; 移位找出所在行 jc Exit inc r2 ; r2 = r2+ 行值 djnz r1, LoopCExit: mov a, r2 ; 取出键码 mov dptr, #KeyTable movc a, a+dptr mov r2, aWaitRelease: mov dptr, #OUTBIT ; 等键释放 clr a movx dptr, a mov r6, #10 call Delay call TestKey jnz WaitRelease mov a, r2 retStart: mov sp,

10、#40h mov LEDBuf+0, #0 mov LEDBuf+1, #03fh mov dptr, #7FFFh mov a, #89h movx dptr, aMLoop: call DisplayLED ; 显示 call TestKey ; 有键入? jz MLoop ; 无键入, 继续显示 call GetKey ; 读入键码Jisuan: mov r3, a cjne r3, #0fh, Qita ;判断是否为清零键? mov r3, #00h ;清零 mov r4, #00h mov r5, #00h mov data1, #00h mov data2, #00h mov di

11、zhi1, #00h mov dizhi2, #00h mov LEDBuf+0, #0 mov LEDBuf+1, #03fh ljmp MLoopQita: clr c cjne r3, #0ah ,follow ;判断是数字键还是功能键?follow: jc Shuzi ljmp GnShuzi: mov a, r4 ;判断是否已有运算符输入,没有就将数值存在jnz Shuzi2 data1,有就将数值存在data2 mov a, r3 mov data1, a ljmp Xs ;显示第一次输入的数值Shuzi2: mov a, r3 mov data2, a ljmp Xs ;显示第二

12、次输入的数值Gn: mov r4, #01h ;将01h给r4,说明已有运算符输入 cjne r3, #0eh, Ja ;判断键值是否为“=”? mov r4, #00h ;将r4清零 mov a, dizhi1 ;执行“=” mov dph, a mov a, dizhi2 mov dpl, a mov a, #00h jmp a+dptr ;转到本次输入的算法程序Ja: cjne r3, #0ah, Jn ;若键值为“+”则将“+”的程序首地址存在mov dptr, #Jia dizhi1和dizhi2中 mov a, dph mov dizhi1, a mov a, dpl mov di

13、zhi2, a ljmp MLoop Jn: cjne r3, #0bh, Ce ;若键值为“-”则将“-”的程序首地址存mov dptr, #Jian dizhi1和dizhi2中 mov a, dph mov dizhi1, a mov a, dpl mov dizhi2, a ljmp MLoop Ce: cjne r3, #0ch, Cu ;若键值为“*”则将“*”的程序首地址存在mov dptr, #Cheng dizhi1和dizhi2中 mov a, dph mov dizhi1, a mov a, dpl mov dizhi2, a ljmp MLoop Cu: cjne r3

14、, #0dh, Zhuan ;若键值为“/”则将“/”的程序首地址存在mov dptr, #chu dizhi1和dizhi2中 mov a, dph mov dizhi1, a mov a, dpl mov dizhi2, aZhuan: ljmp MLoop Jia: mov a, data1 ;加法程序 add a, data2 ljmp XsJian: mov a, data1 ;减法程序 subb a, data2 ljmp XsCheng: mov a, data1 ;乘法程序 mov b, data2 mul ab ljmp XsChu: mov a, data1 ;除法程序 m

15、ov b, data2 div abXs: mov b, #10 ;显示个位数字 div ab mov r5, a mov a, b mov dptr,#LEDMap movc a, a+dptr mov LEDBuf+1,a mov a, r5First: cjne a,#0,Next ljmp MLoop ;运算完后继续扫描键盘Next: mov b,#10 ;显示十位数字 div ab mov r5, a mov a, b mov dptr, #LEDMap movc a, a+dptr mov LEDBuf+0, a mov a, r5 ljmp First end 四、系统调试与存在

16、的问题1在打开一个程序要进行编译运行时,要在项目中打开它,而不是单单以一个文件的形式打开。2打开WAVE6000后,需要对仿真器进行设置,然后才能用其对所编程序进行编译并执行。3试验箱上提供的6位的LED显示器和4*6的键盘,而简易计算器只用两位LED显示器和4*4键盘,所以必须用软件方法把前4位LED和键盘后2列屏蔽掉。4. 十位上的LED显示管有数字时才显示,没有数字时不显示,而不是显示“0”,做清零操作后LED显示器个位显示“0”,而全部关闭不显示。五、心得体会 课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考

17、察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。 我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。怎么才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一

18、种系统的研究方法,可以进行一些简单的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。 这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!参考文献 #include <

19、reg51.h> signed long A1,B1,RESULT; char C=0,F=0,STATE=0,ANSWER=0,KEY=0;  /定义标志位,F=0存第一个数,F=1存第二个数,C标志显示初值与否 char xuhao1=0,xuhao2=0;xuhao3=0; char  SHU18=0,SHU28=0,SHU38,CHUZHI1=0; char code biao44=1,4,7,0,2,5,8,'R',3,6,9,'=','+'

20、,'-','*','/' char code  DUANMA10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;  /void DELAY(char t) int a=0; for(t;t>=0;t-) for (a;a<=100;a+);/CLEAR() char i=0; A1=0;B1=0;RESULT=0; xuhao1=0;xuhao2=0;xuhao3=0;&#

21、160;F=0;C=0;STATE=0;ANSWER=0;KEY=0; for(i;i<8;i+)   SHU1i=0;  SHU2i=0;  SHU3i=0; /char SAOMIAO() P1=0x0f; if(P1!=0x0f)   DELAY(1);  if(P1!=0x0f) return(1);  else return(0);      

22、;return(0);/signed long ZHUANHUAN(char H8,char X) char i;signed long M=0; X=X-1; for(i=0;i<=X;i+)   M=M*10+Hi;   return(M);/void FANZHUANHUAN(signed long M)    char N,a,b,i;    xuhao3=0;    fo

23、r(;M>0;)      N=M;   M=(M/10);   SHU3xuhao3=(char)N;    xuhao3=xuhao3+1;         b=xuhao3-1;   /if (xuhao3>=8);   for(i=0;i<=b/2;i+)

24、0;   /为满足DISPLAY()函数调用的条件,SHU3中的数要按SHU1,SHU2中的         /存储方式存储,即,最高位数字存入第一个数组单元中  a=SHU3i;  SHU3i=SHU3b-i;  SHU3b-i=a;     /signed long JIA(signed long X,signed long Y)   

25、;signed long result;   result=X+Y;   return(result);/signed long JIAN(signed long X,signed long Y) signed long result; result=X-Y; return(result);/signed long CHENG(signed long X,signed long Y) signed long result; result=X*Y; return(result)

26、;/signed long CHU(signed long X,signed long Y) signed long result; result=X/Y; return(result); /void inter0(void) interrupt 0 using 0   char hang,lie;               switch(P1)  

27、60;            case 0x0e:lie=0;break;        case 0x0d:lie=1;break;        case 0x0b:lie=2;break;        case 0x07:lie=3

28、;break;             P1=0xf0;      switch(P1)               case 0xe0:hang=0;break;        

29、case 0xd0:hang=1;break;        case 0xb0:hang=2;break;        case 0x70:hang=3;break;         KEY=biaohanglie;C=1;     /查表获得按下的键值,按键标志位置1  i

30、f(KEY>=0&&KEY<=9)        /按下的是数字键则进行相应存储     if(F=0)       /若没有运算符按下,键值存入SHU1中            SHU1xuhao1=KEY;    xu

31、hao1=xuhao1+1;               else  if(F=1)       /若有运算符按下,键值存入SHU2中            SHU2xuhao2=KEY;    xu

32、hao2=xuhao2+1;            else if(KEY='+')|(KEY='-')|(KEY='*')|(KEY='/')|(KEY='=')|(KEY='R')      F=1;         /有运算符按

33、下,运算标志位置1   if(KEY='+')STATE=1;C=0;   else if(KEY='-')STATE=2;C=0;   /判断运算符,且相应标识位赋值   else if(KEY='*')STATE=3;C=0;   else if(KEY='/')STATE=4;C=0;   else if(KEY='R') CLEA

34、R();     /复位键按下,调用复位函数,所有标志位,存储数组清零   else if(KEY='=')ANSWER=1;            /void DISPLAY(char SHU8,char xuhao)      char i;char j;   char a=0xfe;&#

35、160;  i=xuhao-1;   if(i<8)          for(i;i>=0;i-)     /动态显示缓冲单元中的数          P2=a;     j=SHUi;    &

36、#160;P0=DUANMAj;     DELAY(3);     a=(a<<1)+1;           else if(i+1)>=8) /如果输入超过8个数,全部显示8以示错误/       for(i;i>0;i-)     

37、60;   P2=a;     P0=0xff;     a=(a<<1)+1;           /void main()     /主函数 IT0=1;        /外部中断0初始化 EX

38、0=1;        /中断采用跳沿触发方式 EA=1;while(1)   char no;  no=SAOMIAO();  if(C=1)      /是否是有键按下,没有则显示0     if (ANSWER=1)  /假如按下的是等号,则进行相应计算,否则显示按的数字  

39、0;     A1=ZHUANHUAN(SHU1,xuhao1);     B1=ZHUANHUAN(SHU2,xuhao2);     if(STATE=1)     /根据相应运算标志位进行相应计算      RESULT=JIA(A1,B1);      FANZHUANHUAN(RESULT);   /计算结果反转换存入SH

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论