基于89C51的计算器设计.docx
- 文档编号:16980184
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:32
- 大小:396.58KB
基于89C51的计算器设计.docx
《基于89C51的计算器设计.docx》由会员分享,可在线阅读,更多相关《基于89C51的计算器设计.docx(32页珍藏版)》请在冰点文库上搜索。
基于89C51的计算器设计
单片机系统课程设计任务书
学生姓名
专业班级
自动F1205
学号
题目
基于89C51的计算器设计
课题性质
工程设计
课题来源
自拟
指导教师
主要内容
(参数)
利用89C51单片机设计一个计算器,实现功能如下:
1.4*4按键用于0~9的数字输入、加减乘除、等于、清零功能;
2.能实现简单的加减乘除运算;
3.输入数字及计算结果通过LED显示器显示。
任务要求
(进度)
第1-2天:
熟悉课程设计任务及要求,查阅技术资料,确定设计方案。
第3-4天:
按照确定的方案设计单元电路。
要求画出单元电路图,元件及元件参数选择要有依据,各单元电路的设计要有详细论述。
第5-6天:
软件设计,编写程序。
第7-8天:
实验室调试。
第9-10天:
撰写课程设计报告。
要求内容完整、图表清晰、文理流畅、格式规范、方案合理、设计正确,篇幅合理。
主要参考
资料
[1]张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:
国防工业出版社,2004
[2]伟福LAB6000系列单片机仿真实验系统使用说明书
[3]阎石.数字电路技术基础(第五版).北京:
高等教育出版社,2006
审查意见
系(教研室)主任签字:
年月日
目录
绪论1
1.硬件组成与方案设计1
1.1系统框图1
1.2硬件设计2
1.3功能设计2
2.硬件电路设计2
2.1时钟电路2
2.2复位电路3
2.3显示电路4
2.4键盘电路5
3.系统软件设计6
3.1主程序6
3.2键盘检测程序7
3.3读键输入程序8
3.4数码管显示程序10
4.仿真与调试11
4.1软件调试11
4.2硬件调试11
4.3调试结果11
总结13
参考文献13
附录A:
整体电路图14
附录B:
程序代码15
绪论
近十几年来,单片机技术凭借其速度快,体积小,价格低,控制功能强,易于掌握,功能丰富等自身优点迅速发展,在各个领域发挥了重大作用,如今已成为一门成熟的学科。
利用单片机可以实现非常丰富的功能,如流水灯,闹钟,秒表,音乐盒等,能够独立完成,实现设计,可以很好的检验自己对硬件以及对软件的理解和掌握水平。
本设计采用80C51芯片,实现了利用单片机进行了一个简单计算器设计。
允许对输入数据进行加,减,乘,除运算及LED数码管的显示。
当然也可以用如LED显示屏显示来显示出更多的字符,实现更多的功能。
但设计的关键所在,必须非常熟悉单片机的原理与结构,同时还要对整个设计流程有很好的把握,实现单片机和其他模块的完整的衔接。
1.硬件组成与方案设计
1.1系统框图
硬件组成如图1.1所示,通过时钟电路来提供时钟脉冲,使单片机有节拍的协同各个部件的同步有序工作,键盘电路来检测各个功能键,通过数码管来显示输出结果,复位电路可以在单片机异常工作或者需要重新计算时进行复位:
图1.1芯片和键盘实现功能
1.2硬件设计
根据功能和指标要求,本系统选用89C52单片机为主控机。
通过扩展必要的
外围接口电路,实现对计算器的设计。
按键分布如下表1.2所示:
0
1
2
3
4
5
6
7
8
9
C
=
+
-
*
/
表1.2按键分布表
硬件设计如下:
①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高故我们采用可以进六位数字的运算,选用6个LED数码管显示数据和结果。
②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可。
1.3功能设计
功能实现如下:
1初始化:
上电后,屏幕初始化。
2计算。
按下数字键,屏幕显示要运算的第一个数字,再按下符号键,屏幕不显示,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“﹦”号键,屏幕上显示出计算结果。
3如果要再次计算,可以按下“C”键清零,或者按下单片机的复位键,重新初始化。
2.硬件电路设计
2.1时钟电路
时钟电路是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊地工作。
因此时钟频率直接影响单片机的速度,时钟电路的质量也影响单片机系统的稳定性。
本文时钟电路采用内部时钟电路,在引脚XTAL1和XTAL2两端跨接石英晶体,通过外接晶振C1,C2形成内部时钟电路,C1,C2一般取30pF:
图2.1时钟电路
2.2复位电路
上电复位电路是一种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。
上电复位是指在系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随VCC对电容的充电过程而回落,故RST引脚复位的高电平维持时间取决于电容的充电时间。
为保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长时间,电路图如下图图2.2所示:
图2.2复位电路
2.3显示电路
如下图2.3所示为一位共阴极数码管的元件图:
图2.3数码管
它是一种半导体发光器件,其基本单元是发光二极管。
表2.1为常用的字形表,为了显示数字或符号,要为LED显示器提供代码,即字形代码为方便查询数码管共阴极字形段码,通过查询下表可以很方便的找到所需要段码:
显示字型
g
f
e
d
c
B
a
段码
0
0
1
1
1
1
1
1
3fh
1
0
0
0
0
1
1
0
06h
2
1
0
1
1
0
1
1
5bh
3
1
0
0
1
1
1
1
4fh
4
1
1
0
0
1
1
0
66h
5
1
1
0
1
1
0
1
6dh
6
1
1
1
1
1
0
1
7dh
7
0
0
0
0
1
1
1
07h
8
1
1
1
1
1
1
1
7fh
9
1
1
0
1
1
1
1
6fh
表2.1常用字形码(低电平有效)
数码管是由8段发光二极管显示字段的显示器件,发光二极管简称字段,要显示某字形就应使该字形的相应字段点亮,也就是向数码管送入不同的电平组合,通过不同的组合可以显示0~9,A~F以及小数点“.”等字符,而本设计为正整数的运算,并不涉及到小数点的点亮。
数码管的显示方法为:
通过右边的公共端控制数码管的亮灭,通过左边的段选码的电平状态确定每位发光二极管亮灭。
本次设计采用的是6位七段共阴极数码管,但是不需要单独使每个数码管送出段选码,而是每3个数码管的段选端通过内部总线相连,再通过动态显示数码管的方式使每个数码管分时轮流选通,因此大大简化了电路,更好的利用了I/O资源。
下图2.4即为所使用的6位数码管的元件图:
图2.4数码管显示电路
2.4键盘电路
考虑到独立式键盘每个按键都要占用一个I/O口,按键较多时需要占用较多的的I/O口线,资源利用率低,并且由于本次采用的单片机开发板本身就是行列式键盘,故最终采用的是4行列式键盘。
行列式键盘的四个行线处于输入状态,四个列线处于输出状态,按键设置在行列线的交叉点上,行列线分别连在按键开关的两端。
具体键盘电路如图2.3所示:
图2.5键盘电路
3.系统软件设计
3.1主程序
主程序流程图如图3.1所示,主程序构成循环,首先初始化参数,送LED为高电平,初始状态下没有字形码显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键0~9、清零键,“=”还是四则运算符(“+”,“-”,“*”,“/”),如果是数字值,则计数第几个数,第几位数,进行内部运算处理,送入数码管进行显示输出,是清零键则做对数码管进行清零,如果是四则运算,则内部进行运算处理,同时数码管不显示,若为“=”号则输出运算结果,显示在数码管上。
图3.1主程序流程图
3.2键盘检测程序
此子程序为本设计的核心之一,因为按键是利用机械触点来进行合,断作用的,机械触点在闭合或断开的瞬间由于弹性作用的影响,有抖动现象,从而使电压信号出现抖动,会造成按键读入的不稳定性,产生误读现象,因此为了保证键盘读入的可靠性,必须消除去除抖动影响,抖动时间与按键的机械特性相关,一般为5~10ms,去除抖动的方法有硬件和软件去抖两种,本实验采用的是软件去抖:
:
检测到有键按下时,执行一个20ms的延时程序,再确认该键电平是否保持闭合电平状态,若仍为闭合电平状态,则确认该键处于闭合状态,从而去除抖动影响,子程序流程图如图3.2所示:
图3.2键盘程序流程图
3.3读键输入程序
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。
为了得到被按键的键码,现使用行扫描法识别按键。
列扫描信号进行读入行的信号,判断该列是否有列的输出——是则进行按照行列计算键盘的值,查表取得键码并返回——若否则进行再次扫描。
本设计采用矩阵式键盘,行线为P3.0-P3.3,列线为P3.4-P3.7,通过读取行线P3.0-P3.3的状态可以确定有无键按下,当键盘上没有键被按下时,行列线是断开的,P3.0-P3.3输入全部为高电平,当某个键被按下时,行列线短路,P3.0-P3.3短路,所有行线输入都是低电平,而列线某一位为低电平,其他位均为高电平。
通过结合行线和列线的输入状态可以确定哪个键被按下,从而确定正确的键码值。
图3.3读键输入程序流程图
3.4数码管显示程序
数码管显示分为静态显示和动态显示,考虑到静态显示需要显示较多I/O口,占用资源多,并且考虑到本单片机实验板硬件的限制,本数码管的显示采用的动态显示方案,通过分时轮流选通数码管的公共端,使各个数码管轮流选通,再送出段码,显示特定字符。
在各个数码管依次显示一遍后,通过循环使显示器分时点亮,由于视觉暂留效用与余晖效应,人眼无法识别数码管的点亮顺序,就好像所有数码管同时点亮,具体流程如下图3.4:
图3.4数码管显示流程图
4.仿真与调试
4.1软件调试
1、打开KeiluVision2软件后,在Project菜单中选择NewProject命令,打开一个新项目。
保存此项目,输入工程文件名calculator后,并保存工程文件的目录。
2、为项目文件选择一个目标器件,即选择80C51的类型。
在Database列表框中选择“Atmel89C52”,确定。
3、选择“File”目录下的Target1,在右键列表中选择“组SourceGroup1属性”,在输出项勾选“E成HEX文件”,HEX格式为“HEX-80”。
4、上述设置好后,创建源程序文件并输入程序代码。
输入好代码后点击“文件/保存”,保存为calculator.asm。
5、把源文件添加到项目中,用鼠标指在目标工作区的目标:
1.点击右键在弹出的菜单中选择“添加文件到组SourceGroup1”,在弹出的添加文件框中,选择需要添加到项目中的文件。
6、开始编译,对项目文件进行编译,对代码进行修改完善,最后编译0错误,0警告。
7、打开stc-isp软件,选择单片机型号为STC89C52RC,选择正确的串口号,加载程序文件,给单片机上电后,HEX文件下载编程成功。
4.2硬件调试
1.依次按下矩阵键盘上定义的数字键“0~9”,经检测数码管都可以正确显示。
2.依次进行不同算法“+”,“—”,“*”,“/”,经检测可以正常进行运算。
3.输入某个数,按下清零键,屏幕无显示,可以实现清零功能。
4.3调试结果
(1)编程软件Keil软件调试结果如图4.1:
图4.1Keil软件调试结果
(2)烧写软件ISP-STC调试结果如图4.2:
图4.2ISP-STC调试结果
(3)89C51实验板硬件调试结果:
总结
本次课程设计是理论和实践的结合,首先通过该学期理论课的学习,对单片机的硬件构成有了初步的理解,包括其结构与原理,指令系统,定时/计数器和扩展接口的使用,通过这次课程设计,在实践中重复利用所学运用,验证理论知识,从中我很多收获和体会,以及自顶向下,逐步细化的工程设计方法,通过一步步分解任务设计,达到了设计要求。
途中当然遇到了很多困难,但也增强了查阅书籍,手册,图表和文献资料的能力,同时通过独立思考,深入研究有关问题,学会自己分析解决问题的方法解决了一些问题。
在这次课程设计中我充分感受到理论和实践的差距,一个人光有理论知识是远远不够的,在进行实践,面对硬件完全是一无所措,对硬件的学习完全是不同于理论学习的,其中硬件调试,ISP-STC烧写操作,都是课堂上没有讲过的,需要重新学习。
设计过程中也会发现自己对理论知识的某些方面不是那么牢固,暴露了自己的很多不足,锻炼了自己的理论联系实际的能力与实际动手能力,以后应该多进行一些实践来不断提升自己的能力。
参考文献
[1]张迎新.单片微型计算机原理-S、应用及接口技术[M].北京:
国防工业出版社.
[2]阎石.数字电子技术基础[M].北京:
高等教育出版社.
附录A:
整体电路图
附录B:
程序代码
#include
#defineucharunsignedchar
uchara0=16,b0=16,c0=16,d0=16,e0=16,f0=16,wei,temp,key,i,j,k;
ucharjia,jian,cheng,chu,dengyu,jia0,jian0,cheng0,chu0,qingling;
uchars0,s1,s2,s3,s4,s5;//参加运算的各个位
unsignedlongqian,hou;//定义参于运算的第一个数和第二个数。
sbitdula=P2^6;
sbitwela=P2^7;
sbitbeep=P2^3;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
voiddelay(uchari)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddisplay(uchara,ucharb,ucharc,uchard,uchare,ucharf)
{
dula=0;
P0=table[a];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[b];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[c];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[d];
dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=table[e];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=table[f];
dula=1;
dula=0;
P0=0xdf;
wela=1;
wela=0;
delay(5);
}
voidkeyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
key=0;
wei++;
break;
case0xde:
key=1;
wei++;
break;
case0xbe:
key=2;
wei++;
break;
case0x7e:
key=3;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
key=4;
wei++;
break;
case0xdd:
key=5;
wei++;
break;
case0xbd:
key=6;
wei++;
break;
case0x7d:
key=7;
wei++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
key=8;
wei++;
break;
case0xdb:
key=9;
wei++;
break;
case0xbb:
qingling=1;
//key=10;
//wei++;
break;
case0x7b:
dengyu=1;
//key=11;
//wei++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
if(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
jia=1;
//key=12;
//wei++;
break;
case0xd7:
jian=1;
break;
case0xb7:
cheng=1;
break;
case0x77:
chu=1;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}
voiddisplay0()
{
if(key!
=20)
{
switch(wei)
{
case1:
a0=key;
b0=16;
c0=16;
d0=16;
e0=16;
f0=16;
break;
case2:
b0=key;
c0=16;
d0=16;
e0=16;
f0=16;
break;
case3:
c0=key;
d0=16;
e0=16;
f0=16;
break;
case4:
d0=key;
e0=16;
f0=16;
break;
case5:
e0=key;
f0=16;
break;
case6:
f0=key;
//wei=0;
break;
}
key=20;
}
display(a0,b0,c0,d0,e0,f0);
if(a0!
=16)s5=a0;
if(b0!
=16)s4=b0;
if(c0!
=16)s3=c0;
if(d0!
=16)s2=d0;
if(e0!
=16)s1=e0;
if(f0!
=16)s0=f0;
}
voidmain()
{uchargongneng,yunsuan;
while
(1)
{
keyscan();
gongneng=jia|jian|cheng|chu|dengyu|qingling;
if(gongneng==0)
{
display0();
}
else
{yunsuan=jia|jian|cheng|chu;
if(yunsuan)
{
a0=16;
b0=16;
c0=16;
d0=16;
e0=16;
f0=16;
//wei=0;
if(jia)
{jia=0;jia0=1;jian0=0;cheng0=0;chu0=0;}
if(jian)
{jian=0;jia0=0;jian0=1;cheng0=0;chu0=0;}
if(cheng)
{cheng=0;jia0=0;jian0=0;cheng0=1;chu0=0;}
if(chu)
{chu=0;jia0=0;jian0=0;cheng0=0;chu0=1;}
switch(wei)
{
case6:
qian=s5*100000+s4*10000+s3*1000+s2*100+s1*10+s0;break;
case5:
qian=s5*10000+s4*1000+s3*100+s2*10+s1;break;
case4:
qian=s5*1000+s4*100+s3*10+s2;break;
case3:
qian=s5*100+s4*10+s3;break;
case2:
qian=s5*10+s4;break;
case1:
qian=s5;break;
}
wei=0;
s0=0;s1=0;s2=0;s3=0;s4=0;s5=0;
display(a0,b0,c0,d0,e0,f0);
//P1=0x55;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 89 C51 计算器 设计