基于51单片机的红外数码管计算器

合集下载

(完整版)基于51单片机的数码管简易计算器

(完整版)基于51单片机的数码管简易计算器

基于51/52单片机的简易计算器制作11级自动化2班王栎斐宋为为闫巨东一、题目利用单片机芯片STC89C52、四位八段共阳数码管及已制作好的电路板等器件设计制作一个计算器。

二、任务与要求要求计算器能实现加减乘除四种运算具体如下1. 加法:四位整数加法计算结果若超过八位则显示计算错误2. 减法:四位整数减法计算结果若超过八位则显示计算错误3. 乘法:多位整数乘法计算结果若超过四位则显示计算错误4. 除法:整数除法5. 有清除功能三、课程设计简述总体设计思路简述1.按照系统设计的功能的要求初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成。

主控芯片使用STC89C52单片机。

2.键盘电路采用4*4矩阵键盘电路。

3.显示模块采用共阳极数码管构成。

四、硬件电路五、软件编程部份#include<reg52.h>#define uchar unsigned char#define uint unsigned int//uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴极// 0 1 2 3 4 5 6 7 8 9 熄灭-//uchar code loc[]={0xff,0xfe,0xfd,0xfb,0xf7};//uchar code ero[]={0x79,0x50,0x5c};uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x40};//共阳极uchar code loc[]={0x00,0x80,0x40,0x20,0x10};uchar code ero[]={~0x79,~0x50,~0x5c};uint n=0,n1=0,n2=0; //赋初值uchar flag=0; //计算类型选择关键字void delay(int t);void display(int n);void error();main(){while(1){uchar temp;//第一行检测P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xfe;if(temp!=0xfe){temp=P3;switch(temp){case 0xee:n1=0;n2=0;n=0;flag=0;break; //清零case 0xde:n1=10*n1+0;n=n1;break;case 0xbe: if(flag==1)n=n2+n1; //=if(flag==2)n=n2-n1;if(flag==3)n=n2*n1;if(flag==4)n=n2/n1;n1=0;break;case 0x7e: // +n2=n1;n1=0;flag=1;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第二行P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xed:n1=10*n1+1;n=n1;break; //4case 0xdd:n1=10*n1+2;n=n1;break; //5case 0xbd:n1=10*n1+3;n=n1;break; //6case 0x7d:// -n2=n1;n1=0;flag=2;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第三行P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:n1=10*n1+4;n=n1;break;case 0xdb:n1=10*n1+5;n=n1;break;case 0xbb:n1=10*n1+6;n=n1;break;case 0x7b: // *n2=n1;n1=0;flag=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//扫描第四行P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:n1=10*n1+7;n=n1;break; //7case 0xd7:n1=10*n1+8;n=n1;break; //8case 0xb7:n1=10*n1+9;n=n1;break; //9case 0x77: // /n2=n1;n1=0;flag=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}display(n);}}//延时函数void delay(int t){int x,y;for(x=0;x<t;x++)for(y=0;y<t;y++);}//数码管显示void display(int n){//溢出处理uchar g,s,b,q;int abs;if((n>9999)||(n<-999)) error();//正数if((n>=0)&&(n<=9999)) {g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;P0=num[g];delay(5);P2=loc[4];delay(2);P2=loc[0];delay(3);if(n>=10){P0=num[s];P2=loc[3];delay(2);P2=loc[0];delay(3);}if(n>=100){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(3);}if(n>=1000){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(3);}}//负数if((n<0)&&(n>=-999)){abs=-n;g=abs%10;s=abs/10%10;b=abs/100%10;q=abs/1000%10;P0=num[g];P2=loc[4];delay(2);P2=loc[0];delay(2);if((abs/10%10>0)||(abs/100%10>0)){P0=num[s];P2=loc[3];;delay(2);P2=loc[0];delay(2);if((abs/100%10>0)){P0=num[b];P2=loc[2];delay(2);P2=loc[0];delay(2);if((abs/1000%10>0)){P0=num[q];P2=loc[1];delay(2);P2=loc[0];delay(2);}else{P0=num[11];P2=loc[1];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[2];delay(2);P2=loc[0];delay(2);}}else{P0=num[11];P2=loc[3];delay(2);P2=loc[0];delay(2);}}}//溢出显示void error(){P2=loc[1];P0=ero[0];delay(2);P2=loc[0];delay(3);P2=loc[2];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[3];P0=ero[1];delay(2);P2=loc[0];delay(3);P2=loc[4];P0=ero[2];delay(2);P2=loc[0];delay(3); }。

基于51单片机的计算器设计

基于51单片机的计算器设计

基于51单片机的计算器设计计算器作为一种常用的电子设备,广泛应用于各个领域。

在本文中,我们将基于51单片机来设计一个简单的计算器,并对其进行详细介绍。

一、设计目标我们所设计的计算器需要具备以下功能:1.实现基本的算术运算,包括加、减、乘、除等;2.具备显示功能,能够将输入和运算结果以数字的形式显示在液晶屏上;3.提供清零和删除功能,方便计算器的操作;4.具备较高的计算精度和稳定性。

二、硬件设计计算器的硬件设计主要包括键盘输入、液晶屏输出和计算程序控制三个部分。

1.键盘输入为了简化设计的复杂度,我们采用矩阵键盘来实现输入功能。

矩阵键盘由多个行和多个列交叉连接而成,通过扫描行和列的方式来检测键盘输入的按键信息。

2.液晶屏输出我们选择16x2字符液晶显示屏来作为计算结果的输出设备。

这种液晶屏可以显示16个字符,每个字符由5x8像素点阵组成,具备较好的显示效果。

3.计算程序控制我们将基于51单片机来编写计算器的计算程序,并通过电路连接键盘输入和液晶屏输出设备。

通过读取键盘输入的按键信息,计算程序能够判断用户输入的数字和操作符,并进行相应的计算操作。

最后,计算结果将以数字的形式显示在液晶屏上。

三、软件设计计算器的软件设计主要包括键盘扫描与输入处理、计算程序控制和液晶屏显示三个模块。

1.键盘扫描与输入处理通过循环扫描矩阵键盘的行和列,可以得到按键信息。

根据按键信息的不同,我们可以判断用户输入的数字和操作符,并将其传递给计算程序模块进行处理。

同时,我们需要对一些特殊按键(如清零和删除)做特殊处理。

2.计算程序控制计算程序模块将根据键盘输入的数字和操作符,进行相应的算术运算。

我们可以采用栈的数据结构来处理运算符和运算数,以实现复杂的算术运算。

3.液晶屏显示计算结果将以数字的形式显示在液晶屏上。

我们可以通过51单片机的GPIO口控制液晶显示屏的操作,包括写入指令和写入数据。

通过设定光标位置及写入数字数据,可以将计算结果显示在液晶屏的指定位置上。

基于51单片机的简易计算器

基于51单片机的简易计算器

基于51单片机的简易计算器51单片机是一种广泛应用于嵌入式系统中的常用微控制器。

