51单片机计算器设计参考word

合集下载

(完整版)基于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); }。

(完整word版)计算器的设计

(完整word版)计算器的设计

目录1。

设计要求 (2)2.设计方案与论证 (2)2.1总体设计思路 (2)2。

2总体方案 (2)3.设计原理及电路图 (4)3.1硬件设计 (4)3。

2软件设计 (11)3。

3 算术运算程序设计 (12)3。

4 显示程序设计 (13)4。

器件清单 (14)5.器件识别与检测 (15)6。

控制系统实现(软件编程与调试) (16)6。

1 硬件调试 (17)6.2 软件调试 (17)6。

3软件编程 (18)7。

设计心得 (28)8。

参考文献 (29)1。

设计要求要求计算器能实现加减乘除四种运算,具体如下:1.加法:四位整数加法,计算结果若超过四位则显示计算错误2.减法:四位整数减法,计算结果若小于零则显示计算错误3.乘法:多位整数乘法,计算结果若超过四位则显示计算错误4.除法:整数除法5.有清除功能设计要求:分别对键盘输入检测模块;LCD显示模块;算术运算模块;错误处理及提示模块进行设计,keil与protues仿真分析其设计结果。

2。

设计方案与论证2。

1总体设计思路:本计算器是以MCS-51系列8051单片机为核心构成的简易计算器系统。

该系统通过单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来。

整个计算器系统的工作过程为:首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入数码管动态显示。

整个系统可分为三个主要功能模块:功能模块一,实时键盘扫描;功能模块二,数据转换为了数码管显示;功能模块三,数码管动态显示。

2.2总体方案:根据功能和指示要求,本系统选用以MCS—51单片机为主控机.通过扩展必要的外围接口电路,实现对计算器的设计。

具体设计如下:1、由于要设计的是简单的计算器,可以进行四则运算,为了得到教好的显示效果,采用LCD 显示数据和结果。

2、另外键盘包括数字键(0—9)、符号键(+、—、*、/)、清除键和等号键,故只需要16个按键即可,设计中采用集成的计算机键盘.3、执行程序:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、—、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果.4、错误提示:当单片机执行程序中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算器得到的结果大于计算器的显示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上提示错误.①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。

基于51单片机的计算器设计实验报告(DOC)

基于51单片机的计算器设计实验报告(DOC)

基于51单片机的计算器设计实验报告班级:__12电子2_姓名:___风间__学号:___2015年1月6日一、实验目的1.初步尝试运用单片机进行系统设计;2.掌握矩阵键盘的中断扫描显示;3.掌握液晶或数码管的动态显示;4.掌握数据的存储和掉电保护。

二、实验设备及器材Keil c、 proteus、及单片机开发板。

三、实验内容基本要求:1完成标准型计算器的基本功能2.4*4矩阵键盘(0~9、+、-、*、/、=、%)进行数据的输入及加、减、乘、除基本运算,运用1602液晶或数码管进行显示3. 要求开机显示学号四、设计思路根据计算器的功能要求,选择AT89C51为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。

外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块AT89C51单片机构成。

计算器电路包括四个模块:选用LCD作为显示部分,矩阵键盘作为输入部分,运算模块,单片机控制部分。

模块图如图所示:计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。

具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用1602液晶显示数据和结果。

(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,需要16个按键。

(3)执行过程:开机显示学号,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。

线路原理框图如图所示。

五、基于proteus的硬件原理图六、软件流程图七、程序代码#include<reg51.h> //头文件#define unit unsigned int#define uchar unsigned charvoid xuehao(void);sbit SPK=P1^0;sbit lcden=P2^3;sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,temp,num,num_1;long a,b,c; //a,第一个数 b,第二个数 c,得数float a_c,b_c;uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0,};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};void delay(uchar z) // 延迟函数{uchar y;for(z;z>0;z--)for(y=0;y<110;y++);}void check() // 判断忙或空闲{do{P0=0xFF;rs=0;rw=1;lcden=0; //禁止读写delay(1); //等待,液晶显示器处理数据lcden=1; //允许读写}while(busy==1); //判断是否为空闲,1为忙,0为空闲}void write_com(uchar com) // 写指令函数{P0=com;rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(uchar date) // 写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init() //1602初始化函数{num=-1;lcden=1;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x80);write_com(0x01);num_1=0;i=0;j=0;a=0; //第一个参与运算的数b=0; //第二个参与运算的数c=0;flag=0;fuhao=0;SPK=0; //蜂鸣器打开delay(1000); //延时SPK=1; //蜂鸣器关闭}void keyscan() // 键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2) //如果按下的是'7','8'或'9 {if(j!=0){write_com(0x01);j=0;}if(flag==0) //没有按过符号键{a=a*10+table[num];}else //如果按过符号键{b=b*10+table[num];}}else //如果按下的是'/'{flag=1;fuhao=4; //4表示除号已按}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=4;break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6&&num!=7) //如果按下的是'4','5'或'6' {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}else{flag=1;fuhao=3; //3表示乘号已按}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=8;break;case 0xd0:num=9;break;case 0xb0:num=10;break;case 0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10) //如果按下的是'1','2'或'3' {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}else if(num==11){flag=1;fuhao=2; //2表示减号已按}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){SPK=0;delay(1000);SPK=1;temp=P3&0xf0;switch(temp){case 0xe0:num=12;break;case 0xd0:num=13;break;case 0xb0:num=14;break;case 0x70:num=15;break;}}while(P3!=0xf7);switch(num){case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;} //按下的是"清零"break;case 13:{ //按下的是"0"if(flag==0) //没有按过符号键{a=a*10;write_date(0x30);P1=0;}else if(flag==1) //如果按过符号键{b=b*10;write_date(0x30);}}break;case 14:{j=1;if(fuhao==1){write_com(0x80+0x4f); //按下等于键,光标前进至第二行最后一个显示处write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_com(0x80+0x4f);write_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;i++;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;} break;}}}void xuehao() //开机显示学号{write_com(0x80); //从第一行第一位开始write_date('1');write_date('2');write_date('0');write_date('0');write_date('4');write_date('0');write_date('1');write_date('2');write_date('1');write_date('7');}void main() //主函数{init();xuehao();while(1){keyscan();}}八、运行结果图开机显示学号:加法运算:乘法运算:九、扩展功能在基本的功能上加了蜂鸣器电路,使按键的时候能发出声音。

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

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

(完整)基于51单片机的简易计算器设计编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)基于51单片机的简易计算器设计)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)基于51单片机的简易计算器设计的全部内容。

