计算器实验报告.docx
- 文档编号:30324210
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:21
- 大小:73.57KB
计算器实验报告.docx
《计算器实验报告.docx》由会员分享,可在线阅读,更多相关《计算器实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
计算器实验报告
计算器实验报告
一,实验目的
1、学习按键扫描及LED数码管显示的设计方法。
2、设计任务及要求利用实验平台上8个LED数码管,设计可以通过键盘输入,并能显示输入相对应的数字、能够进行加,减,乘,除准确的基本运算、能够进行3位或3位的以上的乘,除运算.
二,实验要求
基本要求:
1、可以通过键盘输入,并能显示输入相对应的数字.
2、能够进行加,减,乘,除准确的基本运算、
3、能够进行3位或3位的以上的乘,除运算.
三,实验基本原理
利用单片机实现简单计算器的加减乘除,通过键盘输入数据并在数码管上显示出数据,然后按下加减乘除任意一个键,再输入第二个数并显示,再按下等于号时,执行第一次输入的数与第二个数的加减乘除函数,并显示出最终结果。
四,实验设计分析
针对要实现的功能,采用AT89S52单片机进行设计,AT89S52单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为按键扫描、数码管显示输入数据、加减乘除函数,延时程序等。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二部分是硬件部分:
依据想要的功能分块设计设计,比如输入需要键盘扫描,输出需要显示驱动电路和数码管电路等。
第三部分是软件部分:
先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第四部分是软件画图部分:
设计好电路后进行画图,包括电路图和仿真图的绘制。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:
连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!
五,实验要求实现
A.电路设计
1.整体设计
此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:
显示电路用8个共阴数码管分别显示,个位、十位、百位、千位、万位等,通过动态扫描进行输入数据,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。
单片机采用AT89S52系列,这种单片机应用简单。
电路的总体设计框架如下:
B.程序设计
B.程序总体设计
本实验用汇编程序完成.
1、键扫程序的过程为:
开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。
按键流程图:
2、算术运算程序的过程为:
先输入第一个数据,判断输入的运算符是+、-、*、/中的哪一个,若是+或-,则要判断运算结果是否溢出,溢出则显示错误信息,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就显示错误信息,不为零则显示运算结果,若是-,则直接显示运算结果。
算数运算流程图:
结合电路图,程序设计的整体思路为:
接通电源,数码管显示零。
1.按1到9键在个位上显示1到9,当再按下0到9这十个按键时按下的第一个数向前移一位,以此类推;
2、当按下加减乘除四个按键其中一个时将第一次的数据保存起来;
3、输入第二个数据;
4、按等于号,执行加减乘除函数,显示出最终计算结果
B.2.3主程序
主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序,该段程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uintnum,temp,sw,wan,qian,bai,shi,ge,flag,k=0;
uintshu=1,suo=0,key=0;
doublenum1=0,shu3=0,shu1=0,shu2=0;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
ucharkeyscan();
voiddisplay(uint);
voidmain()
{
num=17;
P0=0x00;
P2=0xff;
num1=0;
while
(1)
{
if(suo==0)
{
keyscan();
display(num1);
}
if(suo==1)
{
P0=0x00;
num1=0;
suo=0;
}
}
}
voiddisplay(intnum1)
{
if(num1<0)
{
num1=0-num1;
bai=num1/100;
shi=num1%100/10;
ge=num1%10;
if(bai==0&&shi==0)
{
P2=0xfd;
P0=0x40;
delay
(1);
P2=0xfe;
P0=table[ge];
delay
(1);
}
if(bai==0&&shi!
=0)
{
P2=0xfb;
P0=0x40;
delay
(1);
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfe;
P0=table[ge];
delay
(1);
}
if(bai!
=0)
{
P2=0xf7;
P0=0x40;
delay
(1);
P2=0xfe;
P0=table[ge];
delay
(1);
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfb;
P0=table[bai];
delay
(1);
}
}
if(num1>=0)
{
sw=num1/100000;
wan=num1%100000/10000;
qian=num1%10000/1000;
bai=num1%1000/100;
shi=num1%100/10;
ge=num1%10;
if(sw==0&&wan==0&&qian==0&&bai==0&&shi==0)
{
P2=0xfe;
P0=table[ge];
delay
(1);
}
if(sw==0&&wan==0&&qian==0&&bai==0&&shi!
=0)
{
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfe;
P0=table[ge];
delay
(1);
}
if(sw==0&&wan==0&&qian==0&&bai!
=0)
{
P2=0xfe;
P0=table[ge];
delay
(1);
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfb;
P0=table[bai];
delay
(1);
}
if(sw==0&&wan==0&&qian!
=0)
{
P2=0xfe;
P0=table[ge];
delay
(1);
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfb;
P0=table[bai];
delay
(1);
P2=0xf7;
P0=table[qian];
delay
(1);
}
if(sw==0&&wan!
=0)
{
P2=0xfe;
P0=table[ge];
delay
(1);
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfb;
P0=table[bai];
delay
(1);
P2=0xf7;
P0=table[qian];
delay
(1);
P2=0xef;
P0=table[wan];
delay
(1);
}
if(sw!
=0)
{
P2=0xfe;
P0=table[ge];
delay
(1);
P2=0xfd;
P0=table[shi];
delay
(1);
P2=0xfb;
P0=table[bai];
delay
(1);
P2=0xf7;
P0=table[qian];
delay
(1);
P2=0xef;
P0=table[wan];
delay
(1);
P2=0xdf;
P0=table[sw];
delay
(1);
}
}
}
ucharkeyscan()
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);//消抖动
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xee:
num=1,k++;
break;
case0xde:
num=2,k++;
break;
case0xbe:
num=3,k++;
break;
case0x7e:
num=4,k++;
break;
}
while(temp!
=0xf0)
{
temp=P3;//松开判断
temp=temp&0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xed:
num=5,k++;
break;
case0xdd:
num=6,k++;
break;
case0xbd:
num=7,k++;
break;
case0x7d:
num=8,k++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xeb:
num=9,k++;
break;
case0xdb:
num=10,k++;
break;
case0xbb:
num=11,k++;
break;
case0x7b:
num=12,k++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P3;
switch(temp)
{
case0xe7:
num=13,k++;
break;
case0xd7:
num=14,k++;
break;
case0xb7:
num=15,k++;
break;
case0x77:
num=16,k++;
break;
}
while(temp!
=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}
if(shu==k)
{shu++;
if(num<=10)
{
num1=10*num1+num-1;
}
}
if(num==13)//+
{
shu1=num1;
suo=1;
key=1;
num=20;
}
if(num==14)//-
{
suo=1;
shu1=num1;
key=2;
num=20;
}
if(num==15)//*
{
suo=1;
shu1=num1;
key=3;
num=20;
}
if(num==16)///
{
suo=1;
shu1=num1;
key=4;
num=20;
}
if(num==12)//=
{
shu2=num1;
num=20;
if(key==1)
{
shu3=shu1+shu2;
num1=shu3;
suo=0;
}
if(key==2)
{
shu3=shu1-shu2;
num1=shu3;
suo=0;
}
if(key==3)
{
shu3=shu1*shu2;
num1=shu3;
suo=0;
}
if(key==4)
{
shu3=shu1/shu2;
num1=shu3;
suo=0;
}
}
returnnum;
}
2、仿真原理图:
五.实验总结及感想
早在我们得知我们这个小学期要完成8道单片机编程的题目的时候,全组人都是一片茫然。
我们面对的是一个完全未遇到过的领域,里面不仅仅包括单片机编程,还要求我们掌握单片机的工作原理,了解单片机各个管脚的功能,通过编程去控制单片机,使各种组件能够实现所要求的功能。
在完成了各个部件的焊接任务以后,我们对着这一堆不知道该怎么组合起来的东西,心想:
这到底是干嘛用的啊?
随之而来的是老师布置的任务,要求自学单片机编程,在一个月的时间里完成这些任务。
分完组以后,组长就马上召集我们开会,明确表示我们的任务到底有多艰巨,我们必须全身心的投入进去才能完成。
于是组长在布置好任务以后,我们就投入了单片机的海洋里了。
在这一个月里,我们自学会了利用C语言的单片机编程软件的使用,学会了安装烧录软件让电脑能识别单片机,学会了利用电脑去模拟单片机的工作。
不过,在学习的过程中我们也发现了一些问题,下面就是我们对问题的总结:
1、按键扫描输入数据;
2、保存第一个数,当输入第二个数时会读取不到第一个数等问题
在经过这一个多月的学习实践以后,我们掌握了单片机的基本知识,为以后的进一步学习打下了深厚的基础,对以后的学习起到了很好的铺垫作用。
同时,也加强了我们的动手能力,在实行应试教育的今天,能够有一个如此好的机会去锻炼我们的动手能力实属不易,强化我们以后步入社会的生存能力,让我们受益匪浅。
另一方面,我们在这次的设计任务中,实行团队的运作,这次能完成任务,离不开我们良好的团队运作,除了组长的优秀带头作用以外,组员的团结合作也是一个重要因素。
我们组采取能力强的同学带能力相对弱的同学的方法,起到了非常好的效果,这种团结合作的精神在社会上是必不可少的。
总的而言,这次的训练是一次我们步入社会之前的一次很好的锻炼。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算器 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)