我们可以利用51单片机的强大功能和丰富的外设资源,设计一个简易计算器。

这个计算器可以进行基本的加减乘除运算,并且具备显示结果的功能。

首先,我们需要准备一块51单片机开发板,一块1602液晶显示屏模块,以及一些按键开关和电阻。

我们可以将运算器主要分为以下几个模块:数码管显示模块、键盘输入模块、运算模块和存储模块。

数码管显示模块:我们使用1602液晶显示屏模块来显示计算器的结果。

我们可以通过51单片机的IO口,将计算结果发送给液晶显示屏模块,实现结果的显示。

键盘输入模块:我们可以使用几个按键开关来实现数字和运算符的输入。

通过对按键的检测,我们可以将用户输入的数字和运算符转化为字符形式,并保存到内存中。

运算模块:我们需要根据用户输入的数字和运算符,进行相应的运算。

我们可以使用栈来实现这个功能。

栈是一种常用的数据结构,具有"先进后出"的特点。

我们可以将用户输入的数字和运算符按照一定的规则入栈,然后按照相应的顺序进行出栈和运算。

最后将结果保存到内存中。

存储模块:我们可以使用内部RAM来保存运算结果。

51单片机的内部RAM具有一定的存储能力,可以满足我们的基本需求。

在编写程序时,我们可以使用汇编语言或者C语言。

通过合理的编程,我们可以实现计算器的各项功能。

总结一下,基于51单片机的简易计算器主要包括数码管显示模块、键盘输入模块、运算模块和存储模块。

我们可以通过合理的编程,将这些模块相互配合,实现一个功能完善的计算器。

这个计算器不仅可以进行基本的加减乘除运算,还可以显示结果,方便用户进行计算。

基于51单片机红外计数器设计毕业设计(论文)

基于51单片机红外计数器设计毕业设计(论文)

毕业设计论文红外线自动计数器的设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。

除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。

本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

基于51单片机的计算器(附Proteus仿真图且程序有详细注释)

基于51单片机的计算器(附Proteus仿真图且程序有详细注释)
case 0x7b: key=11;flag1=1;display(7,0);break;
}
while(temp!=0xf0)
{
temp=P1;temp=temp&0xf0;
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
x--;
delay(3);
}
}
}
else if ((flag1==1)&&(flag2==1))
{
for(i=7;i>=px3;i--)
{
display(i,RESUIT[i]);
delay(3);
}
}
}
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P1;
switch(temp)
{
case 0xee: key=0;flag=1;break;
case 0xde: key=1;flag=1;break;
case 0xbe: key=2;flag=1;break;
{
k=k*10;
}
x1=x1+k;
}
x1=x1+DATA1[px1-1];
for(i=0;i<(px2-1);i++) //把第二个数组中的数处理成十进制数
{
k=DATA2[i];
for(j=0;j<(px2-i-1);j++)

基于51单片机的红外遥控计算器程序(附电路图,注释详细)

基于51单片机的红外遥控计算器程序(附电路图,注释详细)

/*************************基于51单片机的红外遥控计算器程序****************/ /****本程序用基于TC9012遥控器可直接操作,电路图,遥控器编码图在最后****/ #include<reg52.h>#include<stdio.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define lint unsigned long intsbit IR=P3^2; //红外接口标志bit irpro_ok,irok;uchar irtime,X,mir,fir; //红外用全局变量uchar IRcord[4], irdata[33];uchar DA TA1[8]={0,0,0,0,0,0,0,0}; //第一个数uchar DA TA2[8]={0,0,0,0,0,0,0,0}; //第二个数uchar RESUIT[8]={0,0,0,0,0,0,0,0}; //结果uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量uchar temp,key,fang1,fang2;lint x1=0,x2=0,y=0; //输入的数及其结果void delay(msx); //ms延时函数void Init(); //系统初始化void INTInit(); //中断初始化void Ircordpro(); //红外码值处理函数void keyscan(); //键值检测void delay(uint); //延时void DataOper(); //数据运算void DataHandle(); //数据接收void DisplayHandle(); //显示处理void display(uchar,uchar); //数码管显示函数void main(){INTInit();P0=0x00;while(1){keyscan();DataHandle();DisplayHandle();}}void INTInit(){TMOD=0x02; //定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //reload valueTL0=0x00; //initial valueET0=1; //开中断TR0=1;IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)EX0 = 1; // Enable EX0 InterruptEA = 1;}void Init() //初始化,所有数据归零{uchar i;px1=0;px2=0;px3=0;flag=0;flag1=0;flag2=0;flag3=0;f1=0;f2=0;f3=0;f4=0;x1=0;x2=0;y=0;for(i=0;i<8;i++){DA TA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}}void delay(msx) //msx为延时毫秒数{uint i,j;for(i=0;i<=msx;i++)for(j=0;j<=110;j++);}void display(uchar n,uchar m) //n是第几只数码管,m是显示的数字是多少{P0=P0&0x80;P0=P0|(n<<4);P0=P0|m;}void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++;}void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{if(fir){if(irtime<49&&irtime>=31)mir=0; //4.5ms+4.5msirdata[mir]=irtime;irtime=0;mir++;if(mir==33){irok=1;mir=0;fir=0;}}else{irtime=0;fir=1;}}void Ircordpro(void) //红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7) value=value|0x80;else value=value;if(j<8)value=value>>1;k++;}IRcord[i]=value;value=0;}if((IRcord[0]=~IRcord[1])&&(IRcord[2]=~IRcord[3])) {X=IRcord[2];fang2=1;}}void keyscan() //矩阵键值扫描子函数{if(irok){Ircordpro();irok=0;fang1=1;}if((fang1==1)&&(fang2==1)){fang1=0;fang2=0;switch(X){case 0x08: key=0;flag=1;break;case 0x01: key=1;flag=1;break;case 0x02: key=2;flag=1;break;case 0x03: key=3;flag=1;break;case 0x05: key=4;flag=1;break;case 0x06: key=5;flag=1;break;case 0x07: key=6;flag=1;break;case 0x09: key=7;flag=1;break;case 0x0A: key=8; flag=1;break;case 0x0B: key=9; flag=1;break;case 0x10: key=10;flag1=1;display(7,0);break;case 0x1A: key=11;flag1=1;display(7,0);break;case 0x16: key=12;flag2=1;Init();break;case 0x11: key=13;flag2=1;DataOper();break;case 0x15: key=14;flag1=1;display(7,0);break;case 0x19: key=15;flag1=1;display(7,0);break;}}}void DataOper(){uchar i,j,m=0;lint k=0;for(i=0;i<(px1-1);i++) //把第一个数组中的数处理成十进制数{k=DATA1[i];for(j=0;j<(px1-i-1);j++){k=k*10;}x1=x1+k;}x1=x1+DATA1[px1-1];for(i=0;i<(px2-1);i++) //把第二个数组中的数处理成十进制数{k=DATA2[i];for(j=0;j<(px2-i-1);j++){k=k*10;}x2=x2+k;}x2=x2+DATA2[px2-1];if(f1==1) y=x1+x2; //根据标志位进行运算else if(f2==1) y=x1-x2;else if(f3==1) y=x1*x2;else if(f4==1) y=x1/x2;RESUIT[0]=y/10000000; //把各位分离出来存入结果数组中RESUIT[1]=(y%10000000)/1000000;RESUIT[2]=(y%1000000)/100000;RESUIT[3]=(y%100000)/10000;RESUIT[4]=(y%10000)/1000;RESUIT[5]=(y%1000)/100;RESUIT[6]=(y%100)/10;RESUIT[7]=y%10;while(!RESUIT[m]) m++;px3=m;}void DataHandle() //把每次按键的结果记录下来,并存到适当的位置{if((key<10)&&(flag==1)&&(flag1==0)){DATA1[px1]=key;px1++;flag=0;}else if((key<10)&&(flag==1)&&(flag1==1)){DATA2[px2]=key;px2++;flag=0;}else if(flag1==1){switch(key){case 10 : f1=1;f2=0;f3=0;f4=0;break; // "+"case 11 : f1=0;f2=1;f3=0;f4=0;break; // "-"case 14 : f1=0;f2=0;f3=1;f4=0;break; // "*"case 15 : f1=0;f2=0;f3=0;f4=1;break; // "/"}}}void DisplayHandle() //将数据显示在数码管上{uchar i,x;if((flag1==0)&&(flag2==0)){x=px1;if(px1==0) display(7,0);else{for(i=0;i<px1;i++){display(8-x,DA TA1[i]);x--;delay(5);}}}else if((flag1==1)&&(flag2==0)){x=px2;if(px2==0) display(7,0);else{for(i=0;i<px2;i++){display(8-x,DA TA2[i]);x--;delay(3);}}}else if ((flag1==1)&&(flag2==1)){for(i=7;i>=px3;i--){display(i,RESUIT[i]);delay(3);}}}。

基于51单片机的计算器开题报告

基于51单片机的计算器开题报告

主要研究内容
本系统的研究分三部分:
1.探头选择。
2.软件设计。
3.语音报警。
实验设计
8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。
主要参考文献(研究综述:作者、题目、杂志、卷号、页码)
【1】杨文龙编.单片机原理及应用[M].西安:西安电子科技大学出版社,2005.
【2】杨将新,李华军编.单片机程序设计及应用[M].北京:电子工业出版社,2006.
【3】陈有卿,张晓东编.报警集成电路和报警器制作实例[M].北京:北京人民邮电出版社2001.
(2)以MCS-51单片机为核心,开发一个完整)使用Protel软件,绘制原理图、PCB,并进行元器件安装、焊接及调试检测达到预期的目的。
论文(设计)拟定提纲
第一部分:引言
第二部分:单片机计算器的设计方案
第三部分:硬件、软件的设计
第四部分:安装、调试
第五部分:结论、致谢、参考文献与附录
指导教师意见及建议
签字:年月日
课题答辩组意见及建议
组长签字:年月日
系主任意见
签字:年月日
闽西职业技术学院电气工程系