基于单片机的简易计算器设计摘要 (3)关键字:80C51 LCD1602 4*4矩阵键盘计算器 (3)第一章绪论 (4)1.1 系统开发背景 (4)1.2 系统开发意义 (4)1.3 设计目的 (4)1。

4 设计任务 (4)第二章单片机发展现状 (5)2。

1 目前单片机的发展状况 (5)2。

1。

1单片机的应用场合 (6)2。

2 计算器系统现状 (6)2.3 简易计算器系统介绍 (6)第三章系统硬件设计及说明 (7)3。

1 系统组成及总体框图 (8)3.2 AT89S52单片机介绍 (8)3.3 其它器件介绍及说明 (10)3.3.1 LCD1602液晶显示 (10)3.3。

2 4*4矩阵扫描按键 (13)第四章 PROTEUS模拟仿真 (14)第五章系统硬件设计及说明 (16)第六章软件设计 (17)6.1 汇编语言和C语言的特点及选择 (17)6。

2 源程序代码 (17)摘要近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。

计算机在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计主要以80C51单片机为控制芯片,用C语言进行编程实现,通过4*4矩阵键盘控制,输出用液晶屏LCD1602显示,该计算器可以实现一般的加减乘除四则混合运算。

51单片机简易计算器设计报告

51单片机简易计算器设计报告

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

该计算器通过
16位的LCD显示屏实现了基本计算功能,包括加、减、乘、除、取反、开方等。

1. 硬件设计
该计算器的核心部件是STC89C52单片机。

STC89C52是一种
高性能、低功耗的8位单片机,拥有8KB的Flash程序存储器和128字节的内部RAM,可提供多种功能和通讯接口。

通过
I/O口与LCD模块通讯,实现输出功能。

该计算器使用16位的LCD显示屏,显示范围为-99.99~99.99,共有6个数字位。

显示屏使用了ST7920控制器,可通过串行、并行等多种方式控制。

2. 软件设计
该计算器的软件设计主要包括三部分:键盘扫描,计算功能和LCD显示。

键盘扫描:该计算器采用4x5矩阵键盘,通过程序对键盘进行扫描,实现对不同按键的检测。

计算功能:该计算器可以实现基本的四则运算、取反、开方等功能。

对于四则运算,通过栈来实现计算,将运算符压入栈中,然后将操作数从栈中取出进行计算。

LCD显示:该计算器使用16位的LCD显示屏,通过程序控制数据和命令的传输,将计算结果显示在LCD屏幕上。

3. 总结
通过对51单片机简易计算器的设计报告,可以看出该计算器实现了基本的计算功能,通过硬件设计和软件设计相结合,将计算器的功能实现得十分完整。

该计算器的设计初步掌握了51单片机的应用,有助于后续项目的开展。

51单片机数码管计算器课设报告(DOC)

51单片机数码管计算器课设报告(DOC)

课程名称:微机原理课程设计题目:51单片机共阴极数码管计算器课程设计报告近几年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。

在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结合,加以完善。

本设计是基于51系列的单片机进行的十进制计算器系统设计可以完成计算器的键盘输入进行加、减、乘、除的简单四则运算并在4位数码管上相应的显示结果。

硬件方面从功能考虑首先选择内部存储资源丰富的STC89C52单片机输入采用4×4矩阵键盘。

显示采用4位7段共阴极数码管动态显示。

软件方面从分析计算器功能、流程图设计再到程序的编写进行系统设计。

编程语言方面选用C语言进行编写,并选用全球编译效率最高的KEIL公司的μVision2软件,采用C语言进行编程并用Proteus仿真。

通过最后的调试和测试,本计算器可以实现简单的四位数的加减乘除功能。

