单片机简易计算器设计_第1页
单片机简易计算器设计_第2页
单片机简易计算器设计_第3页
单片机简易计算器设计_第4页
单片机简易计算器设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、设计规定1.设计4*4的键盘,其中10个数字键0~9,其余6个为“+”“-”“*”“/”“=”和“C”2.设计2位LED接口电路3.实现1位数的简朴运算二、硬件系统设计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七段数码管共阴级字形代码显示字型gfedcba段码001111113fh1000011006h210110115bh310011114fh4110011066h511011016dh611111017dh7000011107h811111117fh911011116fh2位LED显示的程序框图如下:2、读键输入程序设计为了实现键盘的数据输入功能和命令解决功能,每个键都有其解决子程序,为此每个键都相应一个码——键码。为了得到被按键的键码,现使用行扫描法辨认按键。其程序框图如下:3、主程序设计(1)数值送显示缓冲程序设计简易计算器所显示的数值最大位两位。要显示数值,先判断数值正负,假如是负值,则符号位显示“-”,然后将数值除以10,余数送显最最低位,判断商是否为0,若为0则返回,若不为0,则将商除以10,将余数送显高位。程序框图如下:(2)运算主程序设计一方面初始化参数,送LED低位显示“0”,高位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键(“+”“-”“*”“/”“=”),是数值键则送LED显示并保存数值,是清零键则做清零解决,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。运算主程序4、简易计算器源程序OUTBITequ07FFDh;位控制口OUTSEGequ07FFCh;段控制口INequ07FFEh;键盘读入口data1equ70hdata2equ71hdizhi1equ72hdizhi2equ73hLEDBufequ60h;显示缓冲ljmpStartLEDMAP:;八段管显示码db3fh,06h,5bh,4fh,66h,6dh,7dh,07hdb7fh,6fh,77h,7ch,39h,5eh,79h,71hDelay:;延时子程序movr7,#0DelayLoop:djnzr7,DelayLoopdjnzr6,DelayLoopretDisplayLED:movr0,#LEDBufmovr1,#2;共2个八段管movr2,#00000010b;从左边开始显示Loop:movdptr,#OUTBITmova,#0movx@dptr,a;关所有八段管mova,@r0movdptr,#OUTSEGmovx@dptr,amovdptr,#OUTBITmova,r2movx@dptr,a;显示一位八段管movr6,#1callDelaymova,r2;显示下一位rramovr2,aincr0djnzr1,LoopretTestKey:movdptr,#OUTBITmova,#0movx@dptr,a;输出线置为0movdptr,#INmovxa,@dptr;读入键状态cplaanla,#0fh;高四位不用retKeyTable:;键码定义db0dh,0ch,0bh,0ahdb0eh,03h,06h,09hdb0fh,02h,05h,08hdb00h,01h,04h,07hGetKey:movdptr,#OUTBITmovP2,dphmovr0,#Low(IN)movr1,#00100000bmovr2,#4KLoop:mova,r1;找出键所在列cplamovx@dptr,acplarramovr1,a;下一列movxa,@r0cplaanla,#0fhjnzGoon1;该列有键入djnzr2,KLoopmovr2,#0ffh;没有键按下,返回0ffhsjmpExitGoon1:movr1,a;键值=列X4+行mova,r2decarlarlamovr2,a;r2=(r2-1)*4mova,r1;r1中为读入的行值movr1,#4LoopC:rrca;移位找出所在行jcExitincr2;r2=r2+行值djnzr1,LoopCExit:mova,r2;取出键码movdptr,#KeyTablemovca,@a+dptrmovr2,aWaitRelease:movdptr,#OUTBIT;等键释放clramovx@dptr,amovr6,#10callDelaycallTestKeyjnzWaitReleasemova,r2retStart:movsp,#40hmovLEDBuf+0,#0movLEDBuf+1,#03fhmovdptr,#7FFFhmova,#89hmovx@dptr,aMLoop:callDisplayLED;显示callTestKey;有键入?jzMLoop;无键入,继续显示callGetKey;读入键码Jisuan:movr3,acjner3,#0fh,Qita;判断是否为清零键?movr3,#00h;清零movr4,#00hmovr5,#00hmovdata1,#00hmovdata2,#00hmovdizhi1,#00hmovdizhi2,#00hmovLEDBuf+0,#0movLEDBuf+1,#03fhljmpMLoopQita:clrccjner3,#0ah,follow;判断是数字键还是功能键?follow:jcShuziljmpGnShuzi:mova,r4;判断是否已有运算符输入,没有就将数值存在jnzShuzi2data1,有就将数值存在data2mova,r3movdata1,aljmpXs;显示第一次输入的数值Shuzi2:mova,r3movdata2,aljmpXs;显示第二次输入的数值Gn:movr4,#01h;将01h给r4,说明已有运算符输入cjner3,#0eh,Ja;判断键值是否为“=”?movr4,#00h;将r4清零mova,dizhi1;执行“=”movdph,amova,dizhi2movdpl,amova,#00hjmp@a+dptr;转到本次输入的算法程序Ja:cjner3,#0ah,Jn;若键值为“+”则将“+”的程序首地址存在movdptr,#Jiadizhi1和dizhi2中mova,dphmovdizhi1,amova,dplmovdizhi2,aljmpMLoopJn:cjner3,#0bh,Ce;若键值为“-”则将“-”的程序首地址存movdptr,#Jiandizhi1和dizhi2中mova,dphmovdizhi1,amova,dplmovdizhi2,aljmpMLoopCe:cjner3,#0ch,Cu;若键值为“*”则将“*”的程序首地址存在movdptr,#Chengdizhi1和dizhi2中mova,dphmovdizhi1,amova,dplmovdizhi2,aljmpMLoopCu:cjner3,#0dh,Zhuan;若键值为“/”则将“/”的程序首地址存在movdptr,#chudizhi1和dizhi2中mova,dphmovdizhi1,amova,dplmovdizhi2,aZhuan:ljmpMLoopJia:mova,data1;加法程序adda,data2ljmpXsJian:mova,data1;减法程序subba,data2ljmpXsCheng:mova,data1;乘法程序movb,data2mulabljmpXsChu:mova,data1;除法程序movb,data2divabXs:movb,#10;显示个位数字divabmovr5,amova,bmovdptr,#LEDMapmovca,@a+dptrmovLEDBuf+1,amova,r5First:cjnea,#0,NextljmpMLoop;运算完后继续扫描键盘Next:movb,#10;显示十位数字divabmovr5,amova,bmovdptr,#LEDMapmovca,@a+dptrmovLEDBuf+0,amova,r5ljmpFirstend四、系统调试与存在的问题1.在打开一个程序要进行编译运营时,要在项目中打开它,而不是单单以一个文献的形式打开。2.打开WAVE6000后,需要对仿真器进行设立,然后才干用其对所编程序进行编译并执行。3.实验箱上提供的6位的LED显示器和4*6的键盘,而简易计算器只用两位LED显示器和4*4键盘,所以必须用软件方法把前4位LED和键盘后2列屏蔽掉。4.十位上的LED显示管有数字时才显示,没有数字时不显示,而不是显示“0”,做清零操作后LED显示器个位显示“0五、心得体会课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。