班级:
学号:姓名:指导老师:
毕业设计开题报告
论文(设计)题目
基于单片机的红外线监控报警器设计
学生姓名
林文虎
系、专业
应用电子
指导教师
林金亮

基于51单片机计算器设计

基于51单片机计算器设计

基于51单片机计算器设计计算器是一种常见的电子设备,可以进行数学运算、数据处理等功能。

本文将基于51单片机进行计算器设计。

一、设计目标:1.实现基本的数学运算功能,如加减乘除、取余等。

2.能够进行复杂的数学运算,如平方、开方等。

3.具备记忆功能,能够存储中间结果和运算符号。

4.设置输入界面,允许用户输入数字和操作符。

5.显示运算结果和中间过程。

二、硬件系统设计:1.使用51单片机作为主控芯片,具有高集成度和处理能力。

2.连接光栅液晶显示屏,用于显示数值和操作符。

3.连接矩阵键盘,用于获取用户的输入。

4.连接电源电路,保证计算器正常运行。

三、软件系统设计:1.确定界面设计,包括数值显示区、操作符显示区和功能键区。

2.设计输入处理模块,根据用户输入获取相应的数值和操作符,并进行相应的处理。

3.设计运算模块,根据用户输入的操作符进行相应的数学运算,并将结果存储起来。

4.设计显示模块,将计算结果和中间过程显示在液晶屏上。

5.设计存储模块,用来存储中间运算结果和操作符号。

四、软件流程设计:1.系统初始化:包括设置显示模式、清零中间结果等。

2.输入处理:通过矩阵键盘输入数字和操作符,并进行相应的处理。

3.运算处理:根据用户输入的操作符,进行相应的数学运算,并将结果存储起来。

4.结果显示:将计算结果和中间过程显示在液晶屏上。

5.存储结果:将计算结果和操作符存储起来,以备后续计算。

五、测试和调试:在设计完成后,需要进行系统测试和调试,确保计算器的各项功能正常运行。

首先进行单元测试,验证各个模块的功能是否按照设计要求正确执行。

然后进行综合测试,模拟用户输入各种情况下的运算过程,检测是否能够正确进行运算并显示结果。

如果发现问题,则进行调试和修改,直到计算器满足设计要求。

六、总结:基于51单片机进行计算器设计,可以实现基本的数学运算功能,并具备记忆功能。

设计步骤包括确定硬件系统和软件系统设计,设计界面、输入处理、运算处理、显示和存储模块,进行测试和调试确保计算器功能正常运行。

基于51单片机的红外计数器的设计

基于51单片机的红外计数器的设计
(2)光标归位指令
指令如表3-4所示
表3-4光标归位指令功能表
指令功能
指令编码
执行时间/ms
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
光标归位
0
0
0
0
0
0
0
0
0
X
1.64
功能:
1)初始化光标位置;
2)地址计数器即AC的数值被设为零;
(3)进入模式设置指令,如表3-5所示
表3-5进入模式设置指令表
3.2
3.2.1
(1)概述
STC89C51单片机属于80C51系列,它属于STC公司的一款芯片,在工业领域、电子产品和通讯方面都有所应用,也是现在较为普遍的一款集成芯片。STC89C51有集成8位CPU、4K字节的ROM、128字节的RAM、寻址范围64K,并有控制功能较强的布尔处理器。
(2)主要功能特性
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
8位双向数据线
2
VDD
电源正极
10
D3
8位双向数据线
3
VL
液晶显示偏压
11
D4
8位双向数据线
4
RS
数据/命令选择
12
D5
8位双向数据线
5
R/W
读/写选择
13
D6
8位双向数据线
6
E
使能信号
14
D7
8位双向数据线
7
D0
8位双向数据线
15
BLA

基于51单片机的红外计数系统设计

基于51单片机的红外计数系统设计

摘要摘要本文介绍了一款以单片机AT89S52为控制器的红外计数系统的设计。

该系统可实现对人流量的监测、实时显示以及存储。

系统采用PC机作为上位机,AT89S52单片机为下位机,二者可相互通信。

