单片机课程设计计算器设计Word文件下载.docx
- 文档编号:21530398
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:314.49KB
单片机课程设计计算器设计Word文件下载.docx
《单片机课程设计计算器设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计计算器设计Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
2.1.2系统框架图
图2.1系统总体框架图
2.1.3工作流程图
No
Yes
图2.2系统工作流程图
2.1.4单片机主控制模块
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:
与MCS-51兼容;
4K字节可编程闪烁存储器;
1000写/擦循;
数据保留时间:
10年;
全静态工作:
0Hz-24Hz;
三级程序存储器锁定;
128*8位内部RAM;
32可编程I/O线;
两个16位定时器/计数器;
5个中断源;
可编程串行通道;
低功耗的闲置和掉电模式;
片内振荡器和时钟电路
74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由B向A传输;
(接收)
DIR=“1”,信号由A向B传输;
(发送)当CE为高电平时,A、B均为高阻态。
由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。
P0口与74LS245输入端相连,E端接地,保证数据线畅通。
8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。
图274LS245引脚图
2.2系统功能描述
本程序有LCD动态显示,键盘输入显示功能,程序启动时默认为计算器状态。
(1)计算器状态下:
按“0”~“9”,显示相应数字;
按“复位”,恢复初始化模式;
按“加减乘除”可实现加减乘除的运算功能
三、各模块功能介绍
3.1键盘输入模块
3.1.1键盘分布图
图3.1计算器键盘图
3.1.2工作原理
本设计采用P3口作为矩阵键盘输入口,开始工作后,单片机先对矩阵键盘的行进行扫描。
若无键按下,先使P3为11110000,然后检测外来输入,若有输入,则可使四位的0其中一位置1,即完成了按行号的输入。
列扫描远离同行扫描相同,不过P3初始为00001111.检测完行号与列号后,产生一个8位二进制码,即可对键盘值进行输入。
3.2运算控制模块
图3.2计算器运算控制模块
控制模块控制着数字录入,数字录入是进行计算的前提,它是将从矩阵键盘上输入的数值、运算符等录入单片机处理器进行处理,从而得出运算结果。
计算模块作为计算器的核心模块共有加、减、乘、除四个部分。
其设计原理是先将键盘输入的BCD码数字转换为十进制数字,然后再对其进行运算。
由于最后需要进行输出显示,所以我们的最终结果以十进制的形式显示在六位的数码显示管上。
3.3显示模块
图3.3数码管显示屏
本设计采用了六位数码管,可以显示0~999999之间的任意整数,由于LED数码管有6个,若采用静态显示,则最少需要48根数据线与6根地址线,这对只有40个引脚的单片机来说是不可能实现的。
所以我采用了动态扫描的显示方法。
其原理是不同时刻对不同位上的数码管进行选通,同时对其进行数码输出。
当扫描频率很高时,将不会看到数码管的闪烁。
本设计应用了定时器中断来实现间时显示。
3.4振荡电路模块
图3,.4振荡电路
振荡电路如图所示。
图中晶振的两端分别接单片机的19和18脚。
时钟有内部电路产生,定时器件为石英晶体和电容组成的并联谐振回路。
3.5起保护作用模块
图3.5限流电阻
这一排限流电阻,它们的作用是起保护作用,防止数码管的段位被烧坏。
四、仿真电路
图4.1系统电路仿真图
仿真运行结果
例如:
运行23*2时,一次在键盘上输入数据和功能键,功能键不会再数码管上显示出来,只会显示出输入的数据和运行结果。
图4.2输入数据23时
图4.3输入数据2
图4.4计算23*2的运行结果
五、调试过程总结
开始在做这个单片机课设的时候,感觉无从下手,一点头绪都没有。
后来上网查了好多资料,向学长请教。
终于功夫不负有心人,做出了这个单片机的课设。
调试过程中也遇到了一些问题,先是数码管显示数据不完整,经过仔细检查发现是线路连接的错误;
后来又遇到计算时会出现运算错误,经过查找发现原来是编程的问题。
在利用keil软件编程的过程中,会出现各种各样的问题,有的是由于粗心而引起的,有的是因为概念模糊而导致的。
再用proteus进行仿真时,会出现的问题主要是线路连接问题,可能会不小心把线连错,其他的我觉得只要元器件选择好,各引脚的功能清楚的话一般不会有太大的问题。
在这次做课程设计的过程中我深深体会到了要独立完成一个作品的设计是多么不容易。
虽然我做的只是最基础的,但是从这个最小的系统中却是利用了单片机的最基础的功能。
在这个过程中,我们不仅仅是编程仿真那么简单,还需要有极大的耐心与毅力。
设计的过程中会遇到各种各样的问题,我们应该静下心来好好研究,这对于我们以后的工作也是非常重要的。
总的来说,这次课程设计,一个礼拜的紧张忙碌终于完成了。
感觉自己的收获还是很多的,无论是对专业知识的了解还是对硬件的设计,都是需要我们下很大的功夫去研究的。
通过这次课程设计,最大的一点体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是汇编语言,尽管大家都知道汇编编这个程序很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果。
很感谢那些热心教导我的同学和指导我的老师。
附录:
参考文献:
【1】姜志海、刘连鑫等,单片机微型计算机原理及应用[M]。
北京:
电子工业出版社,2011
【2】周润景,张丽娜。
基于PROTEUS的电路及单片机系统设计与仿真[M]。
北京:
北京航空航天大学出版社,2006
源程序代码
YJEQU50H;
结果存放
YJ1EQU51H;
中间结果存放
GONGEQU52H;
功能键存放
ORG00H;
程序存放的首地址
START:
MOVR3,#0;
初始化显示为空
MOVGONG,#0;
功能键清零
MOV32H,#00H;
(32H)=00H,存放输入的数据
MOV33H,#00H;
(33H)=00H
MOV34H,#00H;
(34H)=00H
MLOOP:
CALLDISP;
调显示子程序,call通过入口地址跳转有返回,返回地址压入堆栈。
WAIT:
CALLTESTKEY
NEXT1:
CJNEA,#1,NEXT2
LJMPE1
NEXT2:
CJNEA,#2,NEXT3
NEXT3:
CJNEA,#3,NEXT4
NEXT4:
CJNEA,#4,NEXT5
NEXT5:
CJNEA,#5,NEXT6
NEXT6:
CJNEA,#6,NEXT7
NEXT7:
CJNEA,#7,NEXT8
NEXT8:
CJNEA,#8,NEXT9
NEXT9:
CJNEA,#9,NEXT10
NEXT10:
CJNEA,#10,NEXT11;
判断是否功能键
LJMPE2;
转功能键处理
NEXT11:
CJNEA,#11,NEXT12
LJMPE2
NEXT12:
CJNEA,#12,NEXT13
LJMPE2
NEXT13:
CJNEA,#13,NEXT14
NEXT14:
CJNEA,#14,NEXT15
NEXT15:
LJMPE3;
判断是否清除键
E1:
CJNER3,#1,N1;
判断第几次按键,若(R3)不等于
(1),则跳转到N1处执行
LJMPE11;
为第一个数字
N1:
CJNER3,#2,N2
LJMPE12;
为第二个数字
N2:
CJNER3,#3,N3
LJMPE13;
为第三个数字
N3:
LJMPE3;
第四个数字转溢出
E11:
MOVR4,A;
输入值暂存R4
MOV34H,A;
输入值送显示缓存
MOV33H,#00H
MOV32H,#00H
LJMPMLOOP;
等待再次输入
E12:
MOVR7,A;
个位数暂存R7
MOVB,#10
MOVA,R4
MULAB;
十位数,输入的值乘10,即为十位数
ADDA,R7
MOVR4,A;
输入值存R4
MOV33H,34H
MOV34H,R7
LJMPMLOOP
E13:
MOVR7,A
MULAB
JBOV,E3;
输入溢出
JBCY,E3;
MOVR4,A
MOV32H,33H;
E3:
MOVR3,#0;
按键次数清零
MOVR4,#0;
输入值清零
MOVYJ,#0;
计算结果清零
MOVGONG,#0;
功能键设为零
显示清空
MOV34H,#00H
E2:
MOVR0,GONG;
与上次功能键交换
MOVGONG,A
MOVA,R0
CJNEA,#10,N21;
判断功能键
LJMPJIA;
"
+"
N21:
CJNEA,#11,N22
LJMPJIAN;
-"
N22:
CJNEA,#12,N23
LJMPCHENG;
*"
N23:
CJNEA,#13,N24
LJMPCHU;
/"
N24:
CJNEA,#0,N25
LJMPFIRST;
首次按功能键
N25:
LJMPDEN;
="
N4:
LJMPE3
FIRST:
MOVYJ,R4;
输入值送结果
LJMPDISP1;
结果处理
//加法//
JIA:
MOVA,YJ;
上次结果送累加器
ADDA,R4;
上次结果加输入值
JBCY,N4;
溢出
MOVYJ,A;
存本次结果
MOVR3,#0;
LJMPDISP1
//减法//
JIAN:
MOVA,YJ
SUBBA,R4;
上次结果减输入值
负数溢出,JB位变量条件转移指令,若直接寻址位的值为1,则执行转移
MOVYJ,A
MOVR3,#0
//乘法//
CHENG:
MOVB,A
MULAB;
上次结果乘输入值
JBOV,N4;
MOVYJ,A
//除法//
CHU:
MOVA,R4
MOVA,YJ
DIVAB;
上次结果除输入值
//等于//
DEN:
MOVR3,#0
DISP1:
MOVB,#10
MOVA,YJ
MOVA,YJ1
DIVAB
MOVYJ1,A
MOVA,B
MOV33H,A;
十位送显示缓存
JZDISP11;
结果是否为二位数
MOV32H,A;
百位数送显示缓存
DISP11:
LJMPMLOOP;
长跳转指令
DISP:
MOVR0,#34H
DIR1:
MOVDPTR,#SEGTAB;
基寄存器DPTR存入输入的数据值
MOVA,@R0;
寄存器间接寻址
MOVCA,@A+DPTR;
基寄存器加变址寄存器间接寻址
MOVP0,A
CJNER0,#34H,DIR2
SETBP2.0
DIR2:
CJNER0,#33H,DIR3
SETBP2.1
CALLD1MS
CLRP2.1;
P2.1端口清零
DECR0;
减1指令
SJMPDIR1
DIR3:
SETBP2.2
CLRP2.2
RET
D1MS:
MOVR7,#02H
DMS:
MOVR6,#0F0H
DJNZR6,$;
减1不为0跳转指令
DJNZR7,DMS
RET
SEGTAB:
DB0C0H,0F9H,0A4H,0B0H;
0123定义字节
DB99H,92H,82H,0F8H;
4567
DB80H,90H,88H,83H;
89AB
DB0C6H,0A1H,86H,8EH;
CDEF
TESTKEY:
ACALLDISP
MOVP1,#0FH;
读入键状态
MOVA,P1
CPLA;
将累加器A的内容逐位求反,不影响标志
ANLA,#0FH;
高四位不用,与操作,屏蔽高四位
KEYTABLE:
DB0D7H,0EBH,0DBH,0BBH;
键码定义
DB0EDH,0DDH,0BDH,0EEH
DB0DEH,0BEH,077H,07BH
DB07DH,07EH,0B7H,0E7H
;
DB07EH,07DH,07BH,0E7H;
DB0D7H,0B7H,0DEH,0BDH
DB0EBH,0DBH,0BBH,0DDH
DB077H,0EEH,0BEH,0EDH
GETKEY:
MOVR6,#10;
读键子程序
ACALLDELAY
MOVP1,#0FH
MOVA,P1
CJNEA,#0FH,K12
LJMPMLOOP
K12:
MOVP1,#0EFH
CJNEA,#0EFH,K13
MOVP1,#0DFH
CJNEA,#0DFH,K13
MOVP1,#0BFH
CJNEA,#0BFH,K13
MOVP1,#07FH
CJNEA,#07FH,K13
K13:
ANLA,#0F0H
ORLA,B;
或操作,用于数据拼装
MOVR1,#16
MOVR2,#0
MOVDPTR,#KEYTABLE
K14:
MOVA,R2
MOVCA,@A+DPTR
CJNEA,B,K16
K15:
MOVA,P1
CJNEA,#0FH,K15
MOVR6,#10
MOVA,R2
K16:
INCR2
DJNZR1,K14
AJMPMLOOP
DELAY:
MOVR7,#10
TS1:
MOVR6,#0FFH
TS2:
NOP;
空操作指令
NOP
DJNZR6,TS2
DJNZR7,TS1
END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 计算器 设计