基于单片机的计算器课程设计报告.docx
- 文档编号:3981634
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:22
- 大小:218.71KB
基于单片机的计算器课程设计报告.docx
《基于单片机的计算器课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机的计算器课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
基于单片机的计算器课程设计报告
昆明理工大学
课程设计报告
设计名称:
单片机计算器课程设计
姓名:
学号:
**********XXX
专业班级:
测控技术和仪器1111
院(系):
信息工程
设计时间:
2013年6月21日
设计地点:
昆明理工大学德信楼
一、题目……………………………………………………………………………
二、任务和要求…………………………………………………
三、课程设计及整体方框图…………………………………………………
a..总体设计思路简述····················································
b.硬件设计简述························································
c.软件设计简述························································
d.程序主流程图························································
四、课程设计原理分析及相关知识概述…………………………………………
五、结论……………………………………………………………………………
六、体会和收获……………………………………………………………………
附件:
1、源程序代码(根据需要选择)……………………………………………
2、整体电路原理图(根据需要选择)………………………………………
2、元件表(根据需要选择)…………………………………………………
3、实验操作(根据需要选择)…………………………………………………
一、题目
使用单片机芯片AT89C51、LCD1602液晶显示屏,用KEILuVision和porteus仿真软件实现简易计算器的仿真和调试。
设计制作一个计算器,KEYPAD4*4键盘输入,用LCD显示计算数值及结果。
二、任务和要求
要求计算器能实现加减乘除四种运算,具体如下:
1.加法:
多位数加法,计算结果不超过8位则显示计算。
2.减法:
多位整数减法,计算结果可以算小于零则显示计算。
3.乘法:
多位整数乘法,计算结果若超过8位则显示计算。
4.除法:
整数除法,可以算出小数点3位。
5.有清除功能
三、课程设计简述及整体方框图
1.总体设计思路简述
按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成,电路系统构成框图如图1.1所示。
主控芯片使用AT89C51单片机,功能更强,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场使用最多。
键盘电路采用4*4矩阵键盘电路。
显示模块采用1枚LCD1602和RES---V构成器件构成。
2.硬件设计简述
单片机最小系统就是支持主芯片正常工作的最小电路部分,包括运算器.控制器.存储器,输入输出设备构成.
主控芯片选取AT89C51芯片,因其具有良好的性能及稳定性,价格便宜使用方便。
晶振选取11.0592MHz,晶振旁电容选取22pF。
采用按键清零电路,KEYPAD4*4C.
键盘接口电路
计算器所需按键有:
数字键:
’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’
功能键:
’+’,’-‘,’*’,’/’,’=’,’C(清零)’
共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P3.0~P3.7,这样扫描P3口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P3口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。
LCD显示电路
采用LCD对计算数据和结果的显示,动态扫描。
为了实现LCD的动态显示,P0口输出显示值,通过P0口的二进制代码送到LCD进行显示。
3.软件设计简述
键盘扫描子程序设计
要进行数据的计算就必须先进行数据的输入,也就必须确定按键输入的数值是什么,这就需要对键盘进行扫描,从而确定究竟是哪个键按下。
对于键盘的扫描,这里采用行列扫描的方法来完成对键盘的扫描。
原理就是先确定按键在哪一行,接着再确定是哪一列,这样就可以知道是哪个按键被按下了。
我是将P3口作为按键扫描口的,比如开始先给P3口设置,每个按键都会有一个对应的十六进制值,我把它们列出来进行一一对应就行了,下面是扫描按键图。
以下为键盘扫描子程序的程序清单。
ucharcodetable[]={
7,8,9,0,
4,5,6,0,
1,2,3,0,
0,0,0,0};
ucharcodetable1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30};
LCD显示电路
采用LCD1602对计算数据和结果的显示,P0口进行输出显示,D0~D7口接P0.0~P0.7口,RW接P2.0,RS接P2.4,E接P2.3.
voiddelay(ucharz)//延迟函数
{
uchary;
for(z;z>0;z--)
for(y=0;y<110;y++);
}
voidcheck()//判断忙或空闲
{
do{
P0=0xFF;
rs=0; //指令
rw=1; //读
lcden=0; //禁止读写
delay
(1);//等待,液晶显示器处理数据
lcden=1; //允许读写
}while(busy==1);//判断是否为空闲,1为忙,0为空闲
}
voidwrite_com(ucharcom)//写指令函数
{
P0=com; //com指令付给P0口
rs=0;
rw=0;
lcden=0;
check();
lcden=1;
}
voidwrite_date(uchardate)//写数据函数
{
P0=date;
rs=1;
rw=0;
lcden=0;
check();
lcden=1;
}voidinit()//初始化{num=-1;
lcden=1;//使能信号为高电平
write_com(0x38);//8位,1行
write_com(0x0c);//显示开,光标关,不闪烁*/
write_com(0x06);//增量方式不移位显竟獗暌贫柚?
write_com(0x80);//检测忙信号
write_com(0x01);//显示开,光标关,不闪烁
num_1=0;
i=0;
j=0;
a=0; //第一个参和运算的数
b=0; //第二个参和运算的数
c=0;
flag=0;//flag表示是否有符号键按下,
fuhao=0;//fuhao表征按下的是哪个符号
}
除法子程序设计
除法的运算,可以显示小数点3位。
write_com(0x04);
i=0;
c=(long)(((float)a/b)*1000);
while(c!
=0)
{
write_date(0x30+c%10);
c=c/10;
i++;
if(i==3)
write_date(0x2e);
}
if(a/b<=0)
write_date(0x30);
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
}
break;
主程序见附录1
4.程序主框图
主程序流程
四、课程设计原理分析及相关知识概述
本次课程设计用的AT89C51具有速度快、功耗低、抗干扰强的特点,有多种I/O端口模式。
Vcc=5v
五、结论
完成硬件和软件的设计和制作后,进行系统的调试,并处理不断出现的问题。
对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:
a.加法运算:
8位整数加法运算,和值不超过99999,若超过上限,则显示错误提示。
b.减法运算:
4位正整数减法运算,结果为正或负。
c.乘法运算:
积不超过999999的整数乘法运算,若超出上限,显示错误提示。
d.除法运算:
整数除法,既计算结果为可显示小数。
六、体会和收获
单片机课程设计,体会是单片机学的不够扎实,不会的很多啊,当然这次的课程设计做计算器程序用的是c语言,不是课上初学的汇编,所以很难适应,尽管大家都知道汇编编这个程序也很困难,但还是互相学习,到处找资料看,问同学,所以我的软件主程序才能编译成功,系统才能调试出结果。
很感谢那些热心教导我的同学和指导我的老师。
在软件方面,感觉困难更多一些,一开始真的很着急,毫无头绪啊,一时间,XX,论坛,贴吧逛了个遍,找了很多资料,也参考了同学的程序,其中每一个子程序模块都认真去读,去分析,化为己用,最重要的按键扫描和显示程序,还有包括加减乘除的运算程序,还了解了c语言在单片机编程中的一些特点,包括函数的声明和调用等等。
而且在用uvison编译的时候出了很多问题,其中一个就是关于头文件的,要加上“#include
但是总的来说,软件设计能够把结果调出来还是很激动的,同时,我们还亲自动手试验箱进行操作,在老师的帮助下得以突破,完美的结束了实训。
附录1程序源代码
#include
#defineuintunsignedint//
#defineucharunsignedchar
sbitlcden=P2^3;//定义引脚
sbitrs=P2^4;
sbitrw=P2^0;
sbitbusy=P0^7;
chari,j,temp,num,num_1;
longa,b,c;//a,第一个数b,第二个数c,得数
floata_c,b_c;
ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号
ucharcodetable[]={
7,8,9,0,
4,5,6,0,
1,2,3,0,
0,0,0,0};
ucharcodetable1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30};
voiddelay(ucharz)//延迟函数
{
uchary;
for(z;z>0;z--)
for(y=0;y<110;y++);
}
voidcheck()//判断忙或空闲
{
do{
P0=0xFF;
rs=0;//指令
rw=1;//读
lcden=0;//禁止读写
delay
(1);//等待,液晶显示器处理数据
lcden=1;//允许读写
}while(busy==1);//判断是否为空闲,1为忙,0为空闲
}
voidwrite_com(ucharcom)//写指令函数
{
P0=com;//com指令付给P0口
rs=0;
rw=0;
lcden=0;
check();
lcden=1;
}
voidwrite_date(uchardate)//写数据函数
{
P0=date;
rs=1;
rw=0;
lcden=0;
check();
lcden=1;
}
voidinit()//初始化
{
num=-1;
lcden=1;//使能信号为高电平
write_com(0x38);//8位,2行
write_com(0x0c);//显示开,光标关,不闪烁*/
write_com(0x06);//增量方式不移位显竟獗暌贫柚?
write_com(0x80);//检测忙信号
write_com(0x01);//显示开,光标关,不闪烁
num_1=0;
i=0;
j=0;
a=0;//第一个参和运算的数
b=0;//第二个参和运算的数
c=0;
flag=0;//flag表示是否有符号键按下,
fuhao=0;//fuhao表征按下的是哪个符号
}
voidkeyscan()//键盘扫描程序
{
P3=0xfe;
if(P3!
=0xfe)
{
delay(20);延迟20ms
if(P3!
=0xfe)
{
temp=P3&0xf0;
switch(temp)
{
case0xe0:
num=0;
break;
case0xd0:
num=1;
break;
case0xb0:
num=2;
break;
case0x70:
num=3;
break;
}
}
while(P3!
=0xfe);
if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
{
if(j!
=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];
}
else//如果按过符号键
{
b=b*10+table[num];
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=4;//4表示除号已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfd;
if(P3!
=0xfd)
{
delay(5);
if(P3!
=0xfd)
{
temp=P3&0xf0;
switch(temp)
{
case0xe0:
num=4;
break;
case0xd0:
num=5;
break;
case0xb0:
num=6;
break;
case0x70:
num=7;
break;
}
}
while(P3!
=0xfd);
if(num==4||num==5||num==6&&num!
=7)//如果按下的是'4','5'或'6'
{
if(j!
=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];
}
else//如果按过符号键
{
b=b*10+table[num];
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=3;//3表示乘号已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfb;
if(P3!
=0xfb)
{
delay(5);
if(P3!
=0xfb)
{
temp=P3&0xf0;
switch(temp)
{
case0xe0:
num=8;
break;
case0xd0:
num=9;
break;
case0xb0:
num=10;
break;
case0x70:
num=11;
break;
}
}
while(P3!
=0xfb);
if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'
{
if(j!
=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];
}
else//如果按过符号键
{
b=b*10+table[num];
}
}
elseif(num==11)//如果按下的是'-'
{
flag=1;
fuhao=2;//2表示减号已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xf7;
if(P3!
=0xf7)
{
delay(5);
if(P3!
=0xf7)
{
temp=P3&0xf0;
switch(temp)
{
case0xe0:
num=12;
break;
case0xd0:
num=13;
break;
case0xb0:
num=14;
break;
case0x70:
num=15;
break;
}
}
while(P3!
=0xf7);
switch(num)
{
case12:
{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"
break;
case13:
{//按下的是"0"
if(flag==0)//没有按过符号键
{
a=a*10;
write_date(0x30);
P1=0;
}
elseif(flag==1)//如果按过符号键
{
b=b*10;
write_date(0x30);
}
}
break;
case14:
{j=1;
if(fuhao==1){write_com(0x80+0xf);//按下等于键,光标前进至第二行最后一个显示处
write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格
c=a+b;
while(c!
=0)
{
write_date(0x30+c%10);
c=c/10;
}
write_date(0x3d);//再写"="
a=0;b=0;flag=0;fuhao=0;
}
elseif(fuhao==2){write_com(0x80+0xf);//光标前进至第二行最后一个显示处
write_com(0x04);//设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)
if(a-b>0)
c=a-b;
else
c=b-a;
while(c!
=0)
{
write_date(0x30+c%10);
c=c/10;
}
if(a-b<0)
write_date(0x2d);
write_date(0x3d);//再写"="
a=0;b=0;flag=0;fuhao=0;
}
elseif(fuhao==3){write_com(0x80+0xf);
write_com(0x04);
c=a*b;
while(c!
=0)
{
write_date(0x30+c%10);
c=c/10;
}
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
elseif(fuhao==4){write_com(0x80+0xf);
write_com(0x04);
i=0;
c=(long)(((float)a/b)*1000);
while(c!
=0)
{
write_date(0x30+c%10);
c=c/10;
i++;
if(i==3)
write_date(0x2e);
}
if(a/b<=0)
write_date(0x30);
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
}
break;
case15:
{write_date(0x30+table1[num]);flag=1;fuhao=1;}
break;
}
}
}
main()
{
init();
while
(1)
{
keyscan();
}
}
附录2protues仿真图
附录3元件清单
设备
使用了C51和LCD液晶显示的完美结合,P0口接LCD液晶显示,同时外接排列电阻RES-PACK
AT89C51
单片机
keypad
数值键盘
LCD1602
LCD液晶显示
RES-V
电阻
RES-PACK8
排列电阻
附录4实验操作图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 计算器 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)