单片机实时监测显示人流量信息,并向上位机发送人流量信息。

同时上位机也可以向单片机发送控制命令并且可存储导出人流量信息。

PC机与单片机之间的通信采用RS-232C通信标准来实现。

除此之外,该系统只占用了单片机少量的I /O口和内存,为系统留下了功能扩展的空间。

关键字:单片机、红外对射管、串口通信、上位机控制IABSTRACTABSTRACTThis paper introduces a design of infrared counting system based on MCU AT89S52. The system is able to monitor the flow rate of visitors of which data can be displayed real-timely and stored. In this system, the PC serves as upper computer as well as MCU AT89S52 serves as lower computer. Communication between the upper and lower computer acts like the process that MCU AT89S52 sends the information of the flow rate of visitors being monitored to PC which can stores it and sends control commands in response. The communication applies the RS-232C communications standards.In addition, the system takes up only a small amount of the MCU I/O ports and memory capacity, so that the system has much functional space for expansion.Key words: MCU, infrared shooting tube, serial communication, PC controlII目录第一章引言 (1)1.1单片机发展简述 (1)1.2单片机应用综述 (2)1.3 背景及意义 (2)第二章系统总体方案及硬件平台设计 (4)2.1 设计内容 (4)2.2 技术指标 (4)2.3 总体方案设计 (5)2.3.1 硬件总体方案设计 (5)2.3.2 软件总体方案 (7)2.4 硬件平台设计 (9)2.4.1 控制单元设计 (10)2.4.2 译码电路设计 (12)2.4.3 驱动电路设计 (14)2.4.4 通信系统硬件设计 (16)2.4.5 红外对射收发器设计 (18)2.4.6 显示电路设计 (19)2.5 系统开发流程 (20)第三章软件系统设计 (22)3.1 软件总体设计 (22)3.2 下位机程序设计 (22)3.2.1 Keil 开发环境 (23)3.2.2 串口通信程序设计 (23)3.2.3 数码管显示程序设计 (26)3.2.4 数据处理程序设计 (29)3.3 上位机程序设计 (31)3.3.1 VB6.0开发环境 (32)3.3.2 串口通信部分程序部分 (32)III3.3.3 控制及功能程序部分 (36)3.3.4 显示模块 (42)第四章系统调试 (44)4.1 硬件原理以及软件联合仿真 (44)4.1.1 proteus仿真 (44)4.2 硬件平台调试 (45)4.2.1 短路与虚焊检测 (46)4.2.2 上电测试 (47)4.2.3 串口调试 (47)4.3 软件系统调试 (48)4.4 系统联调 (49)4.5 调试结果及分析 (50)第五章结束语 (51)参考文献 (53)致谢 (54)附录1:硬件原理图 (55)附录2:设计程序 (56)附录3:系统PCB图 (73)外文资料原文 (74)外文资料译文 (76)IV第一章引言第一章引言1.1 单片机发展简述单片机(Microcontrollers)诞生于1971年,经历了SCM、MCU、SoC三大阶段,早期的SCM单片机都是8位或4位的。

基于单片机的红外计数器设计

基于单片机的红外计数器设计

基于单片机的红外计数器设计红外计数器是一种利用红外传感器来检测物体通过的数量的装置。

它通常用于人员或物品数量统计的应用中。

本文将介绍基于单片机的红外计数器的设计原理和实现方法。

首先,我们需要明确设计的目标。

本计数器将用于统计通过固定区域的物体数量。

而红外传感器将用于检测物体的通过。

当物体途经红外传感器时,传感器会发出红外光束,通过物体的遮挡程度来检测物体是否通过。

通过计数和记录每次检测到物体通过的事件,我们就可以实现数量的统计。

接下来,我们需要选择合适的单片机来实现红外计数器。

常见的单片机有AVR、PIC和ARM等。

考虑到我们的功能需求和成本效益,我们可以选择一款性能适中且价格合理的AVR单片机。

在硬件方面,我们需要准备以下器件:1. 红外传感器:选择一款可靠的红外传感器,具有较高的灵敏度和稳定性。

2. 单片机:选择合适的AVR单片机,能够满足计数和通信需求。

3. 显示屏:为了实时显示计数结果,我们可以选择一个小型LCD显示屏。

4. 其他电子元件:如电阻、电容、继电器等,用于连接和支持电路。

在软件方面,我们需要编写单片机的代码,以实现正确的计数和显示功能。

首先,我们需要初始化红外传感器和LCD显示屏。

然后,编写中断服务程序,当红外传感器检测到物体通过时,中断服务程序会触发,并对计数器进行更新。

最后,我们需要编写主程序,用于控制计数器的行为和LCD显示屏的更新。

需要注意的是,为了保证计数的准确性,我们可能需要考虑避免因传感器噪声、环境光干扰或物体堆叠而引起的计数错误。

我们可以通过设置适当的检测阈值、使用滤波算法或加入其他传感器辅助来解决这些问题。

综上所述,基于单片机的红外计数器设计包括硬件和软件两个方面。

在选择合适的单片机和红外传感器的基础上,通过合理编写代码和进行适当的优化,我们可以设计出一个功能稳定、准确计数的红外计数器。

基于51单片机的计算器设计

基于51单片机的计算器设计

基于51单片机的计算器设计一、引言计算器(Calculator)是一种专用的电子计算设备,用于简便地进行基本数学计算。

随着科技的发展,计算器的功能也逐渐丰富,并在日常生活中得到广泛应用。

本文将介绍一种基于51单片机的计算器设计方案,以满足人们对计算器的基本需求。

二、设计方案1.硬件设计(1)51单片机:作为计算器的核心,负责处理各项计算任务。

(2)显示屏:用于显示用户输入的数据和计算结果。

(3)按键模块:用于接收用户输入的数字和操作符。

(4)存储器:用于存储用户输入的数据和计算结果。

(5)电源模块:用于为计算器供电。

2.软件设计计算器的软件设计主要包括输入处理、运算处理和输出显示三个模块。

(1)输入处理:当用户按下数字键或操作符键时,计算器会根据当前输入的字符进行相应的处理。

例如,数字键按下后,将数字添加到当前输入的数字中;操作符键按下后,将当前输入的数字和操作符添加到存储器中。

(2)运算处理:当用户按下等号键时,计算器会根据存储器中的数字和操作符进行相应的运算处理。

例如,当存储器中包含两个数字和一个操作符时,计算器会根据操作符进行相应的运算,并将结果保存到存储器中。

(3)输出显示:当计算器完成运算处理后,将结果显示在显示屏上供用户查看。

同时,计算器还需要提供清除键和退格键等功能,以方便用户进行操作。

三、实现步骤1.初始化:将51单片机的各引脚设置为输入或输出,并设置相应的初始参数。

同时,初始化存储器、显示屏和按键模块等硬件设备。

2.输入处理:通过按键模块检测用户输入,并根据当前输入的字符进行相应的处理。

例如,当用户按下数字键时,将数字添加到当前输入的数字中;当用户按下操作符键时,将当前输入的数字和操作符添加到存储器中。