我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。怎么才干找到课堂所学与实际应用的最佳结合点?如何让自己的业余更接近专业?如何让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,并且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简朴的编程。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才干真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。同时在设计的过程中发现了自己的局限性之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。这次课程设计通过我们小组的努力终于顺利完毕了,在设计中碰到了很多编程问题,最后在老师的辛勤指导下,终于迎刃而解,在此我表达感谢!同时,对给过我帮助的所有同学和各位指导老师再次表达忠心的感谢!参考文献

#include<reg51.h>

signedlongA1,B1,RESULT;

charC=0,F=0,STATE=0,ANSWER=0,KEY=0;

//定义标志位,F=0存第一个数,F=1存第二个数,C标志显示初值与否

charxuhao1=0,xuhao2=0;xuhao3=0;

char

SHU1[8]={0},SHU2[8]={0},SHU3[8],CHUZHI[1]={0};

charcodebiao[4][4]={{1,4,7,0},{2,5,8,'R'},{3,6,9,'='},{'+','-','*','/'}};

charcode

DUANMA[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//

voidDELAY(chart)

{

inta=0;

for(t;t>=0;t--)

for(a;a<=100;a++);

}

//

CLEAR()

{

chari=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;i<8;i++)

{

SHU1[i]=0;

SHU2[i]=0;

SHU3[i]=0;

}

}

