单片机简易数字计算器汇编
51单片机简易计算器
P3=0xf7;
0x7b:
temp=P3; temp=temp&0xf0; if(temp!=0xf0) {
delay(10); temp=P3; temp=temp&0xf0; if(temp!=0xf0) {
temp=P3; switch(temp) {
case 0xe7:
case 0xd7:
//5
case 0xbd:num1=10*num1+3;num=num1;break;
//6
case 0x7d:// -
num2=num1;num1=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:
break;
num1=10*num1+4; num=num1;
case 0xdb: break;
num1=10*num1+5; num=num1;
case 0xbb: break;
num1=10*num1+6; num=num1;
case // *
num2=num1; num1=0;
flag=3; break; } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } }
(完整版)基于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); }。
基于单片机的计算器——汇编
基于单片机的计算器——汇编编号:单片机综合设计实训 (论文)说明书题目:基于单片机的电子计算器院(系):专业:学生姓名:学号:指导教师:年01 月 1 日摘要当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且比较容易出错。
计算器作为一种快速通用的计算工具方便了用户的使用。
计算器可谓是我们最亲密的电子伙伴之一。
单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。
在工业生产中。
单片微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
本系统就是充分利用了AT89S52芯片的I/O引脚。
系统以采用MCS-51系列单片机Intel8051为中心器件来设计计算器控制器,以矩阵键盘输入、八位数码管显示,实现了能根据实际输入值计算并显示的功能。
关键词:计算器 AT89S52 八位数码管矩阵键盘AbstractIn today's society, with people constantly improve the material life, the electronic produc ts have entered the each and every family, whether living or studying, or entertainment and recreation almost everything is inseparable from the electronic products, large and complex co mputing capability is the human brain are not competent, but relatively easy to go wrong.Calc ulator as a rapid generic computational tool is convenient for users to use.The calculator is our most intimate electronic partners.SCM because of its small size and low cost, widely used in household appliances, industr ial control and other areas.In industrial production.Single chip microcomputer, the microcomp uter is an important branch, is full of vitality.Single chip micro computer referred to as SCM, is particularly applicable to the control field, it is also known as the micro controller.The system is to make full use of the AT89S52 chip I / O pins.System for using MCS-51 MCU Intel8051 as the center device to design the computer controller, with the matrix keybo ard input, the eight digital tube display, can be achieved according to the actual input value ca lculation and display functions.Key words: calculator AT89S52 digital tube eight matrix keyboard目录1实训设计内容 (4)1.1 设计目的 (4)1.2 设计任务 (4)2 系统硬件设计 (4)2.1 芯片介绍 (4)2.1.1主控芯片AT89S52概述与介绍 (4)2.1.2 MAX232芯片介绍 (9)2.2 硬件电路 (10)2.2.1 键盘接口电路 (10)2.2.2 7段LED数码管 (10)2.2.3 程序下载接口 (11)2.2.4 单片机时钟电路 (11)2.2.5 单片机复位电路 (12)3 软件设计 (12)3.1 按键扫程序设计 (12)3.2 算法设计 (13)4 电路板制作过程 (13)5 作品调试 (14)5.1硬件调试 (14)5.2 程序调试 (14)致谢 (16)参考文献: (17)附录: (18)1实训设计内容1.1 设计目的通过本次课题设计,应用《单片机原理及应用》等所学相关知识及查阅资料,完成简易计算器的设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。
基于51单片机的简易计算器
基于51单片机的简易计算器51单片机是一种广泛应用于嵌入式系统中的常用微控制器。
我们可以利用51单片机的强大功能和丰富的外设资源,设计一个简易计算器。
这个计算器可以进行基本的加减乘除运算,并且具备显示结果的功能。
首先,我们需要准备一块51单片机开发板,一块1602液晶显示屏模块,以及一些按键开关和电阻。
我们可以将运算器主要分为以下几个模块:数码管显示模块、键盘输入模块、运算模块和存储模块。
数码管显示模块:我们使用1602液晶显示屏模块来显示计算器的结果。
我们可以通过51单片机的IO口,将计算结果发送给液晶显示屏模块,实现结果的显示。
键盘输入模块:我们可以使用几个按键开关来实现数字和运算符的输入。
通过对按键的检测,我们可以将用户输入的数字和运算符转化为字符形式,并保存到内存中。
运算模块:我们需要根据用户输入的数字和运算符,进行相应的运算。
我们可以使用栈来实现这个功能。
栈是一种常用的数据结构,具有"先进后出"的特点。
我们可以将用户输入的数字和运算符按照一定的规则入栈,然后按照相应的顺序进行出栈和运算。
最后将结果保存到内存中。
存储模块:我们可以使用内部RAM来保存运算结果。
51单片机的内部RAM具有一定的存储能力,可以满足我们的基本需求。
在编写程序时,我们可以使用汇编语言或者C语言。
通过合理的编程,我们可以实现计算器的各项功能。
总结一下,基于51单片机的简易计算器主要包括数码管显示模块、键盘输入模块、运算模块和存储模块。
我们可以通过合理的编程,将这些模块相互配合,实现一个功能完善的计算器。
这个计算器不仅可以进行基本的加减乘除运算,还可以显示结果,方便用户进行计算。
基于单片机的简易计算器编程
if(t[j]==0x34) { DispCharacter(0,k--,'4');}
if(t[j]==0x35) { DispCharacter(0,k--,'5');}
if(t[j]==0x36) { DispCharacter(0,k--,'6');}
}
for(i=r-2;i>=0;i--)
{
tx=u;
u=u+(( unsigned long )(t[i]-48)*(pow(r-i-2)));
if(u<tx) { systemerror();}
}
}
void hou( ) //计算符号后面的数值
{
int j,flash=0; //标志位:从不是零的高位开始显示!
int k=12;
for(j=3;j>=0;j--)
{
if(f3==0) { break; }
if(m[0]==0x30&&m[1]==0x30&&m[2]==0x30) { f3=0; break; }
PinRW=0;
PinE=0;
PinData = data1;
PinE=1;
ShortDelay(10);
PinE=0;
PinRW=1;
PinRS=0;
}
void WriteInstruc(char Instruc)
{
while(StatusCheck());
if(m[j]==0x32) { DispCharacter(1,k++,'2'); flash++;}
单片机简易计算器设计(二)2024
单片机简易计算器设计(二)引言:单片机简易计算器是一种以单片机为核心实现基本算术运算的小型电子设备。
本文继续探讨单片机简易计算器的设计方案,并详细介绍了其具体实现步骤和功能。
正文:第一大点:电路设计1. 选择适当的单片机型号2. 设计电源电路,确保稳定供电3. 搭建输入输出电路,包括按键和显示模块的连接4. 设计外部调试接口,方便程序的调试和更新5. 进行电路的模拟仿真和实际测试,确保电路的正常工作第二大点:程序编写1. 定义输入输出的数据结构2. 编写初始化程序,配置端口和寄存器3. 编写按键扫描程序,实现按键的读取和编码4. 编写基本算术运算程序,包括加法、减法、乘法和除法5. 编写显示程序,将结果显示在数码管或液晶屏上第三大点:算法优化1. 选择合适的算法,使计算速度尽可能快2. 使用位运算代替乘除法运算,提高运算效率3. 使用查表法来加速计算过程4. 增加缓存机制,优化存储空间的使用5. 对程序进行反复优化和测试,确保算法的准确性和高效性第四大点:错误处理与异常处理1. 设计输入错误的检测机制,防止用户输入无效的数据2. 处理溢出和除零等运算错误,避免程序崩溃3. 设计异常处理程序,对错误输入进行友好提示4. 进行充分的测试和调试,确保程序的稳定性5. 添加日志功能,记录错误信息和运行状态,便于排查问题第五大点:功能扩展1. 添加科学计算功能,如平方根、三角函数等2. 实现单位换算功能,方便不同单位之间的转换3. 增加储存器功能,可以保存计算结果或中间数据4. 设计菜单界面,使用户可以自由选择不同的功能5. 进行实际应用测试,检验扩展功能的可靠性和实用性总结:本文对单片机简易计算器的设计进行了全面的阐述。
通过合理的电路设计、程序编写和算法优化,以及错误和异常处理,使得计算器具备稳定高效的运算能力。
同时还介绍了功能扩展方面的设计思路,为后续的开发和升级提供了参考。
51单片机简易计算器
***************51单片机简易计算器************按键介绍:| 7 | 8 | 9 | + |-------------| 4 | 5 | 6 | -|-------------| 1 | 2 | 3 | * |-------------| 0 | = | C | / |操作说明:按下第一个数(0—9)后再按运算符(+ - * /),最后按=显示结果,按C 可以清除全屏加最大:9999+9999=19998乘最大:9999*9999=99980001除:1/9=0.1111保留小数点后四位#include <REGX52.H>#define uint unsigned int#define uchar unsigned char/******************LCD1602**********************/#define LCD_RS P2_4//定义LCD_RS端口#define LCD_RW P2_5//定义LCD_RW端口#define LCD_EN P2_6//定义LCD_EN端口#define LCD_DA P0//定义LCD_DA端口(数据端)#define KEY P3//定义矩阵按键为P3口#define Speak P2_3//定义蜂鸣器端口#define LED P2_2//定义指示灯#define KEY_1P2_0//定义按键为P1.7口(开/关蜂鸣器、LED灯) #define LED1P1//定义流水指示灯/**************定义显示数据数组*************/uchar code table[]= {" "};/****************定义动画数组***************/uchar code table1[]={" Welcome to "};uchar code table2[]={" 51 MCU Counter "};/*************定义流水灯显示数组************/uchar code table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//从低位往高位(流水)uchar code table4[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//从高位往低位(流水)uchar code table5[]={0x7e,0xbd,0xdb,0xe7};//从两边往中间(流水)uchar code table6[]={0xe7,0xdb,0xbd,0x7e};//从中间往两边(流水)/***************定义运算数据***************/long int data_a=0;//第一个数long int data_b=0; //第二个数long int data_c=0;//计算结果uchar dispaly[10]; //显示缓冲uchar i,j;//定义i,juchar flag=1;//定义开/关蜂鸣器、LED灯标志位,初始化为1uchar n=1;//定义n为1(默认8位LED显示流水状态1)uchar k=0;//定义kuchar num=0;//定义时间基数初始值为0uchar key=0xff; //键值初始化uchar a=0;//第1个数可以按1-4次(在主函数中体现)uchar b=5; //第2个数可以按1-4次(在主函数中体现)uchar x=0; //定义x=0/***************延时函数*********************/void delay(uint time)//延时函数{uint i,j;for(i=time;i>0;i--)for(j=110;j>0;j--);}/***************蜂鸣器响延时函数************/void delay_fmq(uint time)//蜂鸣器响延时函数{uint x,y;for(x=time;x>0;x--)for(y=5;y>0;y--);}/************LED灯闪烁并且蜂鸣器响***********/void spk()//LED灯闪烁并且蜂鸣器响{LED=0;//LED亮for(j=0;j<100;j++)//利用for语句延时{Speak=0;//蜂鸣器为低电平delay_fmq(5);//延时Speak=1;//蜂鸣器为高电平delay_fmq(5);//延时}LED=1;//LED灭}/***************1602液晶写指令*****************/void write_com(uchar com) //1602液晶写指令(参照LCD1602时序图) {LCD_RS=0; //写指令LCD_RW=0;//写液晶LCD_DA=com; //写入指令comdelay(2); //延时LCD_EN=1; //使能1602delay(2); //延时LCD_EN=0;//使能1602}/****************1602液晶写数据***************/void write_date(uchar date) //1602液晶写数据(参照LCD1602时序图) {LCD_RS=1; //写数据LCD_RW=0; //写液晶LCD_DA=date; //写入数据datedelay(2);//延时LCD_EN=1; //使能1602delay(2); //延时LCD_EN=0;//使能1602}/****************指定x,y写入字符函数*********/void W_lcd(unsigned char x,unsigned char y,unsigned char Data){if(y==0)//如果y=0{write_com(0x80 + x);//第一行}else//否则y=1{write_com(0xc0 + x);//第二行}write_date(Data); //写入数据}/****************指定x,y写入字符串函数********/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s){if(y==0)//如果y=0{write_com(0x80 + x);//第一行}else//否则y=1{write_com(0xC0 + x);//第二行}while(*s){write_date(*s);//写入数据s++;//s++}}/*****************初始化液晶******************/void LCD_init() //初始化液晶{write_com(0x38); //8 位总线,双行显示,5X7 的点阵字符write_com(0x0c); //开显示,无光标,光标不闪烁write_com(0x01); //清屏}/*****************开机动画********************/void cartoon()//开机动画{spk();//蜂鸣器响,LED亮write_com(0x80);//写指令准备显示第1行第1个for(i=0;i<16;i++)//for语句循环16次{write_date(table1[i]);//写数据" Welcome to "delay(100);//延时一下(为了数字、字母一个一个显示) }write_com(0xc0);//写指令准备显示第2行第1个for(i=0;i<16;i++)//for语句循环16次{write_date(table2[i]);//写数据" 51 MCU Counter "delay(100);//延时一下(为了数字、字母一个一个显示) }spk();//蜂鸣器响,LED亮delay(200);}/*************反转法键盘扫描******************/short keycheckdown()//反转法键盘扫描{short temp1,temp2,temp,a=0xff;KEY=0xf0;//输入行值(或列值)delay(20);//延时temp1=KEY;//读列值(或行值)KEY=0xff;delay(20);//延时KEY=0x0f;//输入列值(或行值)delay(20);//延时temp2=KEY;//读行值(或列值)KEY=0xff;temp=(temp1&0xf0)|(temp2&0xf);//将两次读入数据组合switch(temp)//通过读入数据组合判断按键位置{/************第一行按键7 8 9 + *********/case 0xee :a=7; //按键7if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xed :a=8; //按键8if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xeb :a=9; //按键9if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xe7 :a=0x0a;//按键+if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回/************第二行按键4 5 6 - *********/case 0xde :a=4; //按键4if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xdd :a=5; //按键5if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xdb :a=6; //按键6if(flag==1)//若flag为1,则蜂鸣器响,LED亮spk();}break; //返回case 0xd7 :a=0x0b;//按键-if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回/************第三行按键1 2 3 * *********/case 0xbe :a=1; //按键1if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xbd :a=2; //按键2if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xbb :a=3; //按键3if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0xb7 :a=0x0c;//按键*if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();break; //返回/************第四行按键0 = C / *********/case 0x7e :a=0;//按键0if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0x7d :a=0x0e;//按键=if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0x7b :a=0x0f;//按键Cif(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回case 0x77 :a=0x0d;//按键/if(flag==1)//若flag为1,则蜂鸣器响,LED亮{spk();}break; //返回default :a=0xff;//没有键按下}return a;//返回按键值}/******************显示数据a******************/ void display_a() //显示数据a{dispaly[3]=data_a%10000/1000; //千位dispaly[2]=data_a%1000/100; //百位dispaly[1]=data_a%100/10; //十位dispaly[0]=data_a%10; //个位write_com(0x80+0); //显示数据aif(data_a>999){write_date('0'+dispaly[3]);//显示千位}if(data_a>99){write_date('0'+dispaly[2]);//显示百位}if(data_a>9){write_date('0'+dispaly[1]); //显示十位}write_date('0'+dispaly[0]); //显示个位}/******************显示数据b******************/ void display_b() //显示数据b{write_com(0x80+7); //第一行dispaly[3]=data_b%10000/1000; //千位dispaly[2]=data_b%1000/100; //百位dispaly[1]=data_b%100/10; //十位dispaly[0]=data_b%10; //个位if(data_b>999){write_date('0'+dispaly[3]);//显示千位}if(data_b>99){write_date('0'+dispaly[2]); //显示百位}if(data_b>9){write_date('0'+dispaly[1]); //显示十位}write_date('0'+dispaly[0]); //显示个位}/******************计算结果*******************/void display_c(x){if(data_c<100000000&&data_c>-1)//溢出时显示错误{dispaly[8]=data_c%1000000000/100000000; //万万dispaly[7]=data_c%100000000/10000000; //千万dispaly[6]=data_c%10000000/1000000; //百万dispaly[5]=data_c%1000000/100000; //十万dispaly[4]=data_c%100000/10000; //万dispaly[3]=data_c%10000/1000; //千dispaly[2]=data_c%1000/100; //百dispaly[1]=data_c%100/10; //十dispaly[0]=data_c%10; //个write_com(0x80+0x40+7); //第二行if(x==4){if(data_c>99999999){write_date('0'+dispaly[8]);//显示万万}if(data_c>9999999){write_date('0'+dispaly[7]);//显示千万}if(data_c>999999){write_date('0'+dispaly[6]);//显示百万}if(data_c>99999){write_date('0'+dispaly[5]);//显示十万}write_date('0'+dispaly[4]); //万write_date('.');write_date('0'+dispaly[3]); //千write_date('0'+dispaly[2]); //百write_date('0'+dispaly[1]); //十write_date('0'+dispaly[0]); //个}else{if(data_c>99999999){write_date('0'+dispaly[8]);//显示万万}if(data_c>9999999){write_date('0'+dispaly[7]);//千万}if(data_c>999999){write_date('0'+dispaly[6]);//百万}if(data_c>99999){write_date('0'+dispaly[5]);//十万}if(data_c>9999){write_date('0'+dispaly[4]);//万}if(data_c>999){write_date('0'+dispaly[3]);//千}if(data_c>99){write_date('0'+dispaly[2]);//百}if(data_c>9){write_date('0'+dispaly[1]);//十}write_date('0'+dispaly[0]); //个}}else //溢出时显示错误{write_com(0x80+0x40+11); //第二行write_date('E'); //显示Ewrite_date('r'); //显示Rwrite_date('r');//显示Rwrite_date('o');//显示Owrite_date('r');//显示R}}/****************加减乘除运算*****************/void eql(uchar yunsuan)//加减乘除运算{switch(yunsuan)//功能键选择{case 1:data_c=data_a+data_b;//加法break; //返回case 2:if(data_a>=data_b)//若a>b{data_c=data_a-data_b;//减法}else//否则a<b{data_c=data_b-data_a;//减法W_lcd(5,1,'-');//带上负号}break; //返回case 3:data_c=(data_a*data_b);//乘法break;//返回case 4:if(data_b==0)//如果被除数为0{LCD_Write_String(1,1,"Error");//除法溢出时显示错误}else{data_c=(data_a*10000)/data_b;//除法}break;//返回case 0: break;//不做运算返回}}/****************定时器0初始化****************/void Time0_init()//定时器0初始化{TMOD=0x01;//定时器0为方式1TL0=(65536-50000)%256;TH0=(65536-50000)/256;//12M晶振定时时间50msET0=1;//开定时器0中断EA=1;//开总中断TR0=1;//开启定时器0}/****************开/关指示函数***************/void K_G_ZS()//开/关指示函数{if(KEY_1==0)//若按键按下{delay(20);//延时去抖if(KEY_1==0)//再次确认按键是否按下{flag=!flag;//flag取反}//flag=0关闭蜂鸣器响和LED亮。
单片机课程设计一汇编语言实现四位数计算器
单片机课程设计一汇编语言实现四位数计算器
四位数计算器是一种能够进行基本数学运算的设备,它可以对四位数进行加法、减法、乘法和除法运算。
这个计算器的设计基于单片机和汇编语言,它可以方便地进行各种数学运算,满足用户的需求。
我们需要一个单片机作为计算器的核心。
单片机是一种集成电路,可以完成各种计算和控制任务。
我们选择一款适合的单片机,并将其与其他必要的电子元件进行连接,以构建一个完整的计算器系统。
接下来,我们需要使用汇编语言编写相应的程序来实现计算器功能。
汇编语言是一种低级语言,可以直接控制计算机的硬件,实现各种操作。
通过编写汇编语言程序,我们可以实现加法、减法、乘法和除法等运算。
在程序中,我们首先需要设计一个界面,将计算器的输入和输出与单片机相连接。
用户可以通过按键输入需要计算的四位数和运算符,计算器将根据用户的输入进行相应的运算,并将结果显示在数码管上。
在程序的编写过程中,我们需要考虑各种可能的输入情况,例如用户输入的数字是否超出了四位数的范围,用户是否输入了错误的运算符等。
我们需要对这些情况进行处理,保证计算器的运算结果是准确的。
除了基本的加减乘除运算,我们还可以在计算器中添加其他功能,
例如开根号、取余数等。
这些功能的实现也需要通过编写相应的汇编语言程序来完成。
通过单片机和汇编语言的结合,我们可以实现一个功能完备的四位数计算器。
这个计算器可以方便地进行各种数学运算,满足用户的需求。
通过合理的设计和编程,我们可以使计算器的使用变得简单而高效,为用户提供便利的计算体验。
51单片机简易计算器-(可算小数)
51单片机简易计算器#include<reg51.h>#include<math.h>#define uchar unsigned char #define uint unsigned int sbit beep=P2^3;sbit dula=P2^6;sbit wela=P2^7;sbit rw=P1^1;sbit rs=P1^0;sbit lcden=P2^5;void yunsuan();void keyinput(char s);void write_data(char ddata);void write_com(char command);void display(long a);void init();void dealerror();void dataoverflow();void welcome();char code table1[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};char code table2[]="789/456*123-.0=+";char j,k,temp,temp1,temp2,key,mchar,m,flag2=0,flag3=0; long x,y,num;int operators,input,iny;char error[5]="error";char overflow[8]="overflow";char welcome_[16]="welcome to use !";void delay(uint x)//延时{uint a,b;for(a=x;a>0;a--)for(b=10;b>0;b--);}void delay_ms(uint x)//延时{uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}void write_com(uchar com)//写命令{P0=com;rs=0;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}void write_data(uchar date)//写数据{P0=date;rs=1;lcden=0;delay(10);lcden=1;delay(10);lcden=0;}long ming(int x){long m;switch(x){case 9:m=1000000000;return m;break; case 8:m=100000000;return m;break; case 7:m=10000000;return m;break; case 6:m=1000000;return m;break; case 5:m=100000;return m;break; case 4:m=10000;return m;break; case 3:m=1000;return m;break;case 2:m=100;return m;break;case 1:m=10;return m;break; case 0:m=1;return m;break; }}void display(long a){long d;int i,flag1=0,temp,c=-1;init();if(a<0){a=a*c;write_data('-');}for(i=9;i>=0;i--){d=ming(i);temp=a/d;a=a%d;if((temp==0)&&(flag1==0)) ;else{write_data(0x30+temp);flag1=1;}if(i==2){write_data('.');flag1=1;}}}void init()//LCD初始化{rw=0;dula=0;wela=0;write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delay(20);write_com(0x0e); //显示模式设置delay(20);write_com(0x06); //显示模式设置:光标右移,字符不移delay(20);write_com(0x01); //清屏幕指令,将以前的显示内容清除delay(20);}void yunsuan() // 运算{if (iny){switch(operators){case 1:x=x+y;num=x;if(num<10000000000&&num>-10000000000){display(num);}elsedataoverflow();break;case 2:x=x-y;num=x;if(num<10000000000&&num>-10000000000) {display(num);}elsedataoverflow();break;case 3:x=x*y;num=x/100;if(num<10000000000&&num>-10000000000) {display(num);}elsedataoverflow();break;case 4:if (y==0)dealerror();else{if(y<100){x=x*100;y=y*100;}y=y/100;x=x/y;num=x;if(num<10000000000&&num>-10000000000) {display(num);}elsedataoverflow();}break;}y=0;}}void dealerror()//除数为0{int i=0;write_com(0x01);for(i=0;i<5;i++)write_data(error[i]);}void dataoverflow()//数值溢出{int i=0;write_com(0x01);for(i=0;i<8;i++)write_data(overflow[i]);}void welcome()//欢迎界面{int i=0;write_com(0x01);for(i=0;i<16;i++)write_data(welcome_[i]);}void keyinput(char s) //键盘输入{if(s<='9'&&s>='0') //判断按下的键是否为数值{if(flag3==0)num=num*10+100*(s-'0');elsenum=num*10+10*(s-'0');if(flag2==1){num=num/10;flag3=1;}if (operators>0){y=num;iny=1;}elsex=num;if(num<10000000000&&num>-10000000000) //当前数值是否超出限定范围display(num);elsedataoverflow();}elseswitch(s){case '.':/*iny=0;operators=0;*/flag2=1;break;case '=':write_data(table2[14]); delay(10);yunsuan();iny=0;operators=0;num=0;flag2=0;flag3=0;break;case '+':if (operators) yunsuan();operators=1;write_data(table2[15]); num=0;flag2=0;flag3=0;break;case '-':if (operators) yunsuan(); operators=2;write_data(table2[11]); num=0;flag2=0;flag3=0;break;case '*':if (operators) yunsuan(); operators=3;write_data(table2[7]); num=0;flag2=0;flag3=0;break;case '/':if (operators) yunsuan(); operators=4;write_data(table2[3]); num=0;flag2=0;flag3=0;break;}}void main() //主函数{char i;char flag0=1;init();welcome();for(i=0;i<10;i++) delay_ms(100);init();while(1){P3=0xf0;temp1=P3;P3=0x0f;temp2=P3;temp=temp1|temp2; while(P3!=0x0f) {beep=0;}beep=1;for(i=0;i<16;i++) {if(temp==table1[i]) {m=table2[i];flag0=0;}}if(flag0==0) {keyinput(m); flag0=1;}}}。
51单片机简易计算器设计报告(一)
51单片机简易计算器设计报告(一)背景介绍在数字化时代,计算器作为一种简单易用的工具,越来越得到人们的关注和热爱。
而基于51单片机的简易计算器,不仅可以成为一种学习电子技术的手段,还具有满足简单计算需求的实用性。
设计思路本计算器采用键盘输入和数码管输出的电路设计,为用户提供加、减、乘、除、小数点、退位以及等于等功能。
1.键盘输入采用矩阵键盘的方式,将所有按键按行列排列,并利用51单片机中断方式来读取键值。
2.计算处理通过编写相应的程序代码,计算出用户输入的两个数值及操作符的结果,并将结果存储在数据缓存器中,最后将其输出至数码管。
3.数码管显示根据计算结果的数据类型,将其经过相应的转换处理后,通过数码管将结果输出至用户。
设计技术1.软件编写软件编写方面,采用汇编语言进行编写,代码总长度为2.2KB 左右。
其中,以中断方式读取键值、实现数值存储与判断、计算处理、数码管的结果输出等作为关键点进行编写。
2.硬件搭建硬件搭建方面,需要按照电路图进行搭建,并将51单片机与相关周边电路进行连接。
根据设计思路,将键盘、数码管、电源、指示灯等设备按照需求进行连接。
可改进之处虽然 51单片机的简易计算器的搭建能够满足基本计算需求,但其在以下几方面还有可改进之处:•添加计算科学函数,如三角函数、对数函数等。
•改进操作方式,使其更加符合人体工程学原理。
•添加储存器,使用户能够将计算结果进行存储和调用。
总结通过本次对基于51单片机的简易计算器的设计与实现,我们深入了解了电子技术的基本概念和硬件搭建原理,并了解到了简单嵌入式系统的工作原理。
虽然该计算器在功能和效率方面还有待改进,但对于初学者来说,其对于电子技术的学习和实验还是很有价值和意义的。
•编写的汇编代码过于繁琐,可考虑使用高级语言编写以提高效率和易读性。
•在电路搭建时需注意布线的合理性,尽量避免出现干扰和信号损失的问题。
综上所述,基于51单片机的简易计算器的设计和实现虽存在一些不足,但还是很有价值的。
基于51单片机的简易教学计算器设计
基于51单片机的简易教学计算器设计设计目的:本设计旨在基于51单片机实现一个简易的教学计算器,可以进行基本的四则运算,并具备一些辅助功能,帮助学生进行数学计算和学习。
设计要求:1.显示器:使用液晶显示器(LCD)来显示操作数和计算结果。
2.键盘输入:设计一个按键矩阵作为输入设备,用于输入数字和操作符。
3.四则运算:实现加法、减法、乘法和除法四种基本运算。
4.辅助功能:提供开平方、取倒数等辅助功能。
5.界面友好:界面清晰、操作简单。
硬件设计:1.51单片机(AT89C52):作为计算器的核心芯片,控制程序运行和与外围设备的交互。
2.液晶显示器(LCD):用于显示操作数和计算结果。
3.按键矩阵:用于输入数字和操作符。
4.运算模块:用于进行四则运算和辅助功能计算。
软件设计:1.系统初始化:初始化51单片机和LCD屏幕,设置键盘矩阵的引脚。
2.输入处理:通过按键矩阵检测用户输入,并将输入的字符存储在缓冲区中。
3.表达式计算:根据用户输入的表达式,通过逆波兰表达式算法将其转换为后缀表达式,并进行计算得到结果。
4.显示结果:将计算结果显示在LCD屏幕上。
5.辅助功能:根据用户选择的辅助功能,进行相应的计算,并显示结果。
6.重置功能:提供清零功能,将计算器的状态和显示结果重置。
操作流程:1.系统初始化:开机时,系统进行初始化,屏幕显示“计算器”字样。
2.输入操作数和操作符:用户通过按键矩阵输入操作数和操作符。
3.计算结果:用户输入“=”符号后,计算器根据输入的表达式进行计算,并将结果显示在LCD屏幕上。
4.辅助功能:在计算结果显示完成后,用户可选择进行辅助功能,如开平方、取倒数等操作。
5.重置功能:用户可通过按下“C”键进行重置,将计算器状态和显示结果清零。
总结:本设计基于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单片机的简易计算器设计的详细步骤和主要函数说明。
你可以根据这个设计框架进行具体的代码实现。
单片机简易数字计算器-汇编
基于单片机的简易计算器设计自动化控制一班kaoyanbaomu521摘要:近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本任务是个简易的两位数的四则运算,程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。
本任务重在设计构思与团队合作,使得我们用专业知识、专业技能分析和解决问题全面系统的锻炼。
关键词:单片机计算器范围加减乘除1 引言1.1 计算器的历史说起计算器,值得我们骄傲的是,最早的计算工具诞生在中国。
中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。
这种算筹多用竹子制成,也有用木头,兽骨充当材料的。
约二百七十枚一束,放在布袋里可随身携带。
直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的"纳皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。
1.2 电子计算器的特殊键在使用电子计算器进行四则运算的时候,一般要用到数字键,四则运算键和清除数据键。
除了这些按键,还有一些特殊键,可以使计算更加简便迅速。
2 单片机概述单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机设计简易计算器
3
开始 是否是+
是否是—
是否是*
是否是/
结束 图 3.2 运算子程序流程图
Result=c+d
Resule=c-d
Resule=c*d
Resule=c/d
键盘扫描流程图为:
开始 延时10ms
是否按键按下
DDRD=0XFE PORTD=0XF0
DDRD=0X0F
是否是第一排
按键
DDRD=0XFD
PORTD=0XF0
因此选用了 ATMEGA16 单片机作为主体,输入设备选用矩阵键盘。程序是硬件的灵魂,是
实现设计的中心环节。本设计使用的程序语言是 C 语言,在“ICC AVR”中运行,调试,
直到运行出正确结果,然后输出后缀名为.HEX 格式的文件,以备在 Protues 中仿真使用。
程序是设计的关键,程序的调试需要大量的时间,耐心,还够要有足的细心才能成功。
1 设计思想
武汉理工大学《单片机》课程设计说明书
简易计算器 Simply Calculator
此计算器有键盘部分、单片机、显示部分三部分组成,键盘部分主要完成输入功能;
单片机主要完成数据处理功能,包括确定按键,完成运算,以及输出数据;显示器部分
主要完成单片机输出的显示。
本设计的思路是利用单片机性能好,稳定性强的优点来实现系统的运行。设计大致
2.2 数字显示与计算
本次设计选用的显示器是1602液晶显示器,此液晶显示器能显示32个字符,VSS接 地,VDD接电源正极,E为时使能信号,R/W为读写选择端(H/L),RS为数据/命令选择端 (H/L),D0—D7为数据I/O口。
首先我们初始化液晶显示器,然后显示出第一个被按下的数,并且使光标右移,如 果有第二个数按下,则据继续显示,以此类推,然后把所有显示出来的数换算成一个数, 如果按下“+”号,则显示出“+”,并且同理显示出“+”号后面按下的数字,然后调用 加子程序,运算出结果,如果按下的是“-”,则调用减子程序,如果按下“*”,则调用 乘子程序,如果按下“/”,则调用除子程序。然后再调用显示结果子程序,显示出结果。
基于51单片机的简易计算器设计
基于51单片机的简易计算器设计一、引言计算器是一种执行基本数学运算的电子设备,现在市面上有各种类型的计算器,从小型的手持计算器到大型的科学计算器。
本设计基于51单片机设计了一种简易计算器,可以实现加法、减法、乘法和除法等基本运算。
二、设计思路1.系统硬件设计本设计使用的51单片机芯片选择了常用的STC89C52芯片,具有强大的功能和稳定性。
外设有键盘、数码管和LCD液晶显示屏。
2.系统软件设计系统的软件设计基于C语言进行,使用51单片机的汇编语言和C语言进行编程。
软件主要分为键盘输入处理、运算处理和结果显示三个部分。
三、系统硬件设计1.键盘输入部分使用4x4矩阵键盘作为输入设备,将键盘的4行4列分别接入到51单片机的4个IO口上,通过行列扫描的方式来检测按键的状态。
2.数码管显示部分使用共阳极的数码管来显示结果,通过提供适当的电压和信号控制来显示所需的数字。
3.LCD液晶显示屏为了方便用户查看输入和结果,本设计还使用了LCD液晶显示屏。
通过串口通信将结果传输到液晶显示屏上进行显示。
四、系统软件设计1.键盘输入处理通过行列扫描的方式检测键盘的按键状态,当检测到按键按下时,将对应的按键值存储起来。
2.运算处理根据用户的输入进行相应的运算处理。
根据检测到的按键值进行不同的运算操作,如加法、减法、乘法和除法。
3.结果显示将运算的结果通过串口通信传输到LCD液晶显示屏上进行显示。
五、系统实现1.硬件连接将键盘的行列引脚接到51单片机的对应IO口上,数码管和LCD液晶显示屏也分别连接到单片机的IO口上。
2.软件编码通过C语言编写系统软件,包括键盘输入处理、运算处理和结果显示三个模块。
3.调试测试将编写好的软件烧录到单片机上,通过键盘输入进行测试,并观察数码管和LCD液晶显示屏上的输出结果。
六、总结本设计基于51单片机实现了一个简易计算器,通过键盘输入进行基本的运算操作,并将结果通过数码管和LCD液晶显示屏进行显示。
单片机简易计算器设计(汇编语言)
KEYBUF EQU 40H ;键号存放单元ORG 0000HLJMP MAINORG 0030HMAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意值MOV R0,#30H ;显示首地址MOV R2,#0CH ;计算数据存放单元个数CLR AQING: MOV @R0,A ;将数据存放单元清零INC R0DJNZ R2,QINGMOV P0,#8FH ;关闭显示MOV R1,#30H ;将显示首地址存放R1里;===============================================;五位无符号显示子程序DIS1: MOV R0,#30H ;把显示数据第一位放在R0里MOV R2,#04H ;把显示的位码放在R2里MOV R3,#05H ;把显示的长度放在R3里DIS2: MOV A,@R0ANL A,#0FH ;屏蔽显示数据的高四位MOV B,AMOV A,R2ANL A,#0FH ;屏蔽位码的高四位SWAP AORL A,BMOV P0,A ;送总显示数据到P0显示LCALL DEL Y4ms ;调用延时4msINC R0 ;取下一个显示数据DEC R2DJNZ R3,DIS2 ;四位显示晚后重新开始显示;===================================================;键盘扫描子程序WAIT: MOV P1,#0FFH ;P1口送高电平CLR P1.0 ;第一行清零MOV A,P1 ;读P1口ANL A,#0F0H ;低位屏蔽XRL A,#0F0H ;判断低位是否有低电平,即判断是否有按键按下JZ NOKEY1 ;地位有低电平继续扫描,否者跳到第而行去扫描LCALL DEL Y10ms ;延时10ms去抖在进行判断是否有按键按下MOV A,P1 ;继续读P1口ANL A,#0F0H ;判断低位是否有低电平CJNE A,#0E0H,NK1 ;如果扫描数据不为0E0H就转到NK1MOV KEYBUF,#0 ;否者判断为0号键AJMP DK ;转DK1查表程序NK1: CJNE A,#0D0H,NK2 ;如果扫描数据不为0D0H就转到NK2 MOV KEYBUF,#1 ;否者判断为1号键AJMP DK ;转DK2查表程序NK2: CJNE A,#0B0H,NK3 ;如果扫描数据不为0B0H就转到NK3 MOV KEYBUF,#2 ;否者判断为2号键AJMP DK ;转DK3查表程序NK3: CJNE A,#70H,NK4 ;如果扫描数据不为70H就转到NK4 LJMP SAN_CHUNK4: NOPNOKEY1: MOV P1,#0FFH ;和上面相同CLR P1.1MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY2LCALL DEL Y10MSMOV A,p1ANL A,#0F0HXRL A,#0F0HJZ NOKEY2MOV A,P1ANL A,#0F0HCJNE A,#0E0H,NK5MOV KEYBUF,#3AJMP DKNK5: CJNE A,#0D0H,NK6MOV KEYBUF,#4AJMP DKNK6: CJNE A,#0B0H,NK7MOV KEYBUF,#5AJMP DKNK7: CJNE A,#70H,NK8MOV KEYBUF,#10 ;否者判断为3号键AJMP DK ;转DK4查表程序NK8: NOPNOKEY2: MOV P1,#0FFHCLR P1.2MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY3LCALL DEL Y10MSANL A,#0F0HXRL A,#0F0HJZ NOKEY3MOV A,P1ANL A,#0F0HCJNE A,#0E0H,NK9MOV KEYBUF,#6AJMP DKNK9: CJNE A,#0D0H,NK10MOV KEYBUF,#7AJMP DKNK10: CJNE A,#0B0H,NK11MOV KEYBUF,#8AJMP DKNK11: CJNE A,#70H,NK12LJMP DENG_HAONK12: NOPNOKEY3: MOV P1,#0FFHCLR P1.3MOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY4LCALL DEL Y10MSMOV A,P1ANL A,#0F0HXRL A,#0F0HJZ NOKEY4MOV A,P1ANL A,#0F0HCJNE A,#0E0H,NK13LJMP CHUNK13: CJNE A,#0D0H,NK14LJMP CHENGNK14: CJNE A,#0B0H,NK15LJMP JIANNK15: CJNE A,#70H,NK16LJMP JIANK16: NOP;======================================================= ;查表求键值程序MOV A,KEYBUF ;查表程序查对应的键号数据MOV DPTR,#TABLE ;把表头地址放入DPTRMOVC A,@A+DPTR ;A里面存放的为键号,利用A和表头地址找到对应的键号数据MOV B,A ;把查到的数据送往显示单元INC R1 ;取下一个显示单元MOV A,R1CJNE A,#36H,DKA1 ;判断显示单元是否已满MOV R1,#35H ;35H,36H单元用于更好的控制五位显示AJMP DKADKA1: MOV 34H,33H ;按键代码按左移显示,先按先显示MOV 33H,32HMOV 32H,31HMOV 31H,30HMOV 30H,BDKA: MOV A,P1 ;读P1口ANL A,#0F0H ;屏蔽高四位XRL A,#0F0H ;地位是有低电平JNZ DKA ;如果有低电平继续读P1口,否者向下执行,查找第二行NOKEY4: LJMP DIS1;===================================;功能按键功能设定DENG_HAO:MOV DPTR,#JI_SUAN ;等号键功能通过加、减、乘、除设定的偏移量来调用子程序MOV A,3CH ;3CH存放的为功能程序入口地址偏移量JMP @A+DPTR ;转移到按键功能程序JI_SUAN: AJMP JIA1 ;加计算子程序AJMP JIAN1 ;减计算子程序AJMP CHENG1 ;乘计算子程序AJMP CHU ;除计算子程序;=======删除键功能SAN_CHU: ACALL QING_DISAJMP DKA;=======加键功能JIA: MOV 3CH,#00HACALL CUN_SHUACALL QING_DISAJMP DKA;=======减键功能JIAN: MOV 3CH,#02HACALL CUN_SHUACALL QING_DISAJMP DKA;=======乘键功能CHENG: MOV 3CH,#04HACALL CUN_SHUACALL QING_DISAJMP DKA;=======除键功能CHU: MOV 3DH,#06HACALL CUN_SHUACALL QING_DISAJMP DKA;=================================;存被加(减、乘、除)数,存放在37H~3BH里CUN_SHU: MOV 37H,30H ;36H存放的为最低位MOV 38H,31HMOV 39H,32HMOV 3AH,33HMOV 3BH,34H ;3AH存放的为最高位RET;================================;清除显示单元QING_DIS: MOV R1,#30HQING1: MOV @R1,#00HINC R1MOV A,R1CJNE A,#36H,QING1MOV R1,#30HLOP1: RET;================================;十进制加法子程序JIA1:MOV A,37H ;个位被加数ADD A,30H ;个位被加数+加数MOV B,#10 ;十六进制除10转换成BCD码DIV ABMOV 30H,B ;余数即个位存放在30HMOV 37H,A ;商存放在37HMOV A,38H ;十位被加数ADD A,31H ;十位被加数+加数ADD A,37H ;加上个位之和的进位MOV 37H,#00H ;清除37HMOV B,#10 ;十六进制除10转换成BCD码DIV ABMOV 31H,B ;余数即十位存放在31HMOV 38H,A ;商存放在38HMOV A,39H ;百位计算同十位ADD A,32HADD A,38HMOV 38H,#00HMOV B,#10DIV ABMOV 32H,BMOV 39H,AMOV A,3AH ;千位计算同十位ADD A,33HADD A,39HMOV 39H,#00HMOV B,#10DIV ABMOV 33H,BMOV 3AH,AMOV A,3BH ;万位计算同十位ADD A,34HADD A,3AHMOV 3AH,#00HMOV B,#10DIV ABMOV 34H,BMOV 3BH,#00HAJMP DKA;=====================JIAN1: AJMP DKACHENG1: AJMP DKACHU1: AJMP DKA;============================================= ;延时程序和查表表格DELY4ms: MOV R6,#8 ;延时4毫秒D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETDELY10ms:MOV R6,#20 ;延时10毫秒D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2RETTABLE: DB 07H, 04H, 01H ; / 本表格是以键盘为参考7 8 9 / DB 08H, 05H, 02H ; * 4 5 6 *DB 09H, 06H, 03H ; - 1 2 3 -DB 00H, 00H ;= + 清除0 = +END。
基于51单片机的计算器设计程序代码汇编
DBUF EQU 30HTEMP EQU 40HYJ EQU 50H ;结果存放YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放ORG 00HSTART: MOV R3,#0 ;初始化显示为空MOV GONG,#0MOV 30H,#10HMOV 31H,#10HMOV 32H,#10HMOV 33H,#10HMOV 34H,#10HMLOOP: CALL DISP ;PAN调显示子程序WAIT: CALL TESTKEY ; 判断有无按键JZ WAITCALL GETKEY ;读键INC R3 ;按键个数CJNE A,#0,NEXT1 ; 判断就是否数字键LJMP E1 ; 转数字键处理NEXT1: CJNE A,#1,NEXT2LJMP E1NEXT2: CJNE A,#2,NEXT3LJMP E1NEXT3: CJNE A,#3,NEXT4LJMP E1NEXT4: CJNE A,#4,NEXT5LJMP E1NEXT5: CJNE A,#5,NEXT6LJMP E1NEXT6: CJNE A,#6,NEXT7LJMP E1NEXT7: CJNE A,#7,NEXT8LJMP E1NEXT8: CJNE A,#8,NEXT9LJMP E1NEXT9: CJNE A,#9,NEXT10LJMP E1NEXT10: CJNE A,#10,NEXT11 ;判断就是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12LJMP E2NEXT12: CJNE A,#12, NEXT13LJMP E2NEXT13: CJNE A,#13,NEXT14LJMPE2NEXT14: C JNE A,#14,NEXT15LJMP E2NEXT15: L JMP E3 ;判断就是否清除键E1: CJNE R3,#1,N1 ;判断第几次按键LJMP E11 ;为第一个数字N1: CJNE R3,#2,N2LJMP E12 ;为第二个数字N2: CJNE R3,#3,N3LJMP E13 ;为第三个数字N3: LJMP E3 ;第四个数字转溢出E11: MOV R4,A ;输入值暂存R4 MOV 34H,A ;输入值送显示缓存MOV 33H,#10HMOV 32H,#10HLJMP MLOOP ;等待再次输入E12: MOV R7,A ;个位数暂存R7 MOV B,#10MOV A,R4MUL AB ;十位数ADD A,R7MOV R4,A ;输入值存R4MOV 32H,#10H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOP E13: MOV R7,AMOV B,#10MOV A,R4MUL ABJB OV,E3 ;输入溢出ADD A,R7JB CY,E3 ;输入溢出MOV R4,AMOV 32H,33H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE3: MOV R3,#0 ;按键次数清零MOV R4,#0 ;输入值清零MOV YJ,#0 ;计算结果清零MOV GONG,#0 ;功能键设为零MOV 30H,#10H ;显示清空MOV 31H,#10HMOV 32H,#10HMOV 33H,#10HMOV 34H,#10HLJMP MLOOPE2: MOV 34H,#10HMOV 33H,#10HMOV 32H,#10HMOV R0,GONG ;与上次功能键交换MOV GONG,AMOV A,R0CJNE A,#10,N21 ;判断功能键LJMP JIA ;"+"N21: CJNE A,#11,N22LJMP JIAN ・" II JN22: CJNE A,#12,N23LJMP CHENG ・jN23: CJNE A,#13,N24LJMP CHU ;"/"N24: CJNE A,#0,N25LJMP FIRST ;首次按功能键N25: LJMP DEN・n_n j 一N4: LJMP E3FIRST: MOV YJ,R4 ;输入值送结果MOV R3,#0 ;按键次数清零LJMP DISP1 ;结果处理JIA: MOV A,YJ ;上次结果送累加器ADD A,R4 ;上次结果加输入值JB CY,N4 ;溢出MOV YJ,A ;存本次结果MOV R3,#0 ;按键次数清零LJMP DISP1JIAN: MOV A,YJSUBB A,R4 ;上次结果减输入值JB CY,N4 ;负数溢出MOV YJ,AMOV R3,#0LJMP DISP1CHENG: MOV A,YJMOV B,AMOV A,R4MUL AB ;上次结果乘输入值JB OV,N4 ;溢出MOV YJ,ALJMP DISP1CHU: MOV A,R4MOV B,AMOV A,YJDIV AB ;上次结果除输入值MOV YJ,AMOV R3,#0LJMP DISP1DEN: MOV R3,#0LJMP DISP1DISP1: MOV B,#10MOV A,YJ ;结果送累加器DIV AB ;结果除10MOV YJ1,A ;暂存"商"MOV A,B ;取个位数MOV 34H,A ;个位数送显示缓存MOV A,YJ1JZ DISP11 ;结果就是否为一位数MOV B,#10MOV A,YJ1DIV ABMOV YJ1,AMOV A,BMOV 33H,A ;十位送显示缓存MOV A,YJ1JZ DISP11 ;结果就是否为二位数MOV 32H,A ;百位数送显示缓存DISP11: LJMP MLOOPDISP: MOV R0,#DBUF ;显示子程序MOV R1,#TEMP+4MOV R2,#5DP10: MOV DPTR,#SEGTABMOV A,@R0MOVC A,@A+DPTRMOV @R1,AINC R0DEC R1DJNZ R2,DP10MOV R0,#TEMPDP12: MOV A,@R0MOV P0,Aclr P2、7CALL D1MSsetb P2、7DB 74H, 61H, 21H, 7aHDB 20H, 60H, 88H, 83HDB 0C6H, 0A1H, 86H, 8EH,0ffHTESTKEY:ACALL DISPMOV P1,#0FH;读入键状态 MOVA,P1 CPLA ANLA,#0FH ;高四位不用 RETKEYTABLE:DBODEH,OEDH,ODDH,OBDHf 键码定义 DB0EBH,0DBH,0BBH,0E7H DB 0D7H,0B7H,07EH,07DH INCR0 MOVA,@R0 MOVP0,A clrP2、6 CALLD1MS setbP2、6 INCR0 MOVA,@R0 MOVP0,A clrP2、5 CALLD1MS setbP2、5 INCR0 MOVA,@R0 MOVP0,A clrP2、4 CALLD1MS setbP2、4 INCR0 MOVA,@R0 MOVP0,A clrP2、3 CALLD1MS setbP2、3 RETMOVR7,#02H MOVR6,#0FFH DJNZR6,$ DJNZR7,DMSRET D1MS:DMS: SEGTAB: DB 028H,7eH,0A2H,062HDB 07BH,077H,0BEH,0EEH GETKEY: ;读键子程序K12: MOV R6,#10 ACALL DELAYMOV P1,#0FH MOV A,P1 CJNEA,0FH,K12LJMP MLOOPMOV B,AMOV P1,#0EFH MOV A,P1 CJNEA,#0EFH,K13 MOV P1,#0DFH MOV A,P1 CJNEA,#0DFH,K13 MOV P1,#0BFH MOV A,P1 CJNEA,#0BFH,K13 MOV P1,#07FH MOV A,P1 CJNEA,#07FH,K13 LJMP MLOOPK13: ANL A,#0F0HORL A,BMOV B,AMOV R1,#16MOV R2,#0MOV DPTR,#KEYTABLEK14: MOV A,R2MOVC A,@A+DPTRCJNEA,B,K16 MOV P1,#0FHK15: MOV A,P1CJNEA,#0FH,K15MOV R6,#10ACALL DELAYMOV A,R2RETK16: INC R2DJNZ R1,K14AJMP MLOOPDELAY: MOV R7,#80DLOOP: DJNZ R7,DLOOPDJNZ R6,DLOOP;延时子程序RET END。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的简易计算器设计自动化控制一班kaoyanbaomu521摘要:近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本任务是个简易的两位数的四则运算,程序都是根据教材内和网络中的程序参考编写而成,在功能上还并不完善,限制也较多。
本任务重在设计构思与团队合作,使得我们用专业知识、专业技能分析和解决问题全面系统的锻炼。
关键词:单片机计算器范围加减乘除1 引言1.1 计算器的历史说起计算器,值得我们骄傲的是,最早的计算工具诞生在中国。
中国古代最早采用的一种计算工具叫筹策,又被叫做算筹。
这种算筹多用竹子制成,也有用木头,兽骨充当材料的。
约二百七十枚一束,放在布袋里可随身携带。
直到今天仍在使用的珠算盘,是中国古代计算工具领域中的另一项发明,明代时的珠算盘已经与现代的珠算盘几乎相同。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的"纳皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。
1.2 电子计算器的特殊键在使用电子计算器进行四则运算的时候,一般要用到数字键,四则运算键和清除数据键。
除了这些按键,还有一些特殊键,可以使计算更加简便迅速。
2 单片机概述单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。
3 芯片简介3.1 MSC-51芯片简介MCS-51单片机内部结构8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:·中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
·数据存储器(RAM)8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
图1·程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
·定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
·并行输入输出(I/O)口:8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
·全双工串行口:8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
·中断系统:8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
·时钟电路:8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
下图是MCS-51系列单片机的内部结构示意图2。
图2MCS-51的引脚说明:MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:MCS-51的引脚说明:MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,Array外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:如图3图3Pin9:RESET/V pd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。
RESET 由高电平下降为低电平后,系统即从0000H地址开始执行程序。
然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8051的初始态。
8051的复位方式可以是自动复位,也可以是手动复位,见下图4。
此外,RESET/V pd 还是一复用脚,V cc掉电其间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
图4·Pin30:ALE/当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。
而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。
更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。
如果单片机是EPROM,在编程其间,将用于输入编程脉冲。
·Pin29:当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序·Pin31:EA/Vpp存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。
如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。
显然,对内部无程序存储器的8031,EA端必须接地。
在编程时,EA/V脚还需加上21V的编程电压。
pp4 相关知识4.1数码管显示在本任务中用4位数码管显示当前数值的千,百,十,个,由于数码管个数多,如采用静态显示方式,则占用单片机的I/O口线太多,如果用定时器/计数器的串行移位寄存器工作方式及外接串入并出移位寄存器74LS164的方式,则电路复杂。
所以,在数码管个数较多时,常采用动态显示方式。
如图1-1所示为单片机应用系统中的一种数码管动态显示电路图,4位数码管的相同段并联在一起,由一个8位I/O(P1口)输出字形码控制显示某一字形,每个数码管的公共端由另外一个I/O口(P0口)输出的字位码控制,即数码管显示的字形是由单片机I/O 口输出的字形码确定,而哪个数码管点亮是由单片机I/O口输出的字位码确定的。
4个数码管分时轮流循环点亮,在同一时刻只有1个数码管点亮,但由于数码管具有余辉特性及人眼具有视觉暂留特性,所以适当地选取循环扫描频率,看上去所有数码管是同时点亮的,察觉不出闪烁现象。
动态显示方式所接数码管不能太多,否则会因每个数码管所分配的实际导通时间太少,使得数码管的亮度不足。
在本任务中,为了简便,字形码和字位码都没由加驱动电路,在实际应用中应加驱动电路。
数码管有共阴极和共阳极两种,对于共阳数码管,字形驱动输出0有效,字位驱动输出1有效;而对于共阴数码管则相反,即:字形驱动输出1有效,字位驱动输出0有效。
4.2矩阵按键键盘是单片机系统中最常用的人机对话输入设备,用户通过键盘向单片机输入数据或指令。
键盘控制程序需完成的任务有:监测是否有键按下,有键按下时,在无硬件去抖的动电路时,应用软件延时方法消除按键抖动影响;当有多个键同时按下时,只处理一个按键,不管一次按键持续多长时间,仅执行一次按键功能程序。
矩阵按键扫描程序是一种节省IO口的方法,按键数目越多节省IO口就越可观,思路:先判断某一列(行)是否有按键按下,再判断该行(列)是那一只键按下。
但是,在程序的写法上,采用了最简单的方法,使得程序效率最高。
本程序中,如果检测到某键按下了,就不再检测其它的按键,这完全能满足绝大多数需要,又能节省大量的CPU时间。
本键盘扫描程序的优点在于:不用专门的按键延时程序,提高了CPU效率,也不用中断来扫描键盘,节省了硬件资源。
另外,本键盘扫描程序,每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。
本键盘扫描子程序名叫key,每次要扫描时用lcall key调用即可。
5 计算器硬件电路设计8051单片机的P2口作键盘口,其中P2.4-P2.7为键盘扫描输出线,P2.0-P2.3为键盘扫描输入线。
键盘由4*4共16个按键组成,10个数字键(由0-9组成)5个运算符号(加减乘除等于)组成,1个清除键(作用相当于整体复位)。
4个数码管用于显示当前数值的千,百,十,个,采用动态显示方式,P1口接4个数码管的七段,P0口分别接4个数码管的公共端,P1口输出数码管的字形码,P0口输出数码管的字位码。
6 计算器程序设计6.1存储单元分配30H单元:数值个位显示单元;31H单元:数值十位显示单元;32H单元:数值百位显示单元;33H单元:数值千位显示单元;23H单元:第一操作数存储单元;24H单元:第二操作数存储单元;25H单元:键值暂存单元;27H单元:清除键状态;34H-37H单元:结果数据转换暂存单元;38H-39H单元:结果高低8位暂存单元;R5单元:操作数计数单元;R4单元:操作数数值位数计数单元;R3单元:运算符号存储单元。
6.2 主程序设计主程序进行程序中用到的一些存储单元的初始化,数值显示和4*4键盘扫描。