关键词:单片机,计算器,共阴极数码管,矩阵键盘一、设计任务要求 (4)1.1 设计任务 (4)1.2 设计的目的 (4)1.3 设计要求 (4)二、方案总体设计 (5)2.1 系统模块图 (5)2.2 总体方案工作原理 (5)三、硬件设计 (6)3.1 整个单片机的接口电路 (6)3.2 单片机STC89C52说明 (6)3.3 引脚说明 (7)3.4 计算器系统现状 (8)3.5 最小系统原理图 (9)3.6 显示电路 (11)3.7 按键输入电路 (13)四、软件设计 (15)五、系统仿真与调试 (16)5.1 采用KEIL 开发的89c52单片机应用程序步骤 (16)5.2 硬件电路图的接法操作 (16)5.3 单片机系统Proteus设计与仿真过程 (16)5.4 STC-ISP程序烧录软件 (17)5.5 实物图 (18)5.6 仿真图 (19)5.7 计算展示 (19)六、设计总结 (22)七、参考文献 (23)一、设计任务要求1.1 设计任务满足计算器的基本要求,可以基本的运算(加减乘除),数据归零,利用51系列单片机设计符合功能的计算器,并用LED 码管显示数据,4*4的矩阵键盘实现数据输入。

51单片机计算器程序设计报告

51单片机计算器程序设计报告

一、课题任务及要求要求:1、掌握数码管移位动态扫描显示的编程方法2、掌握矩阵扫描的编程方法3、掌握数据在内部运算的编程方法任务:1、实现最大6位正整数加、减、乘、除2、具备清零、等于功能3、16个按键功能依次为:数字0、数字1、数字2、数字3、数字4、数字5、数字6、数字7、数字8、数字9、清零、等于、加、减、乘、除二、硬件设计1.原理图2.原理分析该设计通过89C51芯片控制6个一位数码管显示,并实时检测按键按下情况来实现计算器功能,16个按键有10个为数字按键其他6个分别为加、减、乘、除、复位、等于电路接上电源后数码管显示个位显示数字0 ,芯片对按键进行实时扫描,通过矩阵键盘进行计算,特别注意的是,当结果为负数时,数码管显现EORR。

(一)、硬件部分1、数码管为一位共阴数码管,共6个;故在段码输出口外加NPN型三极管作驱动2、51芯片P1口接键盘端(矩阵按键)、P3口接段码、P2口的P2_0—P2_5接位码3、按键为四乘四矩阵,共16个键(二)、软件部分1、数码管移位显示的实现是通过标志位wei2的数值变化控制dispiay函数显示位来实现的2、程序的重要算法是通过类型为unsigned int 的数temp和数组str[]实现整体加减乘除、各位显示的只要弄懂这一算法,此程序就可轻易掌握3.PCB图略。