//

charSAOMIAO()

{

P1=0x0f;

if(P1!=0x0f)

{

DELAY(1);

if(P1!=0x0f)return(1);

elsereturn(0);

}

return(0);

}

//

signedlongZHUANHUAN(charH[8],charX)

{

chari;signedlongM=0;

X=X-1;

for(i=0;i<=X;i++)

{

M=M*10+H[i];

}

return(M);

}

//

voidFANZHUANHUAN(signedlongM)

{

charN,a,b,i;

xuhao3=0;

for(;M>0;)

{

N=M;

M=(M/10);

SHU3[xuhao3]=(char)N;

xuhao3=xuhao3+1;

}

b=xuhao3-1;

//if(xuhao3>=8);

for(i=0;i<=b/2;i++)

//为满足DISPLAY()函数调用的条件,SHU3中的数要按SHU1,SHU2中的

{

//存储方式存储,即,最高位数字存入第一个数组单元中

a=SHU3[i];

SHU3[i]=SHU3[b-i];

SHU3[b-i]=a;

}

}

//

signedlongJIA(signedlongX,signedlongY)

{

signedlongresult;

result=X+Y;

return(result);

}

//

signedlongJIAN(signedlongX,signedlongY)

{

signedlongresult;

result=X-Y;

return(result);

}

//

signedlongCHENG(signedlongX,signedlongY)

{

signedlongresult;

result=X*Y;

return(result);

}

//

signedlongCHU(signedlongX,signedlongY)

{

signedlongresult;

result=X/Y;

return(result);

}

//

voidinter0(void)interrupt0using0

{

charhang,lie;

switch(P1)

{

case0x0e:lie=0;break;

case0x0d:lie=1;break;

case0x0b:lie=2;break;

case0x07:lie=3;break;

}

P1=0xf0;

switch(P1)

{

case0xe0:hang=0;break;

case0xd0:hang=1;break;

case0xb0:hang=2;break;

case0x70:hang=3;break;

}

KEY=biao[hang][lie];C=1;

//查表获得按下的键值,按键标志位置1

if(KEY>=0&&KEY<=9)

//按下的是数字键则进行相应存储

{

if(F==0)

//若没有运算符按下,键值存入SHU1中

{

SHU1[xuhao1]=KEY;

xuhao1=xuhao1+1;

}

else

if(F==1)

//若有运算符按下,键值存入SHU2中

{

SHU2[xuhao2]=KEY;

xuhao2=xuhao2+1;

}

}

elseif((KEY=='+')||(KEY=='-')||(KEY=='*')||(KEY=='/')||(KEY=='=')||(KEY=='R'))

{

F=1;

//有运算符按下,运算标志位置1

if(KEY=='+'){STATE=1;C=0;}

elseif(KEY=='-'){STATE=2;C=0;}

//判断运算符,且相应标记位赋值

elseif(KEY=='*'){STATE=3;C=0;}

elseif(KEY=='/'){STATE=4;C=0;}

elseif(KEY=='R')CLEAR();

//复位键按下,调用复位函数,所有标志位,存储数组清零

elseif(KEY=='=')ANSWER=1;

}

}

//

voidDISPLAY(charSHU[8],charxuhao)

{

chari;charj;

chara=0xfe;

i=xuhao-1;

if(i<8)

{

for(i;i>=0;i--)

//动态显示缓冲单元中的数

{

P2=a;

j=SHU[i];

P0=DUANMA[j];

DELAY(3);

a=(a<<1)+1;

}

}

elseif((i+1)>=8)//假如输入超过8个数,所有显示8以示错误//

{

for(i;i>0;i--)

{

P2=a;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论