单片机简易计算器设计.doc

上传人:可**** 文档编号:32366379 上传时间:2022-08-09 格式:DOC 页数:29 大小:1,005KB
返回 下载 相关 举报
单片机简易计算器设计.doc_第1页
第1页 / 共29页
单片机简易计算器设计.doc_第2页
第2页 / 共29页
点击查看更多>>
资源描述

《单片机简易计算器设计.doc》由会员分享,可在线阅读,更多相关《单片机简易计算器设计.doc(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、- .一、设计要求1设计4*4的键盘,其中10个数字键09,其余6个为“+“-“*“/“=和“C2设计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段,因此提供的字形代码的长度正好是一个字节。简易计算器用到的数字09的共阴极字形代

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

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

5、UTSEG 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, DelayLoop djnz r6, DelayL

6、oop 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, a inc r0 djnz r1

7、, 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, #Low(IN) mov r1,

8、#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 mov a, r1 ; r1中为读入的

9、行值 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, #40h mov LEDBuf+0

10、, #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 dizhi1, #00h mov di

11、zhi2, #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 ;显示第二次输入的数值Gn: mov r4,

12、 #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 dizhi2, a ljmp MLoop

13、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, #0dh, Zhuan ;假设键值为

14、“/那么将“/的程序首地址存在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 ;除法程序 mov b, data2 div abXs

15、: 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四、系统调试与存在的问题1在翻开一个程序要进展编译运行时,要

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

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

18、通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会效劳,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的缺乏之处,对以前所学过的知识理解得不够深刻,掌握得不够结实,对单片机汇编语言掌握得不够好。这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题,最后在教师的辛勤指导下,终于迎刃而解,在此我表示感!同时,对给过我帮助的所有同学和各位指导教师再次表示忠心的感!参考文献#include signed long A1,B1,RESULT;char C=0,

19、F=0,STATE=0,ANSWER=0,KEY=0;/定义标志位,F=0存第一个数,F=1存第二个数,C标志显示初值与否char xuhao1=0,xuhao2=0;xuhao3=0;charSHU18=0,SHU28=0,SHU38,CHUZHI1=0;char code biao44=1,4,7,0,2,5,8,R,3,6,9,=,+,-,*,/;char codeDUANMA10=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

20、+);/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 long M=0;X=X-1;for(i=0;

21、i0;)N=M;M=(M/10);SHU3xuhao3=(char)N;xuhao3=xuhao3+1;b=xuhao3-1;/if (xuhao3=8);for(i=0;i=0&KEY=9)/按下的是数字键那么进展相应存储if(F=0)/假设没有运算符按下,键值存入SHU1中 SHU1xuhao1=KEY;xuhao1=xuhao1+1;elseif(F=1)/假设有运算符按下,键值存入SHU2中SHU2xuhao2=KEY;xuhao2=xuhao2+1;else if(KEY=+)|(KEY=-)|(KEY=*)|(KEY=/)|(KEY=)|(KEY=R)F=1;/有运算符按下,运算标

22、志位置1if(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();/复位键按下,调用复位函数,所有标志位,存储数组清零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-)/动态显示缓冲单元中的数P2=a;j=SHUi;P0=DUA

23、NMAj;DELAY(3);a=(a=8) /如果输入超过8个数,全部显示8以示错误/for(i;i0;i-)P2=a;P0=0xff;a=(a1)+1;/void main()/主函数IT0=1;/外部中断0初始化EX0=1;/中断采用跳沿触发方式EA=1;while(1)char no;no=SAOMIAO();if(C=1)/是否是有键按下,没有那么显示0if (ANSWER=1)/假设按下的是等号,那么进展相应计算,否那么显示按的数字A1=ZHUANHUAN(SHU1,xuhao1);B1=ZHUANHUAN(SHU2,xuhao2);if(STATE=1)/根据相应运算标志位进展相应

24、计算RESULT=JIA(A1,B1);FANZHUANHUAN(RESULT);/计算结果反转换存入SHU3中else if(STATE=2)RESULT=JIAN(A1,B1);FANZHUANHUAN(RESULT);/计算结果反转换存入SHU3中else if(STATE=3)RESULT=CHENG(A1,B1);FANZHUANHUAN(RESULT);/计算结果反转换存入SHU3中else if(STATE=4)RESULT=CHU(A1,B1);FANZHUANHUAN(RESULT);/计算结果反转换存入SHU3中else;if(F=0) DISPLAY(SHU1,xuhao1);/F=0表示没有运算符按下,显示数组1if(F=1&ANSWER=0) DISPLAY(SHU2,xuhao2);/运算符按下了,显示数组2if(F=1&ANSWER=1) DISPLAY(SHU3,xuhao3);/有运算符按下并且是=时显示计算结果缓冲区else DISPLAY(CHUZHI,1);/没有键按下那么显示0/*. word.zl.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