3.运算处理:当用户按下等号键时,计算器会根据存储器中的数字和操作符进行相应的运算处理。

例如,当存储器中包含两个数字和一个操作符时,计算器会根据操作符进行相应的运算,并将结果保存到存储器中。

基于51单片机红外计数器设计(毕业论文)

基于51单片机红外计数器设计(毕业论文)

红外线自动计数器的设计摘要随着今社会的飞速发展,越来越多的流水线上的产品和各种公共场所需要进行自动计数。

基于单片机构成的产品自动计数器有直观和计数精确的优点,目前已在各种行业中得到广泛应用。

数字计数器有多种形式,总体来说有接触式和非接触式两种,在科技发展的今天,非接触式红外计数器得到了广泛的应用。

本设计采用一对红外发射接收管作为红外计数器的信号检测头,具有价格低廉,抗干扰性好,结构简单,操作方便等特点。

指导思想是利用红外发光管发射红外线,红外接收管接收此红外线,并将其放大、整流形成低电平信号.当有人或物挡住红外光时,接收管没有接收到红外信号,放大器将输出高电平,同时将这个电平信号送入单片机进行控制计数,并且使数码管显示数值。

这样就得到要统计的人或物的数量。

关键字:自动计数;单片机;数码管目录第一章绪论 (4)1.1、前言 (4)1.2、选题背景 (4)1.3、设计要求 (5)1.4、国内外的研究概况 (5)1.5、此次设计研究的主要内容应解决问题 (5)第二章基于单片机构成的产品自动计数器的设计 (6)2.1、方案论证与选择 (6)2.2、系统总体框图和原理 (8)2.3、系统单元电路设计 (9)2.3.1、电源供电电路 (9)1. 桥式整流电路: (10)虑波电路分析 (11)稳压电路 (12)2.3.2、红外线检测部分 (13)2.3.3、数码管显示部分 (14)2.3.3.1、LED数码管的特点: (15)2.3.3.2、数码管动态扫描....... 错误!未定义书签。

2.3.3.3、数码管驱动部分 (16)2.3.3.4、单片机计数及控制部分 (17)复位电路 (21)复位电路的分类 (21)3.4、系统程序设计 .................. 错误!未定义书签。

3.4.1、程序流程图................ 错误!未定义书签。

3.4.2、程序设计 .................... 错误!未定义书签。

基于51单片机的计算器

基于51单片机的计算器

