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 显示器所需的足 够大的电流,然后接至各数码显示器的共阴极端。同理,在段码数据口集电极开路的正相
2、 高压驱动器 74LS07 提供足够大的电流,然后接到数码显示器的各段。逻辑电路结构如下:P2.7ALEP0.0P0.774LS373Q2Q7Q1Q08031P2.02.3PSENA2A7A1A027328A11OECEXTAL2XTAL1WRRDRST晶振6MHZCSPA0PA1PA2PA3PA4A1PA5A0PA6PA78255AD0D7PB0PB1WR RDRDRESET2X74LS062、键盘接口电路简易计算器需要 4*4的行列式键盘。用 8031单片机经 8255A扩展 4*4 行列式键盘, 8255A 的 B 口和 C 口用于扩展键盘接口, B 口高 4 位作为输出口, C 口低
3、4 位作为输入口 逻辑电路结构如下:3、计算器逻辑电路图将 LED接口电路和键盘接口电路结合到一起就是简易计算器的逻辑电路图,如下:8X74LS07P2.7ALEP0.0P0.7CS8031P2.02.PSENXTAL2XTAL1WRRDRSTG74LS373Q2Q7Q1Q0A2A7A1A0D0D7 2732A8A11OECEA1A0PA0PA1PA2PA3PA4PA5PA6PA78255AD0D7PB0PB1PB4PB5PB6PB7WR PC0RD PC1RESET PC2PC32X74LS064X4键盘+5V三、软件设计1、LED显示程序设计LED显示器由七段发光二极管组成,排列成器排列形
4、状如下图所示:8 字形状,因此也成为七段 LED 显示器,为了显示数字或符号,要为 LED显示器提供代码,即字形代码。七段发光二极管,再 加上一个小数点位,共计 8 段,因此提供的字形代码的长度正好是一个字节。简易计算器 用到的数字 09 的共阴极字形代码如下表:09七段数码管共阴级字形代码显示字型gfedcba段码001111113fh1000011006h210110115bh310011114fh4110011066h511011016dh611111017dh7000011107h811111117fh911011116fh2位 LED显示的程序框图如下:2、读键输入程序设计为了实现键
5、盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个 键都对应一个码键码。为了得到被按键的键码,现使用行扫描法识别按键。其程序框 图如下:3、主程序设计1)数值送显示缓冲程序设计简易计算器所显示的数值最大位两位。要显示数值,先判断数值正负,如果是负值, 则符号位显示“ - ”,然后将数值除以 10,余数送显最最低位,判断商是否为 0,若为 0 则 返回,若不为 0,则将商除以 10,将余数送显高位。程序框图如下:(2)运算主程序设计首先初始化参数,送 LED低位显示“ 0”,高位不显示。然后扫描键盘看是否有键输入, 若有,读取键码。判断键码是数字键、清零键还是功能键( “+”“-”
6、“*”“/ ”“=” ),是 数值键则送 LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“ =”还是 运算键,若是“ =”则计算最后结果并送 LED显示,若是运算键则保存相对运算程序的首地 址。运算主程序框图如下所示:4、简易计算器源程序OUTBIT equ 07FFDh ; 位控制口 OUTSEG equ 07FFCh ; 段控制口 IN equ 07FFEh ; 键盘读入口data1 equ 70hdata2 equ 71hdizhi1 equ 72hdizhi2 equ 73hLEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码
7、db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序 mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoop retDisplayLED:mov r0, #LEDBuf mov r1, #2 ;mov r2, #00000010bLoop:mov dptr, #OUTBITmov a, #0movx dptr, a ;共 2 个八段管 从左边开始显示关所有八段管mov a, r0mov dptr,
8、 #OUTSEG movx dptr, amov dptr, #OUTBITmov a, r2movx dptr, a ;显示一位八段管mov r6, #1 call Delaymov a, r2 rr amov r2, a显示下一位inc r0djnz r1, LoopretTestKey:mov dptr, #OUTBIT mov a, #0输出线置为 0读入键状态高四位不用键码定义找出键所在列下一列该列有键入没有键按下 , 返回 0ffh键值 = 列 X 4 + 行movx dptr, a ; mov dptr, #IN movx a, dptr ; cpl a anl a, #0fh
9、;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, #Low(IN) mov r1, #00100000b mov r2, #4KLoop:mov a, r1 ;cpl amovx dptr, acpl arr amov r1, a ;movx a, r0cpl aanl a, #0fh jnz Goon1 ;djnz r2, KLoopmov r2, #
10、0ffh ; sjmp ExitGoon1:mov r1, a ;mov a, r2dec arl arl amov r2, a; r2 = (r2-1)*4mova, r1; r1中为读入的行值movr1, #4LoopC:rrca ;移位找出所在行jcExitincr2 ;r2 = r2+行值djnzr1, LoopCExit:mova, r2 ;取出键码movdptr, #KeyTablemovca, a+dptrmovr2, a等键释放WaitRelease: mov dptr, #OUTBIT ; clr a movx dptr, amov r6, #10 call Delay ca
11、ll TestKey jnz WaitReleasemov a, r2retStart:movsp, #40hmovLEDBuf+0, #0movLEDBuf+1, #03fhmovdptr, #7FFFhmova, #89hmovxdptr, aMLoop:callDisplayLED ;显示callTestKey ;有键入?jzMLoop ;无键入 , 继续显示callGetKey ;读入键码Jisuan:mov r3, a cjne r3, #0fh, Qita判断是否为清零键 ?movr3, #00h ;movr4, #00hmovr5, #00hmovdata1, #00hmovda
12、ta2, #00hmovdizhi1, #00hmovdizhi2, #00hmovLEDBuf+0, #0movLEDBuf+1, #03fhljmpMLoopQita: clrccjner3, #0ah ,follow ;follow:清零判断是数字键还是功能键 ?jc Shuzi ljmp Gnmova, r3movdata1, aljmpXs ;显示第一次输入的数值Shuzi2:mova, r3movdata2, aljmpXs ;显示第二次输入的数值Gn:mov r4, #01h ;将 01h 给 r4 ,说明已有运算符输入cjner3, #0eh, Ja ;判断键值是否为“ =”?
13、movr4, #00h ;将 r4 清零mova, dizhi1 ;执行“=”movdph, amova, dizhi2movdpl, amova, #00hjmpa+dptr ;转到本次输入的算法程序Ja:cjner3, #0ah, Jn ;若键值为“ +”则将“ +”的程序首地址存在mov dptr, #Jiadizhi1 和 dizhi2 中mova, dphmovdizhi1, amova, dplmovdizhi2, aljmpMLoopdata1判断是否已有运算符输入,没有就将数值存在,有就将数值存在 data2Shuzi: mov a, r4 jnz Shuzi2Jn: cjne
14、 r3, #0bh, Ce mov dptr, #Jianmova, dphmovdizhi1, amova, dplmovdizhi2, aljmpMLoop若键值为“ -”则将“ - ”的程序首地址存 dizhi1 和 dizhi2 中Ce: cjne r3, #0ch, Cu ; mov dptr, #Cheng若键值为“ *”则将“ *”的程序首地址存在 dizhi1 和 dizhi2 中mova, dphmovdizhi1, amova, dplmovdizhi2, aljmpMLoopCu:cjne r3, #0dh, Zhuan ;若键值为“ / ”则将“/ ”的程序首地址存在m
15、ov dptr, #chu dizhi1和 dizhi2 中mov a, dphmov dizhi1, amov a, dplmov dizhi2, aZhuan: ljmp MLoopJia: mov a, data1 ; 加法程序 add a, data2ljmp XsJian: mov a, data1 ; 减法程序 subb a, data2ljmp XsCheng: mov a, data1 ; 乘法程序 mov b, data2mul abljmp XsChu: mov a, data1 ; 除法程序 mov b, data2显示个位数字div abXs: mov b, #10 d
16、iv ab mov r5, a mov a, bmov dptr,#LEDMap movc a, a+dptr mov LEDBuf+1,a mov a, r5First:运算完后继续扫描键盘显示十位数字cjne a,#0,Nextljmp MLoop ;Next:mov b,#10 ; div abmov r5, amov a, bmov dptr, #LEDMap movc a, a+dptr mov LEDBuf+0, a mov a, r5 ljmp Firstend四、系统调试与存在的问题1在打开一个程序要进行编译运行时,要在项目中打开它,而不是单单以一个文件的 形式打开。2打开 W
17、AVE6000 后,需要对仿真器进行设置,然后才能用其对所编程序进行编译 并执行。3试验箱上提供的 6位的 LED显示器和 4*6 的键盘,而简易计算器只用两位 LED显示 器和 4*4 键盘,所以必须用软件方法把前 4位 LED和键盘后 2列屏蔽掉。4. 十位上的 LED显示管有数字时才显示,没有数字时不显示,而不是显示“ 0”,做清 零操作后 LED显示器个位显示“ 0”,而全部关闭不显示。五、心得体会课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实 践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的 日新日异, 单片机已经成为当今计算
18、机应用中空前活跃的领域, 在生活中可以说得是无处 不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。怎么才能 找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计 划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。这次课程设计我学到很 多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程 中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书 本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过
19、这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只 有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而 提高自己的实际动手能力和独立思考的能力。 同时在设计的过程中发现了自己的不足之处, 对以前所学过的知识理解得不够深刻, 掌握得不够牢固, 对单片机汇编语言掌握得不够好。这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题, 最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!同时,对给过我帮助的所有 同学和各位指导老师再次表示忠心的感谢! 参考文献#include signed long A1,B1,RESULT;
20、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,=,+,-,*,/;char code DUANMA10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/void DELAY(char t)int a=0;for(t;t=
21、0;t-)for (a;a=100;a+);/CLEAR()char i=0;A1=0;B1=0;RESULT=0; xuhao1=0;xuhao2=0;xuhao3=0;F=0;C=0;STATE=0;ANSWER=0;KEY=0; for(i;i8;i+)SHU1i=0;SHU2i=0;SHU3i=0;/char SAOMIAO()P1=0x0f;if(P1!=0x0f)DELAY(1);if(P1!=0x0f) return(1); else return(0);return(0);/signed long ZHUANHUAN(char H8,char X) char i;signed
22、long M=0;X=X-1;for(i=0;i=8);for(i=0;i=0&KEY=9)xuhao2=xuhao2+1;else if(KEY=+)|(KEY=-)|(KEY=*)|(KEY=/)|(KEY=)|(KEY=R)F=1; / 有运算符按下,运算标志位置 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) CLEAR(); / 复位键按下,调用复位函数,所有标志位,存
23、储数组清零else if(KEY=)ANSWER=1;/void DISPLAY(char SHU8,char xuhao)char i;char j;char a=0xfe; i=xuhao-1;if(i=0;i-) / 动态显示缓冲单元中的数for(i;i0;i-)P0=0xff;IT0=1;/ 外部中断 0 初始化EX0=1;/ 中断采用跳沿触发方式/ 主函数EA=1;while(1)/ 是否是有键按下,没有则显示 0/ 假如按下的是等号,则进行相应计算,否则显示按的数字/ 计算结果反转换存入 SHU3中/ 计算结果反转换存入 SHU3中P2=a; j=SHUi; P0=DUANMAj; DELAY(3); a=(a1)+1;se if(STATE=3)RESULT=CHENG(A1,B1)FANZHUANHUAN(RESULT);/ 计算结果反转换存入 SHU3中else if(STATE=4)RE
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1