单片机课程设计报告简易计算器.docx
- 文档编号:13305935
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:42
- 大小:1.09MB
单片机课程设计报告简易计算器.docx
《单片机课程设计报告简易计算器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告简易计算器.docx(42页珍藏版)》请在冰点文库上搜索。
单片机课程设计报告简易计算器
摘要:
计算器是人们的日常生活中是最常见的电子产品之一,它应用极广、发展迅猛,并且不断出现着拥有更加强大功能的计算器。
为了解和研究计算器,本次课设设计制作了一个简易计算器,能够在十四位的计算范围内进行“+”、“-”、“*”、“/”的基本运算,能进行负数以及小数点后两位的精确结果显示。
该计算器以AT89C51单片机芯片作为核心。
采用LCD1602工业字符液晶进行显示。
完成的计算器经过检验能够完整的实现预设功能,各种细节完善,具有很高的使用价值。
关键词:
单片机;简易计算器;AT89C51;LCD1602
SimpleCalculator
Abstract:
CalculatorisPeople'sDailylifeisoneofthemostcommonelectronicproducts,usedverywide,developingrapidly,andconstantlyappearmorepowerfulfunctionwithhavecalculators.Inordertounderstandandstudycalculator,thisclasssetdesignmadeasimplecalculator,canthecalculationinwithin14"+"and"-"and"*","/"thebasiccomputing,cancarryoutnegativeandtwodecimalplacesaccurateresultsareshown.ThiscalculatorwithAT89C51chipsasthecore.UsingliquidLCD1602industrialcharactersdisplayed.Completecalculatorafterinspectioncancompleterealization,variousdetailspresetfunctionstoperfect,havehighusevalue.
Keywords:
MCU;Simplecalculator;AT89C51;LCD1602
目录
中文摘要............................................................1
英文摘要............................................................2
单片机课程设计......................................................4
1课程设计任务.....................................................4
1.1主要功能设计................................................4
1.2任务目的....................................................4
2整体设计方案......................................................4
2.1方案论证....................................................4
2.2系统框图....................................................5
3硬件电路的设计...................................................6
3.1计算机Protel总图............................................6
3.2显示电路设计方案............................................9
3.3键盘设计方案................................................9
3.4复位电路设计...............................................10
3.5晶振电路设计...............................................10
4控制软件设计....................................................11
4.1程序时序总图...............................................11
4.2液晶显示软件设计...........................................12
4.3键盘输入软件设计...........................................13
4.4计算函数设置...............................................15
5系统调试........................................................18
5.1硬件调试...................................................18
5.2软件调试...................................................18
参考文献...........................................................20
个人小结...........................................................21
附录...............................................................24
附录1..........................................................24
附录2..........................................................25
1课程设计任务
1.1主要功能设计
以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602工业字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
1.2任务目的
通过本次课程设计提高我们的单片机硬件设计、软件编程能力,自主学习到更多的单片机应用知识。
2整体设计方案
2.1方案论证
计算器电路包括三个部分:
显示电路、4*4键扫描电路、单片机微控制电路。
具体如下:
(1)LCD显示电路
LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。
又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.
(2)4*4键盘扫描电路
一般常采用3种方法读取键值。
一种是中断式,外两种是扫描法和反转法。
中断式:
在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地
址读取数据线上的状态,判断哪个案件被按下。
本实验采用中断式实现用户键盘接口。
扫描法:
对键盘上的某一行送低电平,其他行为高电平,然后读取列值。
若列值中有一
位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。
反转法:
先将所有行扫描线输出低电平,读列值。
若列值有一位是低,则表明有键按下,
读列值;然后所有列扫描线输出低电平,再读行值。
根据读到的值组合就可以查表1得到的
键码。
因为编程的方式,本次设计采用逐行扫描来读取键值,方便程序编写。
(3)单片机微控制电路:
微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。
2.2系统框图
系统框图2.1
3硬件电路的设计
3.1计算机Protel总图
简易计算器电路原理图1.1
3.2显示电路设计方案
LCD1602型液晶
(1)显示特性
●单5V电源电压,低功耗,长寿命,可靠性高
●内置192种字符(160个5*7点阵字符和32个5*10点阵字符)
●具有64个字节的自定义字符RAM,可自定义8个5*8点阵字符
●或四个5*11点阵字符
●显示方式:
STN、半透、正显
●驱动方式:
1/16DUTY,1/5BIAS
●视角方式:
6点
●背光方式:
底部LED
●通讯方式:
4位或8位并口可选
●标准的接口特性,适配MC51和M6800系列MPU的操作时序
(2)接口定义
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
V0
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,下降沿使能。
7
DB0
底4位三态、双向数据总线0位(最低位)
8~13
DB1~DB6
底4位三态、双向数据总线1~6位
14
DB7
高4位三态、双向数据总线7位(最高位)(也是busyflag)
(3)寄存器选择控制表
RS
R/W
操作说明
0
0
写入指令寄存器(清除屏等)
0
1
读busyflag(DB7),以及读取位址计数器(DB0~DB6)值
1
0
写入数据寄存器(显示各字型等)
1
1
从数据寄存器读取数据
(4)液晶显示电路接线图
本次设计中15,16号脚分别接电源接地开启背光,DB0~DB7对应P1口,2号脚接电源,1和3脚接地。
3.3键盘设计方案
12mm*12mm*8mm规格4*4矩阵排布键盘
(1)按键设置图
共设置16个键,其中数字键0~9共十个,符号健有加号键、减号键、等于号、清除键。
操作设备是四行四列共16键的简单键盘。
其分布如图所示。
(2)按键功能
1~9为数字输入;
ON/C为清除健;
"+"、"-"、"*"、"\"、"="为符号输入;
(3)键盘连接图
键盘对应连接如图所示,接单片机P3口,在焊接过程中要注意短接虚焊,同时P3口接入510欧电阻进行上拉。
3.4复位电路设计
途中的RC为延时电路,只要RST端出现2个机器周期的高电平就可以使单片机复位,单片机复位后RST端出现低电平。
3.5晶振电路设计
单片机内部设有一个反向放大器构成的振荡器,18脚和19脚分别为振荡电路的输入和输出端,时钟由内部产生,定时器件为石英晶体和电容组成的并联谐振回路,电容C2,C3取值在5-30PF;Y1的取值在1.2~12M之间选取。
4控制软件设计:
设计中采用C语言对单片机进行编程,采用的是自下而上的设计方式,先设计出每一个模块(子程序),然后再慢慢扩大,最后组成程序。
4.1程序总时序图
4.2液晶显示软件设计
(1)显示流程
(2)1602液晶显示时序图,通过时序图,所有编程问题都可以得以解决。
(3)由时序图可以写出液晶的初始化函数、功能设置函数、清屏函数、写指令函数、写数据函数。
voidlcd1602_write_com(ucharcom)//向1602写入命令
{
P1=com;
rs=0;
rw=0;
lcden=0;
lcd1602_delay(10);
lcden=1;
lcd1602_delay(10);
lcden=0;
}
voidlcd1602_pos(ucharx,uchary)//1602定位
{
ucharpos;
if(x==0)
x=0x80;
elseif(x==1)
x=0xc0;
pos=x+y;
lcd1602_write_com(pos);//显示地址
}
voidlcd1602_write_date(uchardate)//向1602写入数据
{
P1=date;
rs=1;
rw=0;
lcden=0;
lcd1602_delay(10);
lcden=1;
lcd1602_delay(10);
lcden=0;
}
voidlcd1602_write_str(uchar*p)//向1602写入一个字符串
{
while(*p!
='\0')
{
lcd1602_write_date(*p);
p++;
}
}
voidlcd1602_init()//1602初始化
{
rw=0;
lcd1602_write_com(0x38);
lcd1602_delay(20);
lcd1602_write_com(0x0c);
lcd1602_delay(20);
lcd1602_write_com(0x06);
lcd1602_delay(20);
lcd1602_write_com(0x01);
lcd1602_delay(20);
}
4.3键盘输入软件设计
(1)键盘输入程序运行时序图
(2)键盘扫描程序
voidkeyscan()//键盘扫描程序
{
P3=0xfe;//1111,1110,为0扫描先扫描的第一行
if(P3!
=0xfe)
{
delay(5);
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)
{
lcd1602_write_com(0x01);
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];//将计算符号前输入的数存入a
}
else//如果按过符号键
{
b=b*10+table[num];//将计算符号后输入的数存入a
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=4;//4表示除号已按
}
i=table1[num];
lcd1602_write_date(0x30+i);//显示在屏幕上
}
P3=0xfd;
.......
4.4计算函数设置
因为只有16个健,所以计算上只设计了加减乘除的功能,下面是几个计算程序的关键部
(1)加法部分
j=1;
if(fuhao==1){lcd1602_pos(1,16);
//按下等于键,光标前进至第二行最后一个显示处
lcd1602_write_com(0x04);
//设置从后住前写数据,每写完一个数据,光标后退一格
c=a+b;//相加后进行值的大小判定
if((c>=-999999999999)&&(c<=999999999999))
{
while(c!
=0)
{
lcd1602_write_date(0x30+c%10);
c=c/10;
}//计算结果输出
lcd1602_write_date(0x3d);//再写"="
a=0;b=0;flag=0;fuhao=0;//还原标志和计算初值
}
else
{
lcd1602_pos(1,11);
lcd1602_write_str("RORRE");//因为之前com(0x04),所以反写,以求简便
}
}
(2)减法部分
elseif(fuhao==2){lcd1602_pos(1,16);
lcd1602_write_com(0x04);
if((a-b)>0)
c=a-b;
else
c=b-a;
if((c>=-99999999)&&(c<=99999999))
{
while(c!
=0)
{
lcd1602_write_date(0x30+c%10);
c=c/10;
}
if((a-b)<0)
lcd1602_write_date(0x2d);
lcd1602_write_date(0x3d);//再写"="
a=0;b=0;flag=0;fuhao=0;
}
else
{
lcd1602_pos(1,11);
lcd1602_write_str("RORRE");
}
}
(3)乘法部分
elseif(fuhao==3){lcd1602_pos(1,16);
lcd1602_write_com(0x04);
c=a*b;
if((c>=-99999999)&&(c<=99999999))
{
while(c!
=0)
{
lcd1602_write_date(0x30+c%10);
c=c/10;
}
lcd1602_write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
else
{
lcd1602_pos(1,11);
lcd1602_write_str("RORRE");
}
}
(4)除法部分
elseif(fuhao==4){lcd1602_pos(1,16);
lcd1602_write_com(0x04);
i=0;
c=(long)(((float)a/b)*1000);
if((c>=-99999999)&&(c<=99999999))
{
while(c!
=0)
{
lcd1602_write_date(0x30+c%10);
c=c/10;
i++;
if(i==3)
lcd1602_write_date(0x2e);
}
if(a/b<=0)
lcd1602_write_date(0x30);
lcd1602_write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
else
{
lcd1602_pos(1,11);
lcd1602_write_str("RORRE");
}
}
5系统调试:
5.1硬件调试
该设计硬件部分较为简单,按照电源指示灯,复位电路,液晶显示,键盘输入的顺序进行检。
最开始复位电路是出现了焊接问题的,不自锁开关的后的接脚焊错,导致开关完全无用。
完善之后用万用表测试了复位电路是否能正常工作,经过测试,单片机的1脚电压为0,只是在复位的瞬间出现4.95V的高电平,从而使单片机复位。
工作稳定。
然后编写程序对液晶进行了测试,程序是变化的两排显示规律字符,发现显示混乱字符,遂检查硬件焊接情况,发现是液晶部分焊点焊在了一起导致的,改过之后液晶能够正常显示。
测试键盘时编写的是一个扫描按键,不同的健输出特定的符号在液晶上显示,过程非常成功。
在确保保证硬件没有问题的情况下开始软件编程。
5.2软件调试
(1)编程前先画了流程图,这样思路清晰,能按部就班的完成。
(2)子函数有显示部分、键盘扫描部分和计算部分,编写好后综合在一起。
(3)在将程序写在一起的过程中,使用KEILC进行了仿真,仿真过程模拟了键盘的输入,同时观察各种情况时液晶的输出情况。
(4)问题一:
开始的思路是采用一个单独的键盘扫描。
如:
intkeyfound()
{
unsignedcharkeyvalue,keyscan,keyin;
unsignedinti,j,flag;
keyscan=0xef;//初始扫描位置设定
keyvalue=0;
flag=0;
for(i=0;i<4;i++)//开始逐行扫描
{
P3=keyscan;
keyin=P2;
keyin=keyin&0x0f;
if(keyin!
=0x0f)
{
for(j=0;j<4;j++)//扫描到有按键按下的行再进行列的扫描
if(((keyin>>j)&1)==0)
{
keyvalue=keyvalue+j;
flag=1;
break;
}
}
else
{
keyvalue+=4;
keyscan=keyscan<<1;//没有按键按下,扫描下一行
}
while(keyin&0x0f!
=0x0f);//按键松开后再反回值
return(keyvalue);
}
}
在此基础上,对每一个按键的返回值进行IF语句的筛选(这里的返回值指第几个按键),判断出是数字还是符号,符号再利用语句分别编写计算程式,结果显示,液晶清零。
在编写过程中从按键的返回值到液晶的显示出现了问题,遂放弃了该思路。
换作在逐行扫描的过程中。
每扫描一个按键就进行判断,若是数字则判断符号标志然后返回到特定的字符中进行特定方式的累加,与此同时在屏幕上进行正确显示。
若是等号,则依照之前的符号标志和符号前后输入数字进行加减乘除的运算,并输出。
(5)问题二:
编写过程中出现了液晶对比度太深,显示字符串时没有第一个字母。
解决这个问题,首先再次检查了液晶焊接的1、2、3号脚,确认无误后为看起来更清楚,讲背光焊接,然后检查程序,发现是液晶初始化的问题。
在液晶初始化的程序中,设置问题。
(6)问题三:
在设计中,计算结果显示在液晶第二行,为了看起来很舒服,将输入第一个符号的位置调到第二行最后并且写入命令(0x04);设置从后住前写数据,每写完一个数据,光标后退一格。
在这个设计中。
从后往前写数据的方式开始使显示顺序出现了问题,不管是一些计算结果的显示还是最后溢出ERROR的显示都不正确,遂先使用数组的方式调整输出顺序使计算结果能够正常显示,再将溢出时字符输出倒写,简单解决问题。
(7)问题四:
计算器在使用过程中必须注意很多基础问题,例如连续输入0时的屏幕显示应该不会出现一排的0,例如一次计算完成后,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告 简易 计算器