基于STC89C52单片机的简易计算器.docx
- 文档编号:28418142
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:29
- 大小:429.55KB
基于STC89C52单片机的简易计算器.docx
《基于STC89C52单片机的简易计算器.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的简易计算器.docx(29页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的简易计算器
基于STC89C52单片机的简易计算器
内容摘要:
该计算器以STC89C52单片机为核心控制芯片,实现了简单的加、减、乘、除功能,采取的是键盘输入和液晶显示屏的输出结果显示。
主要硬件构成部分由五个:
一个STC89C52单片机芯片,一个液晶显示屏(LCD),一个4*4矩阵键盘和一个时钟芯片(DS1302)一个蜂鸣器,可以实现8位的整数数值操作计算。
附加时钟显示的功能。
关键词:
单片机STC89C52液晶显示屏LCD时钟芯片DS1302
Abstract:
ThecalculatorwithSTC89C52singlechipasthecorecontrolchip,therealizationofasimpleaddition,subtraction,multiplication,inadditiontofunction,istakenbythekeyboardinputandliquidcrystaldisplayoutputThedesigh.istakenbythekeyboardinputandliquidcrystaldisplayoutput.Themainhardwarecomponentsfromfive:
aSTC89C52chip,aliquidcrystaldisplay(LCD),a4x4matrixkeyboardandaclockchip(DS1302)abuzzer,canachievea8bitintegernumericaloperationcalculation.Additionalclockdisplayfunction.
Keywords:
ThesinglechipcomputerSTC89C52Liquidcrystaldisplay(LCD)LEDtheClockDS1302chip
1.绪论:
单片机是指一个集成在一块芯片上的完整计算机系统。
尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:
CPU、内存、内部和外部总线系统,目前大部分还会具有外存。
同时集成诸如通讯接口、定时器,实时时钟等外围设备。
而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可,用它来做一些控制电器一类不是很复杂的工作足矣了。
我们现在用的全自动滚筒洗衣机、排烟罩、VCD等等的家电里面都可以看到它的身影!
它主要是作为控制部分的核心部件。
它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。
单片机比专用处理器最适合应用于嵌入式系统,因此它得到了最多的应用。
事实上单片机是世界上数量最多的计算机。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
而个人电脑中也会有为数不少的单片机在工作。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!
单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多2系统设计
2.系统设计:
2.1设计任务与要求
2.1.1设计任务
(1)设计一个单片机控制的计算器,实现四则运算;
(2)在设计过程中,设计的电路用仿真软件(Proteus)进行仿真调试;
(3)增加一个时间显示功能。
2.1.2设计要求
(1)实现八位数整数的加、减、乘、除四则运算;
(2)附加一时间日期显示功能;
2.2总体设计方案
2.2.1硬件部分设计方案
(1)单片机部分
单片机以AT89C52来作为核心元器件。
(2)按键部分
方案一:
采用4*4行列式键盘,分别设定数字键和功能键,采用查询方式,每次有键按下时,先判断是实数字键还是功能键,这种方式采用了大量的I/O口线。
方案二:
采用独立式按键,独立式按键借口电路配置灵活,软件结构简单,但此键盘比较昂贵不经济。
虽然采用独立式按键时每个按键只占用一根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"
#include"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!
=0xf0)
{
switch(temp)
{
case0xe0:
keyvalue=0+i;break;
case0xd0:
keyvalue=4+i;break;
case0xb0:
keyvalue=8+i;break;
case0x70:
keyvalue=12+i;break;
}
}
}
while(temp!
=0xf0)
{
temp=P1&0xf0;
}
3.3时钟日期模块
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示及内部结构如图2所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该
数据的时间同时记录,因此广泛应用于测量系统中。
图④时钟电路
时钟日期子程序
#include"1302.h"
uint8time[7]={0,18,8,4,1,3,12};//秒分时日月周年2012-01-04
08:
18:
00/**
*写一个字节
*/
voidwr_byte(uint8dat)
{
uint8i;
for(i=0;i<8;i++)
{
SDA=dat&0x01;
SCK=1;
dat>>=1;
SCK=0;
}
}
/**
*读一个字节
*/
uint8rd_byte(void)
{
uint8i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
if(SDA)
dat|=0x80;
SCK=1;
SCK=0;
}
returndat;
}
voidreset_ds1302(void)
{
RST=0;
SCK=0;
RST=1;
}
/**
*清除写保护
*/
voidclear_ds1302_WP(void)
{
reset_ds1302();
RST=1;
wr_byte(0x8E);
wr_byte(0);
SDA=0;
RST=0;
}
/**
*设置写保护
*/
voidset_ds1302_WP(void)
{
reset_ds1302();
RST=1;
wr_byte(0x8E);
wr_byte(0x80);
SDA=0;
RST=0;
}
/**
*设定时钟数据
*/
voidset_time(uint8*timedata)
{
uint8i,tmp;
for(i=0;i<7;i++)//转化为BCD格式
{
tmp=timedata[i]/10;
timedata[i]=timedata[i]%10;
timedata[i]=timedata[i]+tmp*16;
}
clear_ds1302_WP();
reset_ds1302();
RST=1;
wr_byte(DS1302_W_ADDR);
for(i=0;i<7;i++)
{
wr_byte(timedata[i]);
delay(10);
}
wr_byte(0);
SDA=0;
RST=0;
set_ds1302_WP();
}
/**
*读时钟数据(BCD格式)
*/
voidrd_time(uint8*timedata)
{
uint8i;
reset_ds1302();
RST=1;
wr_byte(DS1302_R_ADDR);
for(i=0;i<7;i++)
{
timedata[i]=rd_byte();
delay(10);
}
SDA=0;
RST=0;
}
voidds_init()
{
set_time(time);
}
3.4液晶显示屏显示模块
如上所述,当数字输入键盘有键按下的时候,经过程序识别,则会有相应结果被送入显示屏得到显示。
如果是数字键则直接放入液晶显示缓冲区,如果再次有数字键按下,则应将缓冲区的数字向高位移动一位,以构成两位数,之前输入的置之高位,并记录按键次数,每输入一个键值都调用显示程序出来;如果是运算符,则执行相应的运算,送入单片机芯片C51内进行计算后将结果调用显示程序显示结果。
该设计中选取的是RT1602-C型号液晶显示屏,如下图
图⑤显示电路
显示子程序
#include"1602.h"
//检验忙函数
voidcheck_busy()
{
do
{
RS=0;
RW=1;
P0=0xff;
E=0;
E=1;
}while(busy);
}
//写命令函数
voidwr_command(uint8com)
{
check_busy();
RS=0;
RW=0;
P0=com;
E=1;
delay(5);
E=0;
}
//写数据函数
voidwr_data(uint8dat)
{
check_busy();
RS=1;
RW=0;
P0=dat;
E=1;
delay(5);
E=0;
}
//1602显示函数
voiddisplay_1602(uint8addr,uint8*p)
{
wr_command(addr);
delay(10);
while(*p!
='\0')
{
wr_data(*p++);
delay(10);
}
}
//1602初始化函数
voidinit_1602()
{uint8i;
for(i=0;i<3;i++)
{
wr_command(0x30);
}
wr_command(0x38);
delay(10);
wr_command(0x01);
delay(10);
wr_command(0x06);
delay(10);
wr_command(0x0c);
}
3.5硬件元件清单
系统元器件清单见表
器件
单价
数量
总价
AT89C52
3.4元
1
3.4元
DS1302
0.65元
1
0.65元
RT1602-C(LCD)
9.9元
1
9.9元
有源蜂鸣器
0.53元
1
0.53元
电阻
排阻
0.5元
1
0.5元
10K
0.1元
2
0.2元
晶振
12MHZ
0.3元
1
0.3元
32.768KHZ
0.17元
1
0.17元
万能板
12*18
6.0元
1
6.0元
9*15
2.0元
1
2.0元
底座
AT89C52
2.1元
1
2.1元
DS1602
0.33元
1
0.33元
按键(大号)
0.14元
18
2.52元
杜邦线
0.15元
10
1.5元
电解电容
30PF
0.1元
2
0.2元
10UF
0.1元
1
0.1元
排针
0.16元
1
0.16元
排插
0.28元
1
0.28元
三极管NPN
0.2元
1
0.2元
总金额
31.76元
系统元器件清单
4.软件设计与仿真:
本系统程序包括主程序、键盘扫描子程序、发送键码子程序、发送数据子程序、接收命令子程序等。
主程序用于系统初始化,子程序调度等。
键盘扫描子程序用于扫描键盘状态,将被按键的位置号存入缓冲器中。
发送键码子程序用于将缓冲区键的接通码或断开码发送给单片机接口。
发送数据子程序用于将数据发给单片机接口。
接收命令子程序用于接收单片机接口发来的键盘命令。
4.1主程序设计
主程序通过键盘扫描子程序进行各行扫描是否有按键,消抖及重键处理:
通过软件上延时程序来消除抖动;采用后按键优先处理,即多键同时按下时,只重复发送最后按下键的扫描码。
。
图⑥主程序流程图
主程序
/*
*Easycalculator
*8位数的加,减,乘和整数的除法
#include"1602.h"
#include"keyscan.h"
#include"1302.h"
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;
for(i=0;i { BUZZER=~BUZZER; delay(10); } BUZZER=0; } //验证数据有效性超过8位数显示error。 bitcheck_num(int32number) { if(number>=100000000) return1; else return0; } //整数数据处理函数 voidmake_int(int32int_num) { bits_flag=0; int32sit; uint8i; if(int_num<0)//负数取反 { s_flag=1; int_num=-int_num; } ET0=0;//关显示扫描中断 for(i=8,sit=10000000;i<=14;i++,sit/=10)//number开头是否为0 { if(int_num/sit) break; else { zifu2[i]=''; int_num-=int_num/sit*sit; } } for(;i<=14;i++,sit/=10) { zifu2[i]=int_num/sit+'0'; int_num-=int_num/sit*sit; } zifu2[15]=int_num+'0'; if(s_flag) zifu2[0]='-'; else 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;break;//"+"运算 casesub: ans=temp1-temp2;break;//"—"运算 casemul: ans=temp1*temp2;break;//"*"运算 casediv: //"/"运算 if(temp2! =0)//判断除数是否为零,为0显示error! {ans=temp1/temp2;break;} else {err=1;break;} } 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; else temp1=ans; make_int(temp1); } else { ans=temp2; ans*=10; ans+=keycode; if(check_num(ans)) return; else temp2=ans; make_int(temp2); } } } //读ds1302 voidread_ds() { rd_time(timedata); lcdtime[11]=(timedata[0]&0x0f)+'0'; lcdtime[10]=(timedata[0]>>4)+'0'; lcdtime[8]=(timedata[1]&0x0f)+'0'; lcdtime[7]=(timedata[1]>>4)+'0'; lcdtime[5]=(timedata[2]&0x0f)+'0'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 单片机 简易 计算器
![提示](https://static.bdocx.com/images/bang_tan.gif)