单片机51计算器设计.docx
- 文档编号:7031600
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:22
- 大小:290.56KB
单片机51计算器设计.docx
《单片机51计算器设计.docx》由会员分享,可在线阅读,更多相关《单片机51计算器设计.docx(22页珍藏版)》请在冰点文库上搜索。
单片机51计算器设计
课题名称:
简易计算器
学生班级:
电子信息工程
学生学号:
学生姓名:
redsea
指导老师:
xxx
2012年12月23日
目录
摘要………………………………………………………………………2
引言…………………………………………………………………………2
一、计算机的硬件设计……………………………………………………2
1.1AT89S52单片机…………………………………………………………2
1.2LCD1602……………………………………………………………4
1.3晶振部分的设计…………………………………………………………5
1.44*4键盘的设计…………………………………………………………5
1.5复位电路设计…………………………………………………………5
二、软件设计……………………………………………………………6
2.1主程序流程图……………………………………………………………6
2.2LCD显示程序设计………………………………………………………7
2.3按键输入流程图………………………………………………………….8
3、硬件调试…………………………………………………………………9
四、结论……………………………………………………………………10
摘要
简易计算器是一种非常广泛日常工具,对现代社会越来越流行。
它可以进行一些简易的计算。
本系统提供详细的时、分、秒、年、月、日的时间信息,同时还可进行简易的计算信息,还具有时间校准等功能。
该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用5V电压供电。
本系统硬件部分由AT89S52单片机、LCD1602液晶屏、键盘、系统等部分构成。
软件部分在keil环境下用C51语言编写,包括时间设置、时间显示、简易计算显示等。
关键字:
AT89S52;液晶屏LCD1602;键盘
引言
众所周知单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
本设计要制作的就是单片机于生活中最为常见的异种应用——简易计算器。
本简易计算器AT89S52单片机作为核心,简易计算器显示电路由LCD1602组成,硬件方面AT89C52单片机,晶振,电源,液晶屏LCD1602。
一、计算机的硬件设计
其中U1为STC系列的52单片机STC89C52,它具有功能强,体积小,功耗低以及价格便宜等优点;U2A为74hc20与门,在P1.4~P1.7接一个四输入与门,在中断服务程序中通过读取P1.4~P1.7的电平就可以判断是哪个键被按下。
此外,P0接10k上拉电阻,同时用接LCD1602,,P1口接4x4矩阵键盘。
本系统选用12MHZ的晶振,,使得单片机有合理的运行速度。
起振电容30pF对振荡器的频率高低、振荡器的稳定性和起振的快速性影响较合适,复位电路为按键高电平复位。
1.1AT89S52单片机
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
引脚结构
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX)。
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。
P3口:
AT89S52特殊功能(第二功能)使用,如下表所示。
P3口也接收一些控制信号。
引脚号第二功能
P3.0RXD(串行输入)
P3.1TXD(串行输出)
P3.2INT0(外部中断0)
P3.3INT0(外部中断0)
P3.4T0(定时器0外部输入)
P3.5T1(定时器1外部输入)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器写选通)
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
本设计运用到了P0.0—P0.7、P1.0—P1.7、P2.4、P2.5、P2.6、P3.3、RST和XTAL1、XTAL2引脚。
P0.0—P0.7作为IO口输出,P1.0—P1.7作为IO输入口,
1.2LCD1602
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口。
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
本电路采用16脚(带背光)接口,同时使用10K的滑动变阻器调整对比度
1.3晶振部分的设计
89S52单片机虽然有内部振荡电路,但要形成时钟,必须外接元件,本电路设计采用12MHz的晶振和两个30pF的电容,为了减小寄生电容,更好地保持振荡器稳定和可靠工作,晶体电容应尽可能安装的与单片机芯片靠近。
此外,由于晶振高频振荡相当于一个内部干扰源,所以晶振外壳一般要良好的接地。
1.44*4键盘的设计
键盘功能如下:
1.5复位电路设计
单片机启动时,都需要先复位,以使CPU和系统中其他部件处于一个确定的初始状态,并开始从这个状态工作。
如果RST引脚上有一个高电平并且复位维持2个机器周期以上,则CPU就开始执行复位。
复位设计如图,采用手动复位方式,其中电阻R16为1K,电阻R17为10K,电容C13为10uF
二、软件设计
本电路软件设计采用C语言编写程序(具体程序在附件中给出)。
程序设计主要包括简易计算的编程,按键编程,液晶屏LCD1602的显示编程。
在硬件设计完成后,利用软件对其进行仿真,以尽可能的减少做板的次数。
本次我采用Proteus软件仿真。
但是由于软件问题,仿真由于不能实现,因此我先进行硬件设计后直接做板。
2.1主程序流程图:
1)开始后程序初始化参数,LCD1602显示为0。
2)扫描键盘看否输入,若有则读取键盘编码。
若为数值键则输出数值、若为清零键则输出0、若为功能键则判断是‘+’‘-’‘*’‘/’还是‘=’。
若为‘=’则输出运算结果并且在LCD上输出,若为其他则保存相对运算程序的首地址并且在LCD上输出.
2.2LCD显示程序设计流程图:
本计算器只能表示16位,每次在显示数值时首先要判断他是否为负数,若为负数则是输出负号,同时除以10,余数在LCD最低显示,判断商是否为0,若为0,则结束返回,若不为0在将商除以10,将余数在最高位显示。
流程图如下:
2.3按键输入流程图
因为是使用扫描法实现键盘的数据输入,因此每一个按键都有一个唯一的编码,每按下一个键,程序根据按键编码则可以转化为数值、符号进行计算。
其流程图如下:
三、硬件调试
做好电路板,按键使用正确,计算功能也正常!
如下图:
四、结论
在用单片机实现简易计算的设计中使用到了AT89s52、LCD1602及其4*4键盘的使用。
在设计过程中我通过在网上和图书馆查阅资料,收集了关于单片机和液晶屏LCD1602显示方面的资料,通过对这些资料的学习,我了解了单片机的基本结构和单片机在生活和生产中所发挥的作用;液晶屏LCD1602的原理和使用。
本次设计完成的主要工作和任务如下:
单片机的合理选型,硬件电路的设计,电路板的制作,元器件的焊接,软件的编写和调试以及论文的制作。
通过设计简易计算器的过程中我掌握了单片机的基本原理及其各种应用,对它的各种硬件接口与软件设计方法有较深入的认识。
通过对电路原理图、电路仿真、电路板的制作掌握了对proteus仿真软件的使用。
附录
简易计算器源程序如下:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitlcden=P2^3;//定义引脚E使能
sbitrs=P2^4;
sbitbusy=P0^7;
sbitp33=P3^3;
chari,j,temp,num,num_1;
longa,b,c;//a,第一个数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,//按键标值0x2f-0x30是将字符转化为数字,与后面的0x30+i抵消,得i值
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30//0x01是清屏命令
};
voiddelay(uintz)//延迟函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//写指令函数
{
rs=0;//选择写命令模式
P0=com;//将要写的命令送到数据总线上
delay(5);//稍作延时以待数据稳定
lcden=1;//时能端给以高脉冲,因为初始化函数中已经将lcden置0
delay(5);//稍作延时
lcden=0;//将使能端置0已完成高脉冲
rs=1;
}
voidwrite_date(uchardate)//写数据函数
{
rs=1;
P0=date;
delay(8);
lcden=1;
delay(8);
lcden=0;
rs=0;
}
voidinit()//初始化
{
lcden=0;
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
write_com(0x80);
num_1=0;
i=0;
j=0;
a=0;//第一个参与运算的数
b=0;//第二个参与运算的数
c=0;//结果值
flag=0;//flag表示是否有符号键按下,
fuhao=0;//fuhao表征按下的是哪个符号
}
voidkeyscan(void)//键盘扫描程序
{
voidint0();
P1=0xfe;
if(P1!
=0xfe)
{
delay(20);//20ms
if(P1!
=0xfe)
{
temp=P1&0xf0;
switch(temp)
{
case0xe0:
num=0;
break;
case0xd0:
num=1;
break;
case0xb0:
num=2;
break;
case0x70:
num=3;
break;
}
}
while(P1!
=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];//a的初值为'0',结果为输入a值
}
else//如果按过符号键
{
b=b*10+table[num];//b的初值为'0',结果为输入b值
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=4;//4表示除号已按
}
i=table1[num];
write_date(0x30+i);//将数字转化为字符,对应前面的table1中的i-0x30
}
P1=0xfd;
if(P1!
=0xfd)
{
delay(5);
if(P1!
=0xfd)
{
temp=P1&0xf0;
switch(temp)
{
case0xe0:
num=4;
break;
case0xd0:
num=5;
break;
case0xb0:
num=6;
break;
case0x70:
num=7;
break;
}
}
while(P1!
=0xfd);
if(num==4||num==5||num==6)//如果按下的是'4','5'或'6'
{
if(j!
=0)
{
write_com(0x01);//清屏命令
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];//输入a值
}
else//如果按过符号键
{
b=b*10+table[num];//输入b值
}
}
else//如果按下的是'*'
{
flag=1;
fuhao=3;//3表示乘号已按
}
i=table1[num];
write_date(0x30+i);
}
P1=0xfb;
if(P1!
=0xfb)
{
delay(5);
if(P1!
=0xfb)
{
temp=P1&0xf0;
switch(temp)
{
case0xe0:
num=8;
break;
case0xd0:
num=9;
break;
case0xb0:
num=10;
break;
case0x70:
num=11;
break;
}
}
while(P1!
=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);
}
P1=0xf7;
if(P1!
=0xf7)
{
delay(5);
if(P1!
=0xf7)
{
temp=P1&0xf0;
switch(temp)
{
case0xe0:
num=12;
break;
case0xd0:
num=13;
break;
case0xb0:
num=14;
break;
case0x70:
num=15;
break;
}
}
while(P1!
=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);
}
elseif(flag==1)//如果按过符号键
{
b=b*10;
write_date(0x30);
}
}
break;
case14:
{
j=1;
if(fuhao==1)
{
write_com(0x80+0x4f);//按下等于键,光标前进至第二行最后一个显示处
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+0x4f);//光标前进至第二行最后一个显示处
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+0x4f);
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+0x4f);
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;
}
}
P1=0xf0;
}
voidmain()//主函数
{
init();
EX1=1;
EA=1;
IT1=1;
p33=1;
P1=0xf0;
while
(1)
{
if(p33==0){
keyscan();}
}
}
voidint0()interrupt2using1//中断
{
if(p33==1)
{
p33=0;}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 51 计算器 设计