基于STC89C52单片机的简易计算器Word格式.docx
- 文档编号:5822431
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:29
- 大小:429.51KB
基于STC89C52单片机的简易计算器Word格式.docx
《基于STC89C52单片机的简易计算器Word格式.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的简易计算器Word格式.docx(29页珍藏版)》请在冰点文库上搜索。
方案二:
采用独立式按键,独立式按键借口电路配置灵活,软件结构简单,但此键盘比较昂贵不经济。
虽然采用独立式按键时每个按键只占用一根I/O口线,在本实验中根据实际的需要采用通过四个按键即只占用四个I/O口线,而如果采用4*4行列式键盘时占用8个I/O口线,但方案二比较不经济所以我们采用一方案。
(3)显示部分
在单片机应用系统中,使用的显示器主要有LED(发光二极管显示器)、LCD液晶显示。
使用8位LED数码管来显示,LED显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统中通常使用的是七段LED,这种显示器有共阴极和共阳极两种,它具有成本低廉、配置灵活和单片机接口方便等特点。
使用液晶显示器来显示。
液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的浑浊固态。
在电机的作用下,产生冷热变化,从而影响它的透光性,来达到显示的目的。
LCD还具有以下优点:
(1)低压、微功耗;
(2)显示信息量大;
(3)长寿命;
(4)无辐射、无污染。
选择液晶显示屏。
2.2.2软件部分设计方案
软件部分的设计思路时将整个程序划分为键盘扫描部分、显示部分、运算程序部分、清屏显示部分,时钟日期显示部分。
对于其中的键盘扫描部分在编写时又分为动态扫描和静态扫描;
运算程序部分包括加、减、乘、除四个子程序。
软件流程大致如下:
开始,然后是系统的初始化,进行键盘扫描,对扫描的键值进行判断(分为数字键和功能键),如果是数字键,执行数字处理子程序,即显示数字并将数值存储;
如果是命令键,即先判断是否为清屏,如为清屏键,则执行清屏子程序,若为加减乘除运算键则显示相应的符号并存储结果,若都不是则为=键,即要先判断上个符号位,然后调用对应的运算子程序运算,就可以得到需要的结果。
3系统硬件设计:
3.1控制器模块
本系统控制器芯片采用AT89S52单片机,其管脚图如图3所示。
图①AT89S52管脚图
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。
STC89C52的主要特性是:
与MCS-51单片机产品兼容;
8K字节在系统可编程Flash存储器;
1000次擦写周期;
三级加密程序存储器;
32个可编程I/O口线;
三个16位定时器/计数器;
8个中断源;
全双工UAR串行通道;
低功耗空闲和掉电模式;
掉电后中断可唤醒;
有看门狗定时器;
双数据指针。
STC89C52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
3.2按键模块
采用4x4键盘与单片机的P1口相连,连接电路如图4所示。
*设为复位键,按下时,清零,液晶显示为0。
图
按键电路
图③按键电路流程图
按键子程序
#include"
keyscan.h"
1602.h"
uint8linescan[4]={0xfe,0xfd,0xfb,0xf7};
//列扫描
//按键扫描函数
int8keyscan()
{
uint8i,temp;
int8keyvalue=-1;
for(i=0;
i<
4;
i++)
{
P1=linescan[i];
temp=P1&
0xf0;
if(temp!
=0xf0)
{
delay(50);
if(temp!
{
switch(temp)
{
case0xe0:
keyvalue=0+i;
break;
case0xd0:
keyvalue=4+i;
case0xb0:
keyvalue=8+i;
case0x70:
keyvalue=12+i;
}
}
}
while(temp!
temp=P1&
3.3时钟日期模块
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示及内部结构如图2所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该
数据的时间同时记录,因此广泛应用于测量系统中。
图④时钟电路
时钟日期子程序
1302.h"
uint8time[7]={0,18,8,4,1,3,12};
//秒分时日月周年2012-01-04
08:
18:
00/**
*写一个字节
*/
voidwr_byte(uint8dat)
uint8i;
for(i=0;
8;
i++)
{
SDA=dat&
0x01;
SCK=1;
dat>
>
=1;
SCK=0;
}
}
/**
*读一个字节
uint8rd_byte(void)
uint8i,dat=0;
if(SDA)
dat|=0x80;
}
returndat;
voidreset_ds1302(void)
RST=0;
SCK=0;
RST=1;
*清除写保护
voidclear_ds1302_WP(void)
reset_ds1302();
wr_byte(0x8E);
wr_byte(0);
SDA=0;
*设置写保护
voidset_ds1302_WP(void)
wr_byte(0x80);
*设定时钟数据
voidset_time(uint8*timedata)
uint8i,tmp;
i<
7;
i++)//转化为BCD格式
tmp=timedata[i]/10;
timedata[i]=timedata[i]%10;
timedata[i]=timedata[i]+tmp*16;
clear_ds1302_WP();
wr_byte(DS1302_W_ADDR);
i++)
wr_byte(timedata[i]);
delay(10);
set_ds1302_WP();
*读时钟数据(BCD格式)
voidrd_time(uint8*timedata)
wr_byte(DS1302_R_ADDR);
timedata[i]=rd_byte();
voidds_init()
set_time(time);
3.4液晶显示屏显示模块
如上所述,当数字输入键盘有键按下的时候,经过程序识别,则会有相应结果被送入显示屏得到显示。
如果是数字键则直接放入液晶显示缓冲区,如果再次有数字键按下,则应将缓冲区的数字向高位移动一位,以构成两位数,之前输入的置之高位,并记录按键次数,每输入一个键值都调用显示程序出来;
如果是运算符,则执行相应的运算,送入单片机芯片C51内进行计算后将结果调用显示程序显示结果。
该设计中选取的是RT1602-C型号液晶显示屏,如下图
图⑤显示电路
显示子程序
//检验忙函数
voidcheck_busy()
{
do
RS=0;
RW=1;
P0=0xff;
E=0;
E=1;
}while(busy);
//写命令函数
voidwr_command(uint8com)
check_busy();
RW=0;
P0=com;
delay(5);
//写数据函数
voidwr_data(uint8dat)
RS=1;
P0=dat;
//1602显示函数
voiddisplay_1602(uint8addr,uint8*p)
wr_command(addr);
delay(10);
while(*p!
='
\0'
)
wr_data(*p++);
}
//1602初始化函数
voidinit_1602()
{uint8i;
3;
wr_command(0x30);
wr_command(0x38);
wr_command(0x01);
wr_command(0x06);
wr_command(0x0c);
3.5硬件元件清单
系统元器件清单见表
器件
单价
数量
总价
AT89C52
3.4元
1
3.4元
DS1302
0.65元
RT1602-C(LCD)
9.9元
有源蜂鸣器
0.53元
电阻
排阻
0.5元
10K
0.1元
2
0.2元
晶振
12MHZ
0.3元
32.768KHZ
0.17元
万能板
12*18
6.0元
9*15
2.0元
底座
2.1元
DS1602
0.33元
按键(大号)
0.14元
18
2.52元
杜邦线
0.15元
10
1.5元
电解电容
30PF
10UF
排针
0.16元
排插
0.28元
三极管NPN
总金额
31.76元
系统元器件清单
4.软件设计与仿真:
本系统程序包括主程序、键盘扫描子程序、发送键码子程序、发送数据子程序、接收命令子程序等。
主程序用于系统初始化,子程序调度等。
键盘扫描子程序用于扫描键盘状态,将被按键的位置号存入缓冲器中。
发送键码子程序用于将缓冲区键的接通码或断开码发送给单片机接口。
发送数据子程序用于将数据发给单片机接口。
接收命令子程序用于接收单片机接口发来的键盘命令。
4.1主程序设计
主程序通过键盘扫描子程序进行各行扫描是否有按键,消抖及重键处理:
通过软件上延时程序来消除抖动;
采用后按键优先处理,即多键同时按下时,只重复发送最后按下键的扫描码。
。
图⑥主程序流程图
主程序
/*
*Easycalculator
*8位数的加,减,乘和整数的除法
uint8error[16]={"
error!
"
};
uint8zifu2[16]={"
0"
uint8zifu1[16]={"
welcome"
int8f_flag=0;
bittimeflag=0;
bitbx_flag=0;
//切换功能标志位
int32temp1,temp2;
//****1302定义数据
uint8idatatimedata[7]={0};
uint8idatalcddate[16]={"
2011-09-271"
uint8idatalcdtime[16]={"
16:
44:
50"
//延时函数
voiddelay(uint16del)
while(del--);
//按键蜂鸣器发声
voidbuzzer_sound(void)
uint16i;
BUZ_DELAY;
BUZZER=~BUZZER;
BUZZER=0;
//验证数据有效性超过8位数显示error。
bitcheck_num(int32number)
if(number>
=100000000)
return1;
else
return0;
//整数数据处理函数
voidmake_int(int32int_num)
bits_flag=0;
int32sit;
if(int_num<
0)//负数取反
s_flag=1;
int_num=-int_num;
ET0=0;
//关显示扫描中断
for(i=8,sit=10000000;
=14;
i++,sit/=10)//number开头是否为0
if(int_num/sit)
break;
else
zifu2[i]='
'
;
int_num-=int_num/sit*sit;
for(;
i++,sit/=10)
zifu2[i]=int_num/sit+'
0'
int_num-=int_num/sit*sit;
zifu2[15]=int_num+'
if(s_flag)
zifu2[0]='
-'
ET0=1;
//计算函数
voidcalculate(int8keycode)
floatans;
biterr=0;
if(keycode>
=add&
&
keycode<
=div)
f_flag=keycode;
elseif(keycode==equ)
switch(f_flag)
caseadd:
ans=temp1+temp2;
//"
+"
运算
casesub:
ans=temp1-temp2;
—"
casemul:
ans=temp1*temp2;
*"
casediv:
//"
/"
if(temp2!
=0)//判断除数是否为零,为0显示error!
{ans=temp1/temp2;
else
{err=1;
if(check_num(ans))err=1;
if(err)
display_1602(0x80,error);
else
make_int(ans);
f_flag=0;
temp1=0;
temp2=0;
elseif(keycode==clr)
make_int(0);
f_flag=0;
temp1=0;
temp2=0;
display_1602(0x80,zifu1);
else
if(f_flag==0)
ans=temp1;
ans*=10;
ans+=keycode;
if(check_num(ans))
return;
temp1=ans;
make_int(temp1);
}
ans=temp2;
temp2=ans;
make_int(temp2);
}
//读ds1302
voidread_ds()
rd_time(timedata);
lcdtime[11]=(timedata[0]&
0x0f)+'
lcdtime[10]=(timedata[0]>
4)+'
lcdtime[8]=(timedata[1]&
lcdtime[7]=(timedata[1]>
lcdtime[5]=(timedata[2]&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 简易 计算器