4.元件清单及造价预算按键 20个单价 0.2 元总计 4元万用板 2块单价 4 元总计 8元一位共阴数码管 6个单价 2 元总计 2元三极管 7个单价 0.2 元总计 1.4元1K电阻 20个单价 0.01 元总计 2毛排插及排线 5对单价 1元总计 5元电容 3个单价 0.2元总计 6毛晶振 1个单价 1元总计 1元8051芯片 1 个单价 6元总计 6元费用总计 26.2元5.实物照片三、程序设计头程序str[6]=str[5]=str[4]=str[3]=str[2]=str[1]=10;str1[6]=str1[5]=str1[4]=str1[3]=str1[2]=str[1];#include<reg51.h> //51单片机基本定义头文件#include<intrins.h> //循环位移头文件#define uchar unsigned char //宏定义#define uint unsigned intsbit P1_4=P1^4; //IO端口定义(矩阵扫描后4位端口)sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;uchar i,num,s; //全局变量定义uchar wei,wei2,ss,ss1,ss2,str1[]={0,0,0,0,0,0,0};long temp,temp1,str[]={10,10,10,10,10,10,10};uchar code dutable[]={ //段位编码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uchar code wetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};void init(); //函数声明void panduan();void display();void delay(uint z);void shaomiao();void main() //主函数{init(); //调用变量初始化函数while(1) //大循环{shaomiao(); //调用矩阵扫描加处理函数display(); //调用显示函数}}void init() //变量初始化函数{ss2=0;wei2=1;temp1=0;ss=0;ss1=0;temp=0;wei=0;num=0;}void delay(uint z)//延时函数(单位ms){uchar i;uint j;for(j=z;j>0;j--)for(i=114;i>0;i--);}void shaomiao() //扫描加处理函数{for(i=0,s=0xfe;i<4;i++) //低四位端口依次赋值1 {P1=s; //对P1口赋值panduan(); //调用判断处理函数s=_crol_(s,1); //s循环位左移s=s|0xf0; //进行位或运算} (使高4位复原)}void panduan(){uchar n;if(P1_4==0||P1_5==0||P1_6==0||P1_7==0){delay(10);P1=s|0xf0;if(P1_4==0||P1_5==0||P1_6==0||P1_7==0){if(P1_4==0){ n=1;num=i*4+n-1;}else if(P1_5==0){ n=2;num=i*4+n-1;}else if(P1_6==0){ n=3;num=i*4+n-1;}else if(P1_7==0){ n=4;num=i*4+n-1;}if(num<10&&wei!=7){wei++;if(ss1==1){temp=0;str[6]=str[5]=str[4]=str[3]=str[2]=str[1]=10;str1[6]=str1[5]=str1[4]=str1[3]=str1[2]=str1[1]=0;ss1=0;}str[wei]=num;if(str[1]!=10) temp=str[1];if(str[2]!=10) temp=str[1]*10+str[2];if(str[3]!=10) temp=str[1]*100+str[2]*10+str[3];if(str[4]!=10) temp=str[1]*1000+str[2]*100+str[3]*10+str[4];if(str[5]!=10) temp=str[1]*10000+str[2]*1000+str[3]*100+str[4]*10+str[5]; if(str[6]!=10)temp=str[1]*100000+str[2]*10000+str[3]*1000+str[4]*100+str[5]*10+str[6];}if(num>=10){wei=0;if(num==10){temp=0;1[1]=0;wei=0;temp1=0;ss=0;wei2=1;}if(ss1==0&&num==11||(ss1==0&&ss2!=0&&num>11&&num<16)){if(num==11)ss2=0;switch(ss){case 0: break;case 1: temp=temp+temp1;break;case 2: temp=temp1-temp;break;case 3: temp=temp*temp1;break;case 4: temp=temp1/temp;break;}if(temp>999999)temp=0;ss1=1;}if(num==12){temp1=temp;ss=1;ss1=1;ss2=1;}if(num==13){temp1=temp;ss=2;ss1=1;ss2=1;}if(num==14){temp1=temp;ss=3;ss1=1;ss2=1;}if(num==15){temp1=temp;ss=4;ss1=1;ss2=1;}}}str1[6]=temp/100000;str1[5]=temp%100000/10000;str1[4]=temp%10000/1000;str1[3]=temp%1000/100;str1[2]=temp%100/10;str1[1]=temp%10/1;if(str1[1]!=0)wei2=1;if(str1[2]!=0)wei2=2;if(str1[3]!=0)wei2=3;if(str1[4]!=0)wei2=4;if(str1[5]!=0)wei2=5;if(str1[6]!=0)wei2=6;}while(P1_4==0||P1_5==0||P1_6==0||P1_7==0); }void display(){char i1;for(i1=1;i1<wei2+1;i1++){if(num==0&&ss==4||temp<0){P2=wetable[0];P3=dutable[14];}else{P2=wetable[i1-1];P3=dutable[str1[i1]];delay(10);P3=0xff;}}}四、调试结果1、硬件调试a. 把电路板焊好后,先通过检查电路板表面检查是否有漏焊、错焊、接触不良等b. 编写检测程序逐个点亮数码管,检查数码显示部分是否有硬件问题c.编写检测程序检测矩阵扫描是否有硬件问题2、程序调试重点就是这个部分,很多程序就是在调试过程中慢慢完善,先前所完成的程序部分只能算一个基本框架,当然,这一切是建立在硬件没用问题的基础上程序在进行调试时,可以像硬件一样使用分模块调试,这样可以最迅捷的找出问题所在,不受其他模块的影响我们在硬件调试时,一开始时51芯片不工作,经过反复检查后发现原来51芯片的31脚(/EA/VPP)必须接入高电平才能使单片机在读取程序时优先访问内部程序存储器,否则只访问外部程序存储器,而我们的程序是在内部的,故芯片不工作,我们随即在31脚外接VCC和限流电阻,在解决了这个后,硬件OK了。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

51单片机简易计算器设计报告(一)

51单片机简易计算器设计报告(一)

51单片机简易计算器设计报告(一)背景介绍在数字化时代,计算器作为一种简单易用的工具,越来越得到人们的关注和热爱。

而基于51单片机的简易计算器,不仅可以成为一种学习电子技术的手段,还具有满足简单计算需求的实用性。

设计思路本计算器采用键盘输入和数码管输出的电路设计,为用户提供加、减、乘、除、小数点、退位以及等于等功能。

1.键盘输入采用矩阵键盘的方式,将所有按键按行列排列,并利用51单片机中断方式来读取键值。

2.计算处理通过编写相应的程序代码,计算出用户输入的两个数值及操作符的结果,并将结果存储在数据缓存器中,最后将其输出至数码管。

3.数码管显示根据计算结果的数据类型,将其经过相应的转换处理后,通过数码管将结果输出至用户。

设计技术1.软件编写软件编写方面,采用汇编语言进行编写,代码总长度为2.2KB 左右。

其中,以中断方式读取键值、实现数值存储与判断、计算处理、数码管的结果输出等作为关键点进行编写。

2.硬件搭建硬件搭建方面,需要按照电路图进行搭建,并将51单片机与相关周边电路进行连接。

根据设计思路,将键盘、数码管、电源、指示灯等设备按照需求进行连接。

可改进之处虽然 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单片机的简易计算器设计基于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单片机的简易计算器设计毕业论文(设计)word格式可编辑 精品

基于51单片机的简易计算器设计毕业论文(设计)word格式可编辑 精品

摘要工程实践教学环节是为了学生能够更好地巩固和实践所学专业知识而设置的,在本次工程实践中,我以《智能化测量控制仪表原理与设计》、《MCS-51系列单片微型计算机及其应用》课程中所学知识为基础,设计了简易计算器。