二、 实验环境 Keil 软件和 protus 软件 三、 实验内容 计算器中存在很多数据,数据的输入需要很多按键,那么这就 要涉及到按键的检测问题,同时产生的数据要送到单片机中进行处 理,处理完的数据要送到数码管上显示出来。 实验仿真图如下:
图 1 实验仿真图 (由于我的开发板上面 P2^3 脚接Байду номын сангаас蜂鸣器,仿真图中就没有用到
} else return 20; } else return 20; } void main() { uchar k,i,hand,h2; bit xsd=0; char data e; double data temp,h1=0,h3=0,h4=0; displaypro(0); while(1) { k=keyscan(); if(k==20) hand=0; for(i=0;i<8;i++) { wela=1; P0=led[i]; wela=0; P0=0xff; dula=1; P0=xx[i]; dula=0; delay(20); P0=0xff; } switch(k) { case 20:break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: if(hand==0) { h4=0;
} if(h2==0) { h1=sqrt(h1); displaypro(h1); } else if(h3==0) { h1=sqrt(h1); displaypro(h1); h2=0; } else { h3=sqrt(h3); displaypro(h3); } xsd=0;e=0; } hand++; break; case 16:if(hand==0)//小数点 { xsd=1; } hand++; break; case 17:if(hand==0)// 1/x { if(h4!=0) { h1=h4; h4=0; } if(h2==0) { h1=1/h1; displaypro(h1); } else if(h3==0) { h1=1/h1;

(完整)基于51单片机的简易计算器设计

(完整)基于51单片机的简易计算器设计

(完整)基于51单片机的简易计算器设计基于51单片机的简易计算器设计计算器作为一种常见的电子设备,既能满足日常生活的计算需求,又能帮助人们提高工作效率。

本文将介绍基于51单片机的简易计算器的设计。

该计算器具备加减乘除的基本计算功能,并支持用户输入和结果显示。

下面将从材料准备、电路连接和程序设计三个方面详细介绍该计算器的设计。

一、材料准备在设计计算器之前,我们需要准备以下材料:1. 51单片机开发板:用于控制计算器的整个运行过程;2. 液晶显示屏:用于显示用户输入的数字和计算结果;3. 数字按键:用于用户输入数字和运算符;4. 连接线:用于连接51单片机开发板、液晶显示屏和数字按键。

二、电路连接1. 连接液晶显示屏和51单片机开发板:将液晶显示屏的VCC、GND、SCL和SDA引脚分别与开发板上对应的引脚连接。

2. 连接数字按键和51单片机开发板:将数字按键的引脚依次与开发板上的IO口引脚连接,其中有一根引脚需要连接到开发板的中断口。

三、程序设计1. 初始化设置:在程序开始时,进行液晶显示屏和数字按键的引脚初始化设置,以及相应的中断设置。

2. 输入处理:通过数字按键输入,获取用户输入的数字和运算符,并将其保存到相应的变量中。

3. 运算处理:根据用户输入的运算符,对相应的数字进行加、减、乘、除的运算,并将结果保存到一个变量中。

4. 结果显示:将运算结果显示在液晶显示屏上,以便用户查看计算结果。

5. 重置处理:在每次运算结束后,对相关变量进行重置,以便下一次计算。

通过以上程序设计,我们可以完成基于51单片机的简易计算器的设计。

在实际使用过程中,用户只需要通过数字按键输入相应的数字和运算符,计算器就可以自动进行运算,并将结果显示在液晶显示屏上,方便用户进行查看。

总结本文介绍了基于51单片机的简易计算器的设计。

通过合理的材料准备、电路连接和程序设计,我们可以实现一个具备加减乘除功能的计算器。

该计算器不仅能满足人们日常的计算需求,还能帮助提高工作效率。

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计

基于51单片机的简易计算器设计设计一个基于51单片机的简易计算器,主要功能包括加减乘除四则运算和百分数计算。

下面是设计的详细步骤:1.硬件设计:-使用51单片机作为主控芯片。

-连接16x2的LCD显示屏,用于显示输入和计算结果。

-连接16个按键开关,用于输入运算符和数字。

-连接4个LED灯,用于指示四则运算的选择。

2.软件设计:-初始化LCD显示屏,并显示欢迎信息。

-监听按键输入,在接收到输入后,根据输入的按键值判断操作类型。

-如果按键值对应数字键,保存输入的数字,并在LCD上显示当前输入的数字。

-如果按键值对应四则运算符(+、-、*、/),保存当前输入的数字,并保存运算符。

-如果按键值对应等号(=),根据保存的数字和运算符进行相应的运算,计算结果保存并显示在LCD上。

-如果按键值对应清零(C),将所有保存的数据清空,并显示初始状态。

-如果按键值对应百分号(%),将当前数字除以100并显示在LCD上。

3.主要函数说明:- void init_lcd(:初始化LCD显示屏。

- void display_lcd(char* str):将指定字符串显示在LCD上。

- void clear_lcd(:清空LCD显示屏。

- char get_key(:获取按键输入的值。

- void calculate(:根据保存的数字和运算符进行计算。

- void add_digit(char digit):将输入的数字添加到当前数字中。

- void set_operator(char op):保存运算符。

- void clear_data(:清空所有保存的数据。

4.主要流程:-初始化LCD显示屏并显示欢迎信息。

-在循环中监听按键输入,并根据输入的按键值进行相应的操作。

-根据不同的按键值,调用不同的函数进行处理。

-最后计算结果显示在LCD上。

以上是基于51单片机的简易计算器设计的详细步骤和主要函数说明。

你可以根据这个设计框架进行具体的代码实现。

51单片机数码管计算器的原理

51单片机数码管计算器的原理

51单片机数码管计算器的原理
51单片机数码管计算器的原理
1. 引言
51单片机数码管计算器是一款基于51单片机的嵌入式微控制器,可以实现基本的数学运算,具有简单、实用的特点。

2. 基本原理
该计算器主要由51单片机、数码管显示器以及按键组成。

当用户输入运算符和数字后,计算器会通过按键扫描获取输入,并根据运算符确定具体计算方式。

计算结果会在数码管上进行显示。

3. 系统设计
a. 硬件设计
该计算器采用了通用扫描键盘进行输入,通过定时器产生频率一定的脉冲信号,从而实现按键输入的检测和判断。

同时,采用了数码管进行计算结果的显示。

b. 软件设计
该计算器需要编写实时监控程序进行键盘输入检测、计算运算符和数字,最终输出结果。

具体实现时,可以采用循环检测方式,保证计算器能够平稳地运行。

4. 主要功能及实现过程
a. 加减乘除运算:通过按键进行输入,然后根据加减乘除不同运算方式进行计算,最终得出结果。

b. 括号运算:通过读取括号内的计算式,然后按照优先级依次进行运算,最终得出结果。

c. 退格功能:实现对输入错误的数字进行删除操作。

d. 清零功能:实现对当前输入数字进行清空操作。

5. 总结
51单片机数码管计算器具有实用、简单的特点,可以满足一般生活计算需求。

同时,对于初学者,也是一款比较好的学习案例。

51单片机数码管显示计算器程序

51单片机数码管显示计算器程序

定义位变量 定义液主函数 *51 单片机数码管显示计算器程序计算器程序#include<reg52.h>#include <intrins.h>#include<string.h> #include <math.h>#include <stdio.h>#define uchar unsigned char #define uint unsigned int ucharkey,sym,sumsz[13],adders=0; // 定义变量float sum,number1=0,number2=0; // 定义变量 bit flag=0; //标志位 sbit lcdrs=P2A 5; // 定义液晶的读 10 口 sbit lcdwr=P2W; // 晶的写I0 口 sbit lcden=P2A7; // 定义液晶的使能I0 口 uchar lcd_s[]={'0','1','2','3','4','5','6','7','8','9','+','-','*',0xfd,'.','='};//void keyscan(); // 函数声明void delayms(uchar z);void write_com(uchar com); void write_data(uchar dat); void init(); void delay(int z); bit buzz(); void yuans();void clear();/***********************void main()init(); // 液晶初始化while(1) // 循环函数keyscan(); // 调用键盘扫描函数键盘扫面*************************/ void keyscan()uchar temp=0;P1=0xfe; // 第1 次判断函数temp=P1;temp=temp&0xf0;if(temp!=0xf0)delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp)case 0xee:key=1;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;// 显示字符1,并记入相加的变量case 0xde:key=2;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;// 显示字符2,并记入相加的变量case 0xbe:key=3;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break;// 显示字符3,并记入相加的变量case 0x7e: key=10;write_data(lcd_s[key]);sym='+';flag=1; break;// 示‘+'号,并将sym付‘ +'}while((P1&0xf0)!=0xf0); // 等待按键释放}}P1=0xfd; // 第2 次判断temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp){case 0xed:key=4;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符4,并记入相加的变量case 0xdd:key=5;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符5,并记入相加的变量case 0xbd:key=6;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break; // 显示字符6,并记入相加的变量case 0x7d: key=11;write_data(lcd_s[key]);sym='-';flag=1; break;//示‘-'号,并将sym付‘-'}while((P1&0xf0)!=0xf0);}}P1=0xfb; // 第3 次判断temp=P1;temp=temp&0xf0;if(temp!=0xf0)delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp){case 0xeb:key=7;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符7,并记入相加的变量case 0xdb:key=8;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key; break;// 显示字符8,并记入相加的变量case 0xbb:key=9;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} else number2=number2*10+key;break; // 显示字符9,并记入相加的变量case 0x7b: key=12;write_data(lcd_s[key]);sym='*';flag=1; break;//示‘ * '号,并将sym付‘ *'}while((P1&0xf0)!=0xf0); // 等待按键释放}P1=0xf7; // 第4 次判断temp=P1;temp=temp&0xf0;if(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;if(temp!=0xf0){ temp=P1;adders++; // 确定按键按下,执行if 函数switch(temp){case 0xe7: key=0;write_data(lcd_s[key]);if(flag==0){number1=number1*10+key;} elsenumber2=number2*10+key;break;// 显示字符0,并记入相加的变量case 0xd7: key=14;clear(); break;// 调用清零函数case 0xb7: key=15;yuans();flag=1;adders--;break;// 调用运算函数case 0x77: key=13;write_data(lcd_s[key]);sym='/';flag=1; break;//示‘/ '号,并将sym付‘ /'}液晶写数据程序 { while((P1&0xf0)!=0xf0); // 等待按键释放液晶****************************/void write_com(uchar com) //液晶写指令程序{while(buzz()) ; lcdrs=0; // lcdwr=0; // lcden=0;P0=com; // _nop_();_nop_();_nop_();_nop_();lcden=1; // _nop_();_nop_();_nop_();_nop_();lcden=0; // void write_data(uchardat) // while(buzz());lcdrs = 1;液晶初始化程序 {lcdwr = 0;lcden = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); lcden = 0;} void init() // lcden=0; // write_com(0x38); // write_com(0x0c); // write_com(0x06); // write_com(0x01); // } bit buzz() // 液晶测忙程序 { bit b; lcdwr=1; // lcdrs=0; //延时子程序 {延时函数 lcden=1;_nop_();_nop_();_nop_();_nop_();b=(bit)(P&0x80);lcden=0;return b;void delay(int z) // int i;while(z--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}/********************* voiddelayms(uchar z) // 延时毫秒程序 {运算程序uchar i,j;for(i=z;i>0;i--) for(j=110;j>0;j--); }void clear() // 清零程序{ uchar i;for(i=0;i<16;i++) // 对液晶写入空格 { write_com(0x80+i);write_data(' ');}for(i=0;i<15;i++){write_com(0x80+0x40+i);write_data(' ');}write_data('0');write_com(0x80);flag=0;number1=0;number2=0;adders=0; // 将数据变量清零}void yuans() // 运算函数 { uchar i,j,temp1; /*********************** 运算*********************************/ /******************** 清零函数******************************************* */两数相加两数相减两数相乘两数相除 switch(sym){ case '+':number1+=number2;break; // case '-':number1-=number2;break; // case '*':number1*=number2;break; //case '/':number1/=number2;break; // }sprintf(sumsz,"%10.2f",number1); // j=strlen(sumsz); write_com(0x80+0x40+16-j); for(i=0;i<j;i++) // 显示结果 { temp1=sumsz[i];write_data(temp1);delay(10);}number2=0; write_com(0x80+adders-1); }。

基于51单片机的计算器基本原理

基于51单片机的计算器基本原理

基于51单片机的计算器基本原理计算器是现代生活中常见的电子设备之一,它能够进行各种数学运算,如加减乘除、开根号、求幂等。

本文将介绍基于51单片机的计算器的基本原理。

51单片机是一种常用的单片机型号,它由哈尔滨工业大学计算机系于1992年自主研制成功。

51单片机具有简单的顺序执行结构,易于编程,广泛应用于各个领域。

基于51单片机的计算器主要由以下几个部分组成:键盘输入模块、显示模块、运算模块和接口模块。

键盘输入模块用于接收用户输入的数据和操作符。

计算器的键盘上通常有数字键、运算符键和功能键。

数字键用于输入数字,运算符键用于输入各种数学运算符号,功能键用于实现特殊操作,如清零、取反等。

键盘输入模块通过扫描技术来检测用户的按键输入,并将输入的数据和操作符传送给运算模块。

显示模块用于显示计算结果和当前输入的数字和运算符。

一般来说,计算器的显示模块有一个大屏幕,在屏幕上可以显示多位数字和运算符。

显示模块通过控制显示芯片和数码管来实现显示。

运算模块是计算器的核心部分,它负责进行各种数学运算。

在基于51单片机的计算器中,运算模块通过解析用户输入的中缀表达式来实现数学运算。

中缀表达式是一种常见的表达式形式,其中运算符位于操作数之间。

为了实现中缀表达式的计算,运算模块需要将中缀表达式转换为后缀表达式,然后再进行计算。

转换过程使用栈来实现。

运算模块的工作流程大致如下:1.从键盘输入模块获取用户输入的中缀表达式。

2.创建一个空栈。

3.逐个读取中缀表达式中的字符。

-如果是数字,则直接输出到显示模块。

-如果是运算符,则与栈顶运算符比较优先级。

-如果当前运算符优先级高于栈顶运算符,则将当前运算符入栈。

-如果当前运算符优先级低于或等于栈顶运算符,则将栈顶运算符弹出,并输出到显示模块。

然后将当前运算符入栈。

-如果是括号,则分别处理左括号和右括号。

-如果是左括号,则将其入栈。

-如果是右括号,则将栈顶元素弹出并输出到显示模块,直到遇到左括号为止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的数码管应用一、设计要求1、基本要求(1)焊接一个单片机最小系统,接通电源后,至少能在四位数码管上同时显示四个非0的相同的数字。

(2)至少四位数码管能动态显示出[0,1,2,3],达到一定的效果。

(3)能用按键改变显示的数字。

2、发挥部分(1)增加数码管至8位。

(2)增加4*4矩阵按键,实现简易的8位计算器功能。

(3)增加红外接收模块,实现遥控功能。

(4)增加蜂鸣器,当有按键按下时发声。

(5)利用遥控器实现倒计时功能。

二、系统硬件配置本系统采用STC89C52RC单片机作为微控制器,分为6个模块(如下图所示):按键电路,红外感应电路,蜂鸣器响应电路,数码管显示电路,晶振以及复位电路。

下面是电路图部分: 主控单片机红外接收复位电路晶振电路按键矩阵运算低频电流产生按键消抖及计数码管显示结果蜂鸣器响应三、系统软件设计1、主程序模块主程序需要调用5 个子程序,各模块程序功能如下:●数码管显示程序:向数码的显示送数,控制系统的显示部分。

●按键消抖程序:采用检验连续四次按键状态的方式软件消抖。

●矩阵按键扫描程序:每4*4 ms扫描一次按键。

●中断设定程序:实现定时功能。

●数值计算程序:实现8位计算四则运算功能。

主程序流程见图如下:四、系统源代码Main.c部分代码如下:#include <reg52.h>sbit BUZZ = P3^3;sbit KEY_IN_1 = P2^3;sbit KEY_IN_2 = P2^2;sbit KEY_IN_3 = P2^1;sbit KEY_IN_4 = P2^0;sbit KEY_OUT_1 = P2^4;sbit KEY_OUT_2 = P2^5;sbit KEY_OUT_3 = P2^6;sbit KEY_OUT_4 = P2^7;unsigned char code LedChar[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };unsigned char code KeyCodeMap[4][4]={{0x31,0x32,0x33,0x25},{0x34,0x35,0x36,0x26},{0x37,0x38,0x39,0x27},{0x1B,0x30,0x0D,0x28}};unsigned char KeySta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};unsigned char LedBuff[8]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };unsigned char T0RH = 0;unsigned char T0RL = 0;extern bit irflag;extern unsigned char ircode[4];extern void InitInfrared(void);void ConfigTimer0(unsigned int ms);void KeyDriver();void Action(unsigned char keycode);void InfraredScan();void Timer();void Starter();void main(){EA = 1;InitInfrared();ConfigTimer0(1);PT0 = 1;Timer();Starter();while(1){InfraredScan();KeyDriver();}}void Timer(){unsigned int t = 0;LedBuff[7] = LedChar[4];LedBuff[6] = LedChar[4];for(t=0;t<33000;t++);BUZZ = 0;for(t=0;t<8000;t++);BUZZ = 1;LedBuff[7] = 0xFF;LedBuff[6] = 0xFF;LedBuff[5] = LedChar[3];LedBuff[4] = LedChar[3];for(t=0;t<33000;t++);BUZZ = 0;for(t=0;t<8000;t++);BUZZ = 1;LedBuff[5] = 0xFF;LedBuff[4] = 0xFF;LedBuff[3] = LedChar[2];LedBuff[2] = LedChar[2];for(t=0;t<33000;t++);BUZZ = 0;for(t=0;t<8000;t++);BUZZ = 1;LedBuff[3] = 0xFF;LedBuff[2] = 0xFF;LedBuff[1] = LedChar[1];LedBuff[0] = LedChar[1];for(t=0;t<33000;t++);BUZZ = 0;for(t=0;t<8000;t++);BUZZ = 1;LedBuff[1] = 0xFF;LedBuff[0] = 0xFF;LedBuff[0] = LedChar[0];for(t=0;t<33000;t++);BUZZ = 0;for(t=0;t<33000;t++);BUZZ = 1;}void Starter(){LedBuff[0] = LedChar[8];LedBuff[1] = LedChar[8];LedBuff[2] = LedChar[8];LedBuff[3] = LedChar[8];LedBuff[4] = LedChar[3];LedBuff[5] = LedChar[2];LedBuff[6] = LedChar[1];LedBuff[7] = LedChar[0];void ConfigTimer0(unsigned int ms) {unsigned long tmp;tmp = 12000000 / 12;tmp = (tmp * ms) / 1000;tmp = 65536 - tmp;tmp = tmp + 13;T0RH = (unsigned char)(tmp>>8);T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;TL0 = T0RL;ET0 = 1;TR0 = 1;}void PrintNumber(unsigned long n) {signed char i ;unsigned char buf[8];for (i=0;i<8;i++){buf[i] = n % 10;n = n / 10;}for (i=7;i>=1;i--){if(buf[i]==0){LedBuff[i]=0xFF;}elsebreak;}for (;i>=0;i--){LedBuff[i]=LedChar[buf[i]];}}void Action(unsigned char keycode){static char ysf = 0;static long b = 0;static long a = 0;unsigned int i = 0;if ((keycode>=0x0D) && (keycode<=0x39)){BUZZ = ~BUZZ;for(i=0;i<8000;i++);BUZZ = ~BUZZ;if ((keycode>=0x30) && (keycode<=0x39)){a = (a*10)+(keycode-0x30);PrintNumber(a);}else if (keycode == 0x25){ysf = 0;b = a;a = 0;PrintNumber(a);}else if (keycode == 0x26){ysf = 1;b = a;a = 0;PrintNumber(a);}else if (keycode == 0x27){ysf = 2;b = a;a = 0;PrintNumber(a);}else if (keycode == 0x28){ysf = 3;b = a;a = 0;PrintNumber(a);}else if (keycode == 0x0D){if (ysf == 0){b += a;}else if(ysf == 1){b -= a;}else if(ysf == 2){b *= a;}else if(ysf == 3){b /= a;}a = 0;PrintNumber(b);}else if (keycode == 0x1B){a = 0;b = 0;PrintNumber(a);}}}void KeyDriver(){unsigned char i,j;static unsigned char backup [4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};for(i=0;i<4;i++){for(j=0;j<4;j++){if(backup[i][j] != KeySta[i][j]){if(backup[i][j] == 0){Action(KeyCodeMap[i][j]);}backup[i][j] = KeySta[i][j];}}}}void KeyScan(){unsigned char i ;static unsigned char keyout = 0;static unsigned char keybuf[4][4]={{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF} };keybuf[keyout][0]=(keybuf[keyout][0] << 1)|KEY_IN_1;keybuf[keyout][1]=(keybuf[keyout][1] << 1)|KEY_IN_2;keybuf[keyout][2]=(keybuf[keyout][2] << 1)|KEY_IN_3;keybuf[keyout][3]=(keybuf[keyout][3] << 1)|KEY_IN_4;for(i=0;i<4;i++){if((keybuf[keyout][i] & 0x0F)==0x00){KeySta[keyout][i]=0;}else if((keybuf[keyout][i] & 0x0F)==0x0F){KeySta[keyout][i]=1;}}keyout++;keyout = keyout & 0x03;switch (keyout){case 0: KEY_OUT_4=1;KEY_OUT_1=0;break;case 1: KEY_OUT_1=1;KEY_OUT_2=0;break;case 2: KEY_OUT_2=1;KEY_OUT_3=0;break;case 3: KEY_OUT_3=1;KEY_OUT_4=0;break;default:break;}}void LedScan(){static unsigned char i = 0;P0=0xFF;switch(i){case 0: P1=0xF7;i++;P0=LedBuff[0];break;case 1: P1=0xFB;i++;P0=LedBuff[1];break;case 2: P1=0xFD;i++;P0=LedBuff[2];break;case 3: P1=0xFE;i++;P0=LedBuff[3];break;case 4: P1=0x7F;i++;P0=LedBuff[4];break;case 5: P1=0xBF;i++;P0=LedBuff[5];break;case 6: P1=0xDF;i++;P0=LedBuff[6];break;case 7: P1=0xEF;i=0;P0=LedBuff[7];break;default: break;}}void InfraredScan(){if (irflag){if (ircode[2] == 0x0C){Action(0x31);}else if (ircode[2] == 0x18){Action(0x32);}else if (ircode[2] == 0x5E){Action(0x33);}else if (ircode[2] == 0x09){Action(0x25);}else if (ircode[2] == 0x08)Action(0x34);}else if (ircode[2] == 0x1C) {Action(0x35);}else if (ircode[2] == 0x5A) {Action(0x36);}else if (ircode[2] == 0x15) {Action(0x26);}else if (ircode[2] == 0x42) {Action(0x37);}else if (ircode[2] == 0x52) {Action(0x38);}else if (ircode[2] == 0x4A) {Action(0x39);}else if (ircode[2] == 0x0D) {Action(0x27);}else if (ircode[2] == 0x40) {Action(0x1B);}else if (ircode[2] == 0x16) {Action(0x30);}else if (ircode[2] == 0x43) {Action(0x0D);}else if (ircode[2] == 0x19)Action(0x28);}irflag = 0;}KeyScan();}void InterruptTimer() interrupt 1{TH0 = T0RH;TL0 = T0RL;LedScan();}}Infrared.c部分代码如下:#include <reg52.h> sbit IR_INPUT = P3^3;bit irflag = 0;unsigned char ircode[4];void InitInfrared(){IR_INPUT = 1;TMOD &= 0x0F;TMOD |= 0x10;TR1 = 0;ET1 = 0;IT1 = 1;EX1 = 1;}unsigned int GetHighTime(){TH1 = 0;TL1 = 0;TR1 = 1;while (IR_INPUT){if (TH1 >= 0x40){break;}}TR1 = 0;return (TH1*256 + TL1);}unsigned int GetLowTime(){TH1 = 0;TL1 = 0;TR1 = 1;while (!IR_INPUT){if (TH1 >= 0x40){break;}}TR1 = 0;return (TH1*256 + TL1);}void EXINT1_ISR() interrupt 2 {unsigned char i, j;unsigned char byt;unsigned int time;time = GetLowTime();if ((time<7833) || (time>8755)){IE1 = 0;return;}time = GetHighTime();if ((time<3686) || (time>4608)){IE1 = 0;return;}for (i=0; i<4; i++){for (j=0; j<8; j++){time = GetLowTime();if ((time<313) || (time>718)){IE1 = 0;return;}time = GetHighTime();if ((time>313) && (time<718)){byt >>= 1;}else if ((time>1345) && (time<1751)){byt >>= 1;byt |= 0x80;}else{IE1 = 0;return;}}ircode[i] = byt;}irflag = 1;IE1 = 0;}五、总结经过两周的学习与实践,本组组员成功的完成了数码管计算器的设计,最终作品的出炉离不开每个人的努力。

相关文档
最新文档