苏ICP备112451047180号-6
基于C52单片机简易计算器设计
摘 要
利用C52单片机制作一个用数码管显示的四位数字简易计算器,简易计算器功能为若按下的是功能键则显示器上的数值不变,按下等于键后显示器显示出计算结果。当运算结果为五位数或者为负数时,蜂鸣器鸣叫,并进行报警提示,同时显示器也进行错误提示,按下清零键后报警现象消失。
关键词:C52单片机;数码管;计算器
目 录
1. 系统结构 4
2. 系统硬件及工作原理 4
3.1单片机最小系统 4
3.2按键输入模块 5
3.3数码管显示模块 5
3.4报警模块 6
4软件介绍 6
4.1程序流程图 6
4.2键盘扫描函数 7
4.3显示模块函数 11
4.4报警模块函数 13
5.结论 13
参考文献 13
致 谢 13
附录:主程序 14
结论
本设计制作一个基于STC89C52单片机简易计算器,基本上完成了简易加、减、乘、除功能。设计的介绍。经过自己的努力,也终于把作品焊接、调试成功。作品制作基本成功,但也还有很多待改善的地方。
参考文献
[1]郭天祥.《新概念51单片机C语言教程—入门、提高、开发、扩展全攻略》.北京:电子工业出版社,2009.
[2]邓会敏 李向阳 张文梅.《C语言程序设计教程》.北京:清华大学出版社,2013
[3]曹巧媛主编. 单片机原理及应用(第二版). 北京:电子工业出版社,2002
附录:主程序
#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
#define dxuan P0//定义数码管显示段选
#define wxuan P2//定义数码管显示位选
#define key P1//定义键盘接口
sbit OFF = P3^4;//定义关机键
sbit speaker=P2^4;
unsigned long int num1,num2;//进行运算的两个变量数
uchar num;////键盘扫描返回值
char flagkaiji,flagshu,flagfuhao,fuhao,newkey,update;
//flagkaiji开机标志 ,newkey新按键标志,fuhao运算符,update表示等于号
char key_shu;//按键值
unsigned char code Wei[]={0x10,0x20,0x40,0x80,};//四位共阳位选
unsigned char code Duan[]={0xc0,0xf9,0xa4,
0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
// 0~9编码及无显示编码
uchar saomiao();//键盘扫描函数
void display(unsigned long int );//数码管显示函数
void Speaker (unsigned long ) ;//蜂鸣器发声函数
void delay(uint n)//延时函数
{
while(n--);
}
/***********************************************
主函数
************************************************/
void main()
{
speaker=0;
flagkaiji=0;//标志关机
while(1)
{
if(saomiao()==15)//先进行开机检测,如果按下开机键
{
flagkaiji=1;//标志开机
num1=num2=fuhao=flagshu=newkey=0;//初始化变量
while(flagkaiji)// 当确认开机后
{
if(!flagfuhao)
{display(num1);//如果按下的是数字键,显示num1
}
else {
display(num2); //如果按下的是符号键键,显示num2
}
key_shu=saomiao(); //获取扫描到的键值
if(newkey==1)//有新键值,每扫描到一次按键行为,newkey就会置1
{
if(key_shu==15)//如果按下的是清零功能的ON/C键,
{
flagfuhao=0;update=0;// 全部初始化
num1=num2=fuhao=flagshu=newkey=0;//全部初始化
}
else if(key_shu==14&&flagshu==1&&fuhao)
//按下"=",数字键标志位为1,有数字键按下
{
switch(fuhao) //
{
case 10:num1=num2+num1;break;// 符号值为按键值,
case 11:num1=num2-num1;break;
case 12: num1=num2/num1;break;
case 13: num1=num2*num1;break;
}
fuhao=0; //运算完后,符号键值为零,switch失效
flagfuhao=0;update=1; //符号键标志位置零,
}
else if((key_shu>=0)&&(key_shu<=9))//按下数字键
{ flagfuhao=0;
//符号标志位置0,防止符号键运行,上一句else if失效
if(update)num1=0;
//如果上一步棸是计算完,先把shu1置0,进行下一步
if(num1<1000)
//△ 控制数码管能显示几位数字,△shu1超过这个数,再按键无效不会存入shu1中,
{num1=key_shu+num1*10;
//这步是关键,单个按键值通过对单一变量乘10来变成多位数
flagshu=1;//标志数按下了数字键
}
update=0;
//运算标志位,也是更新shu1,更新由update标志进入后执行更新shu1语句,置零,避免进入
}
else if((key_shu>=10)&&(key_shu<=13))//按下运算符
{
flagfuhao=1;update=0;
if(flagshu==1)// 如果之前按下了数字键
{
if(fuhao==0)//如果没按符号键,是在按下了运算符的情况
{
num2=num1;num1=0; //把shu1的值赋给shu2,
fuhao=key_shu;flagshu=2;
}
else
{
switch(fuhao)
{
case 10:num2=num2-num1;break;
case 11:num2=num2+num1;break;
case 12:num1=num2/num1;break;
case 13:num1=num2*num1;break;
}
num1=0;fuhao=key_shu;
}
}
else if(flagshu==2)
fuhao=key_shu;
}
newkey=0;
}
}
}
}
}