本系统以MCS-51系列中的8051单片机为核心,能够实现多位数的四则运算。

该系统通过检测矩阵键盘扫描,判断是否按键,经数据转换把数值送入数码管动态显示。

本系统的设计说明重点介绍了如下几方面的内容:基于单片机简易计算器的基本功能,同时对矩阵键盘及数码管动态显示原理进行了简单的阐述;介绍了系统的总体设计、给出了系统的整体流程框图,并对其进行了功能模块划分及所采用的元器件进行了详细说明;对系统各功能模块的软、硬件实现进行了详细的设计说明。

关键词:MCS-51;8051单片机;计算器;加减乘除AbstractThe engineering practice teaching is to students better to consolidate and practice have set up by the professional knowledge, in this engineering practice, I to the intelligent measurement control instrument principle and design ", "the MCS-51 series single chip computer and its application" course knowledge as the foundation, the design the simple calculator. This system to MCS-51 of the 8051 series single chip microcomputer as the core, can realize the connection arithmetic. The system through the test matrix keyboard scan, judge whether key, the data transfer the numerical into digital tube dynamic display. This system mainly introduced the design that the following aspects of content: based on single chip microcomputer simple calculator basic functions, and the matrix keyboard and a digital tube dynamic display of the principle of a simple expatiated; introduced the design of the whole system, the whole process of the system are discussed, and its function module partition and the components for a detailed explanation; the functional modules of the system hardware and software of the implementation of the detailed design instructions.Key words: MCS-51;8051 single chip microcomputer;Calculator;Add, subtract, multiply and divide:目录第1章绪论 (1)1.1课题简介 (1)1.2设计目的 (1)1.3设计任务 (1)1.4章节安排说明 (1)第2章计算器系统简介 (2)2.1 单片机发展现状 (2)2.2计算机系统现状 (2)2.3简易计算器系统简介 (3)第3章计算机硬件系统简介 (4)3.1计算机硬件需求 (4)3.2MCS-51系列单片机简介 (4)3.3外围电路设计 (8)3.3.1振荡电路设计 (8)3.3.2复位电路设计 (9)3.3.3 键盘电路设计 (9)3.3.4 数码管显示电路设计 (10)3.4硬件原理图 (11)第4章计算器软件系统设计 (12)4.1系统模块图 (12)4.2系统流程图 (12)4.3 计算器主程序设计 (12)4.3.1计算器主程序设计 (12)4.3.2 存储单元分配 (13)4.4 计算器子程序设计 (14)4.4.1输入程序设计 (14)4.4.2运算程序设计 (15)4.4.3 显示程序设计 (16)第5章结论与展望 (18)5.1结论 (18)5.2不足与展望 (18)参考文献 (19)附录程序源代码 (20)第1章绪论1.1课题简介单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。

51单片机简易计算器设计-51单片机简易计算器课程设计

51单片机简易计算器设计-51单片机简易计算器课程设计

目录一、设计任务和要求 (2)1、设计要求 (2)2、设计方案的确定 (2)二、硬件设计 (2)1、单片机最小系统 (2)2、键盘电路的设计 (3)3、显示电路的设计 (3)4、系统硬件电路图 (4)三、软件设计 (5)1 系统设计 (5)2 显示电路的设计 (6)3、程序清单 (8)四、调试与仿真 (14)五、试验箱实物图 (14)六、心得体会 (15)一、设计任务和要求1、设计要求利用单片机设计并制作简易计算器。

具体要求如下:1、4*4按键用于0~9的数字输入、加减乘除、等于、清零功能;2、能实现简单的加减乘除运算;3、输入数字及计算结果通过LED或LCD显示器显示。

2、设计方案的确定按照设计要求,本课题需要使用数码管显示和扩展4*4键盘,由于AT89C51芯片的I口不够多,而且为了硬件电路设计的简单化,故选择串行动态显示和用P1口扩展4*4键盘,扩展的4*4键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。

主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。

二、硬件设计简易数字计算器系统硬件设计主要包括:键盘电路,显示电路以及其他辅助电路。

下面分别进行设计。

1.单片机最小系统单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片、复位电路和晶振电路。

(1)、复位电路复位电路本设计采用上电与手动复位电路,电阻分别选取100和10K,电容选取10uF,系统一上电,芯片就复位,或者中途按按键也可以进行复位。

(2)、晶振电路图三晶振电路晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。

单片机的晶振选取11.0592MHz,晶振旁电容选取30pF。

2.键盘电路的设计键盘可分为两类:编码键盘和非编码键盘。

编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。

通用计算机使用的标准键盘就是编码键盘。

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

基于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液晶显示屏进行显示。

(完整word版)51单片机电路的设计

(完整word版)51单片机电路的设计

1.1 51单片机电路的设计在本设计中,考虑到单片机构成的应用系统有较大的可靠性,容易构成各种规模的应用系统,且应用系统有较高的软、硬件利用系数.还具有可编程性,硬件的功能描述可完全在软件上实现。

