单片机简易计算器课程设计.docx
《单片机简易计算器课程设计.docx》由会员分享,可在线阅读,更多相关《单片机简易计算器课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
单片机简易计算器课程设计
引言
说起计算器,值得我们骄傲的是,最早的计算工具诞生在中国。
中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。
这种算筹多用竹子制成,也有用木头,兽骨充当材料的。
约二百七十枚一束,放在布袋里可随身携带。
直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的"纳皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本任务是个简易的两位数的四则运算,程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。
本任务重在设计构思与团队合作,使得我们用专业知识、专业技能分析和解决问题全面系统的锻炼。
随着半导体集成工艺的不断发展,单片机的集成度将更高、体积将更小、功能将更强。
在单片机家族中,80C51系列是其中的佼佼者,加之Intel公司将其MCS–51系列中的80C51内核使用权以专利互换或出售形式转让给全世界许多著名IC制造厂商,如Philips、NEC、Atmel、AMD、华邦等,这些公司都在保持与80C51单片机兼容的基础上改善了80C51的许多特性。
这样,80C51就变成有众多制造厂商支持的、发展出上百品种的大家族,现统称为80C51系列。
80C51单片机已成为单片机发展的主流。
专家认为,虽然世界上的MCU品种繁多,功能各异,开发装置也互不兼容,但是客观发展表明,80C51可能最终形成事实上的标准MCU芯片。
事实上单片机是世界上数量最多的计算机。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
而个人电脑中也会有为数不少的单片机在工作。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!
单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可......用它来做一些控制电器一类不是很复杂的工作足矣了。
我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!
......它主要是作为控制部分的核心部件。
设计方案及原理
1.首先赋予显示缓冲初始值‘0000’,并把数据存储单元清零。
2.主程序调用键盘扫描子程序,判断键值,是数字第一次直接赋予23H单元,如是第二次输入数字,则把第一次值乘十后与第二次值相加,结果存储到23H单元,并R4计数2次,表示已输入两位,扫描键值时就不在赋值和显示。
等待运算符号的按下,按下等于号就直接与零计算并显示,如加减乘除就R5加一并把R4清零,表示可以输入下一操作数,与第一次相同,并等待等于键按下。
清零键则不管在任何情况下都清零,相当与软复位。
3.在扫描完键盘后,调用数据显示转换子程序,并选择,由于本任务是两位四则运算,只有乘法中结果会超出FFH的范围,在此就是选择处理方式,超出范围则跳过数据显示转换子程序,未超出则调用数据显示转换子程序,两种选择都是要把值转换为七段码。
4.调用数码管动态显示子程序,显示数值,重新循环。
硬件系统设计
1、LED接口电路
简易计算器需要2位8段码LED显示电路。
用8031单片机经8255A扩展2位8段码LED显示器,用8255A的A口作为段码(字形代码)数据口,PB0和PB1作为位控制端口。
在位控制口加集电极开路的反相高压驱动器74LS06以提供驱动LED显示器所需的足够大的电流,然后接至各数码显示器的共阴极端。
同理,在段码数据口集电极开路的正相高压驱动器74LS07提供足够大的电流,然后接到数码显示器的各段。
逻辑电路结构如下:
2、键盘接口电路
简易计算器需要4*4的行列式键盘。
用8031单片机经8255A扩展4*4行列式键盘,8255A的B口和C口用于扩展键盘接口,B口高4位作为输出口,C口低4位作为输入口。
逻辑电路结构如下:
3、计算器逻辑电路图
将LED接口电路和键盘接口电路结合到一起就是简易计算器的逻辑电路图,如下:
三、软件设计
1、LED显示程序设计
LED显示器由七段发光二极管组成,排列成8字形状,因此也成为七段LED显示器,器排列形状如下图所示:
为了显示数字或符号,要为LED显示器提供代码,即字形代码。
七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。
简易计算器用到的数字0~9的共阴极字形代码如下表:
0~9七段数码管共阴级字形代码
显示字型
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位LED显示的程序框图如下:
2、读键输入程序设计
为了实现键盘的数据输入功能和命令处理功能,每个键都有其处理子程序,为此每个键都对应一个码——键码。
为了得到被按键的键码,现使用行扫描法识别按键。
其程序框图如下:
3、主程序设计
(1)数值送显示缓冲程序设计
简易计算器所显示的数值最大位两位。
要显示数值,先判断数值正负,如果是负值,则符号位显示“-”,然后将数值除以10,余数送显最最低位,判断商是否为0,若为0则返回,若不为0,则将商除以10,将余数送显高位。
程序框图如下:
(2)运算主程序设计
首先初始化参数,送LED低位显示“0”,高位不显示。
然后扫描键盘看是否有键输入,若有,读取键码。
判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=”),是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。
运算主程序框图如下所示:
4、简易计算器源程序
OUTBITequ07FFDh;位控制口
OUTSEGequ07FFCh;段控制口
INequ07FFEh;键盘读入口
data1equ70h
data2equ71h
dizhi1equ72h
dizhi2equ73h
LEDBufequ60h;显示缓冲
ljmpStart
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
Delay:
;延时子程序
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
DisplayLED:
movr0,#LEDBuf
movr1,#2;共2个八段管
movr2,#00000010b;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
movdptr,#OUTBIT
mova,r2
movx@dptr,a;显示一位八段管
movr6,#1
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
ret
TestKey:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;输出线置为0
movdptr,#IN
movxa,@dptr;读入键状态
cpla
anla,#0fh;高四位不用
ret
KeyTable:
;键码定义
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
GetKey:
movdptr,#OUTBIT
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#4
KLoop:
mova,r1;找出键所在列
cpla
movx@dptr,a
cpla
rra
movr1,a;下一列
movxa,@r0
cpla
anla,#0fh
jnzGoon1;该列有键入
djnzr2,KLoop
movr2,#0ffh;没有键按下,返回0ffh
sjmpExit
Goon1:
movr1,a;键值=列X4+行
mova,r2
deca
rla
rla
movr2,a;r2=(r2-1)*4
mova,r1;r1中为读入的行值
movr1,#4
LoopC:
rrca;移位找出所在行
jcExit
incr2;r2=r2+行值
djnzr1,LoopC
Exit:
mova,r2;取出键码
movdptr,#KeyTable
movca,@a+dptr
movr2,a
WaitRelease:
movdptr,#OUTBIT;等键释放
clra
movx@dptr,a
movr6,#10
callDelay
callTestKey
jnzWaitRelease
mova,r2
ret
Start:
movsp,#40h
movLEDBuf+0,#0
movLEDBuf+1,#03fh
movdptr,#7FFFh
mova,#89h
movx@dptr,a
MLoop:
callDisplayLED;显示
callTestKey;有键入?
jzMLoop;无键入,继续显示
callGetKey;读入键码
Jisuan:
movr3,a
cjner3,#0fh,Qita;判断是否为清零键?
movr3,#00h;清零
movr4,#00h
movr5,#00h
movdata1,#00h
movdata2,#00h
movdizhi1,#00h
movdizhi2,#00h
movLEDBuf+0,#0
movLEDBuf+1,#03fh
ljmpMLoop
Qita:
clrc
cjner3,#0ah,follow;判断是数字键还是功能键?
follow:
jcShuzi
ljmpGn
Shuzi:
mova,r4;判断是否已有运算符输入,没有就将数值存在
jnzShuzi2data1,有就将数值存在data2
mova,r3
movdata1,a
ljmpXs;显示第一次输入的数值
Shuzi2:
mova,r3
movdata2,a
ljmpXs;显示第二次输入的数值
Gn:
movr4,#01h;将01h给r4,说明已有运算符输入
cjner3,#0eh,Ja;判断键值是否为“=”?
movr4,#00h;将r4清零
mova,dizhi1;执行“=”
movdph,a
mova,dizhi2
movdpl,a
mova,#00h
jmp@a+dptr;转到本次输入的算法程序
Ja:
cjner3,#0ah,Jn;若键值为“+”则将“+”的程序首地址存在
movdptr,#Jiadizhi1和dizhi2中
mova,dph
movdizhi1,a
mova,dpl
movdizhi2,a
ljmpMLoop
Jn:
cjner3,#0bh,Ce;若键值为“-”则将“-”的程序首地址存
movdptr,#Jiandizhi1和dizhi2中
mova,dph
movdizhi1,a
mova,dpl
movdizhi2,a
ljmpMLoop
Ce:
cjner3,#0ch,Cu;若键值为“*”则将“*”的程序首地址存在
movdptr,#Chengdizhi1和dizhi2中
mova,dph
movdizhi1,a
mova,dpl
movdizhi2,a
ljmpMLoop
Cu:
cjner3,#0dh,Zhuan;若键值为“/”则将“/”的程序首地址存在
movdptr,#chudizhi1和dizhi2中
mova,dph
movdizhi1,a
mova,dpl
movdizhi2,a
Zhuan:
ljmpMLoop
Jia:
mova,data1;加法程序
adda,data2
ljmpXs
Jian:
mova,data1;减法程序
subba,data2
ljmpXs
Cheng:
mova,data1;乘法程序
movb,data2
mulab
ljmpXs
Chu:
mova,data1;除法程序
movb,data2
divab
Xs:
movb,#10;显示个位数字
divab
movr5,a
mova,b
movdptr,#LEDMap
movca,@a+dptr
movLEDBuf+1,a
mova,r5
First:
cjnea,#0,Next
ljmpMLoop;运算完后继续扫描键盘
Next:
movb,#10;显示十位数字
divab
movr5,a
mova,b
movdptr,#LEDMap
movca,@a+dptr
movLEDBuf+0,a
mova,r5
ljmpFirst
end
硬件连线图
总结
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。
我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。
怎么才能找到课堂所学与实际应用的最佳结合点?
怎样让自己的业余更接近专业?
怎样让自己的计划更具有序性,而不会忙无一用?
这都是我们所要考虑和努力的。
这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。
这次课程设计通过我们小组的努力终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
[1]刘和平,刘跃.单片机原理及应用.重庆:
重庆大学出版社,2004
[2]杨西明,朱骐.单片机编程与入门.北京:
机械工业出版社,2004
[3]陈明荧,89C51单片机课程设计实训教材.北京:
清华大学出版社,2004
[4]刘瑞新,单片机原理及应用教程.北京:
机械工业出版社,2003