另外,本设计还需要利用单片机的定时计数器、中断系统、串行接口等等,所以,选择以单片机为核心进行设计具有极大的必要性.在硬件设计中,选用MS-51系列单片机,其各个I/O口分别接有按键、LED灯、七位数码管等,通过软件进行控制。

MCS—51单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元,以及数据总线、地址总线和控制总线等三大总线,现在分别加以说明:1)中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。

2)数据存储器(RAM):内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

3)程序存储器(ROM):共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格.4)定时/计数器(ROM):有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

5)并行输入输出(I/O)口:共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输。

6)全双工串行口:内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。

7)中断系统:具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串口中断,可满足不同的控制要求,并具有2级的优先级别选择。

51单片机计算器设计报告

51单片机计算器设计报告

目录一设计概述------------------------------------------3 二硬件电路图---------------------------------------3 三软件流程图---------------------------------------4 四结论------------------------------------------------11 五参考文献-------------------------------------------13一、1.1设计概述计算器通过编译,能实现简单的四位数加减及两位数的乘除,输入的数通过键盘给出,要求显示要操作的数,并显示结果,编译十进制跟十六进制之间转换的程序,实现十进制转十六进制,显示结果。

1.2功能说明简单的运算功能:当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除,并将结果显示出来。

进制转换的功能:通过输入的十进制数,经过计算器的功能将其转换为十六进制数,并将结果显示出来。

二、硬件电路图主要程序流程说明:主程序首先进行初始化,设定一些变量及其意义,扫描键盘,当输入有0~9数字时,通过键盘的扫描程序,将数值赋给second并在显示器上来,当输入的是加减符号的时候,通过键盘的扫面程序,赋予OP相应值,并跳到运算部分,通过判断preop的值,执行相应的运算部分,将OP的值赋给preop并把second的值赋给first。

再一次通过输入0~9的数字,再一次经过键盘的扫描程序,输出second的值,最后通过输入键盘上的等号,右键盘扫描得出相应的OP,跳到运算部分,根据程序的流程,将第一个数的跟第二个数进行简单的加、减、乘、除运算,并将结果通过显示器输出。

同理,当需要进行进制之间的转换时,输入相应的数字,通过键盘的扫描不显示在显示器上,再通过控制,进制转换开关,如果进制转换开关置0 按下,就实现了进制之间的相互转换。

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

1引言当今时代,是一个新技术层出不穷的时代。

在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。

单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。

目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。

过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间内学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间内将单片机技术融会贯通,才能跟上时代的步伐。

它所给人带来的方便也是不可否定的,它在一块芯片内集成了计算机的各种功能部件,构成一种单片式的微型计算机。

20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

本设计是由单片机实现的模拟计算器,它不仅能实现数据的加减乘除运算,而且还能使数据及其计算结果在数码管上显示出来,能够实现0-256的数字四则运算。

本设计是用单片机AT89C51来控制,采用共阳极数码显示,软件部分是由C语言来编写的。

设计任务利用键盘和数码管设计一个简单的数学计算器,可以完成简单的如加,减,乘,除的四则运算,并将运算结果在数码管上显示出来。

2.方案论证与设计根据功能和指标要求,本系统选用MCS 51 单片机为主控机。

通过扩展必要的外围接口电路,实现对计算器的设计。

具体设计考虑如下:①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故我们采用可以进行四位数字的运算,选用8 个LED 数码管显示数据和结果。

②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。

系统模块图:2.1 输入模块:键盘扫描计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。

为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O 线作为列线组成键盘。

在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。

矩阵键盘的工作原理:计算器的键盘布局如图2 所示:一般有16 个键组成,在单片机中正好可以用一个P 口实现16 个按键功能,这种形式在单片机系统中也最常用。

由图 3 矩阵键盘内部电路图可以知道,当无按键闭合时,P10~P13 与P14~P17 之间开路。

当有键闭合时,与闭合键相连的两条I/O 口线之间短路。

判断有无按键按下的方法是:第一步,置列线P14~P17 为输入状态,从行线P10~P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。

第二步,行线轮流输出低电平,从列线P14~P17 读入数据,若有某一列为低电平,则对应行线上有键按下。

综合一二两步的结果,可确定按键编号。

但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。

2.2 运算模块:单片机控制AT89C51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。

如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。

[3][5]单片机是靠程序运行的,并且可以修改。

通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。

2.3 显示模块:LED 显示发光二极管LED 是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。

因而作为典型的外围器件,LED 显示单元是反映系统输出和操作输入的有效器件。

LED 具备数字接口可以方便的和大年纪系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等,因而在单片机应用系统中获得了广泛的应用。

[2][4]通常的数码显示器是由7 段条形的LED 组成(如图4 所示),点亮适当的字段,就可显示出不同的数字。

我们采用8 段数码管,其中位于显示器右下角的LED 作小数点用。

LED 显示器有两种不同的形式:共阴极和共阳极。

本次设计采用共阴极接法(如图5所示)。

3、硬件原理3.1 硬件连接图3-1所示是简易计算器电路原理图。

P3口用于键盘输入,接4X4键值与键盘对应表如图表所示,P0口和P2口用于显示,P2口用于显示数位值高位,P0用于显示数位值的低位。

键值 0 1 2 3 4 5 6 7 8 9 + - x / = ON/C功能 0 1 2 3 4 5 6 7 8 9 + - x / = 清零4、软件设计在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。

设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。

这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。

根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。

这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。

功能流程图如下:程序流程图程序:#include"at89x52.h" //头文件//---------------------预定义模块---------------------------////*********************预定义数组***************************////字形码 0 1 2 3 4 5 6 7const unsigned char KEY_NUMBER[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 // 8 9 + - * / = CE,0x7f,0x6f,0xF0,0xC0,0xF6,0xD2,0x89,0xB9};//扫描键码 0 1 2 3 4 5 6 7const unsigned char KEY_VALUE[]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed // 8 9 A B C D E F,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7};//数码管各显示位: 0位 1位 2位 3位 4位const unsigned char DISPLAY_BIT[5]={0xFE,0xFD,0xFB,0xF7,0xEF};//十进制转换权值const int bcd_right[5]={1,10,100,1000,10000};unsigned char buffer_number[5]; //输入数据缓冲区unsigned char buffer_dis[5]; //计算结果显示缓冲区unsigned long int buffer_opera[5]; //输入数据十进制转换缓冲区//*******************预定义变量***************************//unsigned char const NULL=0xFF;unsigned char opera=0x00; //输入数据转换指针unsigned char count=0x00; //键盘输入指针unsigned char enter_number=0x01; //输入数据显示和计算结果显示开关unsigned char ptr_i=0x00; //运算结果转换指针unsigned char buffer_control; //控制键缓冲区unsigned char key_bcd; //按键的十进制值unsigned char scan_key; //当前扫描到的键值unsigned char temp_c; //临时变量unsigned char ptr_c; //十进制转化指针unsigned char account; //四则运算标志unsigned long int result=0x00; //当前计算结果unsigned long int rlt; //前一个输入的数的十进制值unsigned long int sec_rlt; //后一个输入的数的十进制值unsigned long int c_n; //当前转换的运算结果/*******************************************************名称: 初始化运行环境功能:初始化各寄存器与端口状态参数:无返回值:无*******************************************************/void DeviceInit(void){TL0=0xBF; //置定时器中断时间为20msTH0=0x63;TMOD=0x01; //设定定时器/计数器0工作方式为1IE=0x82; //允许全局中断,允许定时器/计数器0溢出中断TR0=0x01; //启动定时器/计数器0}/******************************************************* 名称: 延时模块功能:延时参数: unsigned char i返回值:无*******************************************************/ void Delay(unsigned char i){int j;while((i--)!=0){ for(j=0;j<=0x6f;j++);}}/******************************************************* 名称: 清除模块功能:清除当前已经输入的数据通过输入缓冲区中的数乘以它们各自对应的权值再求和参数:参数为1时,清除输入数据缓冲区参数为2时,清除十进制转化缓冲区返回值:无*******************************************************/ void Clear(unsigned char clr_pid){temp_c=0x00;for(temp_c;temp_c<=4;temp_c++){if(clr_pid==1) //参数为1时,输入数据缓冲区全部置0{count=0x00; //按键次数置0buffer_number[temp_c]=0x00;}if(clr_pid==2) //参数为2时,输入数据缓冲区全部置0{opera=0x00; //输入数的个数置0buffer_opera[temp_c]=0x00;}}}/******************************************************* 名称: 数据处理模块功能:将输入的数据转化为10进制数通过输入缓冲区中的数乘以它们各自对应的权值再求和参数:无返回值:无*******************************************************/void BcdConvert(void){temp_c=0x00;ptr_c=opera-1;if(opera !=0){while(temp_c<=ptr_c) //当前位乘以对应的权值再加上前一次的计算值{ //将输入数据缓冲区中的数转化为对应的十进制数buffer_opera[ptr_c-temp_c]*=bcd_right[temp_c];result+=buffer_opera[ptr_c-temp_c];temp_c++;}Clear(2); //转化完成,将十进制转换缓冲区清0}}/*******************************************************名称: 计算结果处理模块功能:按位分解计算结果,留待显示将要转化的数除以10后取余数,就可以将其按位分解转化的结果是反向的参数:无返回值:无*******************************************************/void Convert(void){c_n=result;//将计算结果反向分解,用于显示do{ //除10取余buffer_dis[ptr_i]=c_n%10;c_n/=10;ptr_i++;}while(c_n!=0x00);}/*******************************************************名称: 四则运算模块功能:对先后输入的两个数按规则进行四则运算参数:无返回值:无*******************************************************/ void Calculate(void){BcdConvert(); //将要运算的数转化成10进制数enter_number=0x00; //设置运算结果显示标志switch(account){case 0x00: //加法,将前后输入的两个数相加result+=rlt;break;case 0x01: //减法if(rlt>=result)result=rlt-result;else //如果被减数比减数小{buffer_control=0xC0;result=~(rlt-result-0x01);}break;case 0x02: //乘法result*=rlt;break;case 0x03: //除法result=rlt/result;break;}Convert(); //调用计算结果处理函数Clear(2); //清除计算结果}/******************************************************* 名称: 控制键处理模块功能:对各个控制键进行对应的操作参数:无返回值:无*******************************************************/ void Control(void){Clear(1); //清除显示缓冲区//*********************等号处理*********************// if(buffer_control==0x89)Calculate(); //调用计算函数//*********************清除键处理*******************// else if(buffer_control==0xB9){Clear(1); //清除已输入的数Clear(2); //清除当前也转化的值ptr_i=0x00; //清除显示指针result=rlt=0x00; //清除元算结果}//********************运算符号处理******************// else{BcdConvert(); //将先前输入的数转化为10进制数rlt=result; //保存转化的结果result=0x00; //清除上一次转化的结果,准备下一次转化switch(buffer_control){case 0xF0: //加法account=0x00;break;case 0xC0: //减法account=0x01;break;case 0xF6: //乘法account=0x02; //乘法运算标志break;case 0xD2: //除法account=0x03; //除法运算标志break;default:break;}}}/******************************************************* 名称: 按键判断模块功能:判断是否有键被按下参数:无返回值:有键按下则返回1没有键按下则返回0*******************************************************/ unsigned char KeyDown(void){temp_c=0x00;P2=0xf0;temp_c=P2;if(temp_c!=0xf0)return 1; //有键按下返回1elsereturn 0; //没有键按下返回0}/*******************************************************名称: 按键处理函模块功能:获取当前按键参数:无返回值:返回当前按键的字形码如果没有键按下,返回NULL*******************************************************/unsigned char KeyPress (void){if(KeyDown()==1) //判断是否有键按下{Delay(30); //延时消抖//**************扫描当前被按下的键值***********************//P2=0xF0; //扫描低4位scan_key=P2; //记录扫描结果P2=0x0F; //扫描高四位temp_c=P2; //记录扫描结果scan_key^=temp_c; //两结果相异或得键值//**************当有键被按下时关闭显示*********************//do{P1=0xFF; //如果有键按下,关闭显示}while(KeyDown()==1); //等待按键释放,如果有键按下,则不显示任何数Delay(30); //延时消抖//**********当有键按下后开始扫描所按下的键***************//for(key_bcd=0;key_bcd<=15;key_bcd++) //查找键值对应的字符码{if(KEY_VALUE[key_bcd]==scan_key) //如果找到对应的键值{ptr_i=0x00; //清除运算结果显示指针,开始显示输入的数据//*****************判断是数字键还是控制键****************//if(key_bcd<=0x09) //小于10的键为数字键{enter_number=0x01; //设置输入数据显示标志if(count<=0x04) //如果缓冲区未满{buffer_number[count]=KEY_NUMBER[key_bcd]; //当前键送缓冲区buffer_opera[opera]=key_bcd; //保存当前按键的十进制值opera++; //指针自加count++;}else //如果缓冲区溢出{count=0x00;Clear(1); //清楚缓冲区buffer_number[0]=KEY_NUMBER[key_bcd]; //缓冲区初始位存入当前键的字符码buffer_opera[opera]=key_bcd; //保存当前按键的十进制值opera++;count++;}return KEY_NUMBER[key_bcd]; //返回对应的数字字符值}else //大于9的键为控制键{buffer_control=KEY_NUMBER[key_bcd]; //控制键送控制缓冲区Control(); //调用控制键处理函数}}}}elsereturn NULL; //如果没有键按下,返回NULL}/*******************************************************名称: 数码管显示模块功能:在数码管上显示输入的数据和计算后的结果参数:无返回值:无*******************************************************/void Display(void){unsigned char m=0; //显示字符指针unsigned char n=0; //显示位指针;while(KeyPress()==NULL) //当有键被按下时开始显示{//****************显示当前输入的数据*******************//if(enter_number==0x01) //显示输入中的数据{if(m!=count) //字符指针在界线内{if(n<=count-1) //显示位未越界{P1=DISPLAY_BIT[n]; //设置显示位P0=buffer_number[m]; //在数码管上显示字符Delay(0x02); //延时消抖n++;m++;}else //显示位越界n=0;}else //字符指针越界m=0;}//****************显示运算后的结果*********************//else //显示运算的结果{if(m!=ptr_i) //字符指针在界线内{if(n<=ptr_i-1) //显示位未越界{P1=DISPLAY_BIT[ptr_i-n-1]; //设置显示位P0=KEY_NUMBER[buffer_dis[m]]; //在数码管上显示字符Delay(0x02); //延时消抖n++;m++;}else //显示位越界n=0;}else //字符指针越界m=0;Clear(1);}//*******************显示运算操作符***********************//P1=0xDF; //打开运算符号显示位P0=buffer_control; //显示当前运算符号Delay(0x02);}}/*******************************************************名称: 主函数功能:应用程序入口参数:无返回值:无*******************************************************/void main(){DeviceInit(); //调用系统初始化函数while(1);}/*******************************************************名称: 定时器中断模块功能:调用键盘监视模块获取键盘输入调用显示模块来显示输入与输出参数:无返回值:无*******************************************************/void timer0_over(void) interrupt 1{TL0=0xBF; //中断间隔为20msTH0=0x63;KeyPress(); //调用键盘扫描程序Display(); //调用显示函数}5. 总结通过该计算器的设计我深入学习数码管扫描和键盘控制,提高对了51系列单片机的实际应用能力。

相关文档
最新文档