科学计算器—单片机课程设计报告
单片机课程设计论文简易计算器
电气信息学院单片机课程设计报告课题名称 4位数加法运算器的设计专业班级学号学生姓名指导教师评分目录自己写,不想写也可以不写,设计目标实现方法自己写。
总结自己写。
写完将红字删除。
2012年1月3日至1 月10 日目录第一章绪论 (1)第二章方案论证与设计 (2)2.1 设计目标和实现方法 (2)2.2 方案论证与设计 (2)第三章主体设计部分 (3)第四章硬件设计 (5)4.1 总体硬件设计 (5)4.2 单片机接口电路说明 (5)4.3 键盘接口电路 (8)4.4 LCD显示模块 (11)4.5 运算模块(单片机控制) (12)4.6 软件设计 (12)4.6.1主函数设计 (12)4.6.2 键盘中断程序设计 (17)4.6.3 LCD显示程序 (19)4.6.4 头文件< calc.h > (21)第五章仿真及调试 (22)总结 (23)参考文献 (24)第一章绪论随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化.电子产品的更新速度快就不足惊奇了, 单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来.近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用.与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题.影响可靠性的因素是多方面的,如构成系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等.其中系统的抗干扰性能是系统可靠性的重要指标.本设计采用80c51 芯片,实现了利用单片机进行了一个简单计算器设计.允许对输入数据进行加减乘除运算及LCD 显示.如果设计对象是更为复杂的计算器系统,其实际原理与方法与本设计基本相同.LCD液晶显示器是Liquid Crystal Display 的简称,LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的.现在LCD已经替代CRT成为主流,价格也已经下降了很多,并已充分的普及.故采用LCD.设计的关键所在,必须非常熟悉单片机的原理与结构,同时还要对整个设计流程有很好的把握,将单片机和其他模块完整的衔接.本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除基本四则运算,并在LCD上显示相应的结果;设计电路采用AT89C51单片机为主要控制电路,显示采用字符LCD静态显示;软件方面使用C语言编程,并用PROTUES仿真i。
(完整)单片机课程设计——计算器设计
目录一、设计总绪 (1)1。
1设计思想 (1)1.2设计说明 (1)1。
3关键词:矩阵键盘,单片机,数码管显示,汇编语言 (1)1.4设计目的 (1)1。
5设计要求 (2)二、设计方案 (2)2。
1硬件电路设计方案 (2)2.1.1基本结构 (2)2.1。
2系统框架图 (3)2.1。
3工作流程图 (3)2。
1.4单片机主控制模块 (4)2。
2系统功能描述 (6)三、各模块功能介绍 (7)3.1键盘输入模块 (7)3。
1。
1键盘分布图 (7)3。
1.2工作原理 (7)3。
2运算控制模块 (8)3.3显示模块 (8)3.4振荡电路模块 (9)四、仿真电路 (11)仿真运行结果 (11)五、调试过程总结 (13)附录: (14)参考文献: (14)源程序代码 (14)一、设计总绪1。
1设计思想近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新.在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算机在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89c51单片机、LCD显示器、控制按键为元件来设计的计算器。
利用此设计熟悉单片机微控制器及汇编语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。
掌握应用程序开发环境,常用的LCD显示器的使用方法和一般键盘的使用方法此设计是基于单片机技术的简易计算器的方案,本次设计所提出的一种基于单片机技术的简易计算器的方案,采用具有数据处理能力的中央处理器CPU,随机存储器ROM,多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统-—单片机,配以汇编语言编写的执行程序,能更好的解决计算机计算的问题,随着数字生活的到来,单片机在生活中越来越重要,它能将大量的逻辑功能集成与一个集成电路中,使用起来十分方便。
单片机计算器课程设计报告程序讲解
单片机课程设计报告一、内容摘要用单片机做一个四则运算的计算器,首先查资料,了解各个电路的功能,事先须熟悉Keil和Proteus两个软件,及它们的联调,程序和仿真完成,就焊接电路板,焊接完,最后就系统联调,直到得出结果。
二、功能要求利用89c51作为主控器组成一个四则运算的计算器。
三、电路原理图电路图说明:(1)键盘的列扫描接单片机P2口的低4位,行扫描接单片机P1口的低4位;(2)数码管的段选通过单片机的P0口接74LS244来驱动,数码管的位选接单片机的P2口;(3)晶振电路为单片机提供时钟频率;(4)复位电路为单片机提供复位信号。
四、计算器功能说明(1)通过数码管来显示键盘的按键,显示被加数(减数……),加数(……),运算结果;(2)本计算器适合不大于八位整数的加、减、乘、除,要求结果也不大于八位整数,否则出错显示,显示(HELLO);(3)在还没按一个数之前就按下=,+,--,*或/,则显示错误;按下+,--,*或/后,立马按下=,显示错误;(4)若接连好了好几运算符键,实际参与运算的是最后一次按的运算键;(5)本计算器有连加,连减,连乘,连除功能,例如:2+5=7+5=12--5=7*5=35/5=7;(6)减法可以实现负数,除法可以显示小数。
五、软件仿真软件设计时,我是分一个一个模块设计的,设计顺序如下:(1)数码管显示函数void displayljy(void)//"显示"子函数{uchar array3[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x38,0x3e,0x6e,0xbe};uchar *p=array,count=0xfe,i,time,time1;F0=1;while(F0){i=*p;P2=count;P0=array3[i];for(time1=0x0c;time1>0x00;time1--)for(time=0xff;time>0x00;time--);p++;count=_crol_(count,1);if(count==0xfe)F0=0;}}(2)判断是否有键按下子函数void iskeyyou(void)//"判断是否有键按下"子函数{P2=0x00;P1|=0x0f;a=P1;a|=0xf0;}(3)键扫子函数void inkeylove(void)//"判断按下的是什么键"子函数{uchar b=0xfe,c=0x00,d;uchar array4[16]={0x07,0x08,0x04,0x05,0x01,0x02,0x0f,0x00,0x09,0x0a,0x06,0x0b,0x03,0x0c,0x0e,0x0d};F1=0;iskeyyou();if(a!=0xff){displayljy();displayljy(); iskeyyou();if(a!=0xff){F0=1;while(F0){P2=b;P1|=0x0f;if(P10==0){a=0x00;F1=1;}else if(P11==0){a=0x02;F1=1;}else if(P12==0){a=0x04;F1=1;}else if(P13==0){a=0x06;F1=1;}else{a=c;a%=4;if(a==0x01){a=0x07;c+=a;}elsec++;b=_crol_(b,1);if(b&0x10==0){F0=0;a=0xff;}}while(F1){a+=c;a=array4[a];d=a;while(a!=0xff){displayljy();iskeyyou();}a=d;F1=0;F0=0;}}}}}(4)两个变形的子函数void bian1(void)//"将uchar型变量转化为ulong型变量"子函数{uchar i;for(i=7;i>0;i--){if(array[i]==0x10)array[i]=0x00;if(array1[i]==0x10)array1[i]=0x00;}num1=(ulong)array1[7]*10000000;num1+=(ulong)array1[6]*1000000;num1+=(ulong)array1[5]*100000;num1+=(ulong)array1[4]*10000;num1+=(ulong)array1[3]*1000;num1+=(ulong)array1[2]*100;num1+=(ulong)array1[1]*10;num1+=(ulong)array1[0];num2=(ulong)array[7]*10000000;num2+=(ulong)array[6]*1000000;num2+=(ulong)array[5]*100000;num2+=(ulong)array[4]*10000;num2+=(ulong)array[3]*1000;num2+=(ulong)array[2]*100;num2+=(ulong)array[1]*10;num2+=(ulong)array[0];}void bian2(void)//声明"将ulong型变量转化为uchar型变量"子函数{uchar i=7,F0=1;if(num1>99999999)error();else{array[7]=(uchar)(num1/10000000);array[6]=(uchar)(num1%10000000/1000000);array[5]=(uchar)(num1%1000000/100000);array[4]=(uchar)(num1%100000/10000);array[3]=(uchar)(num1%10000/1000);array[2]=(uchar)(num1%1000/100);array[1]=(uchar)(num1%100/10);array[0]=(uchar)(num1%10);while(i>0&&F0){if(array[i]==0x00){array[i]=0x10;i--;}elseF0=0;}}}(5)主函数void main(){uchar r7=0x00,i;while(1){displayljy();inkeylove();if(a!=0xff)//如果有键输入,继续往下执行,否则从新开始{if(a==0x0f) //如果输入的是"清除"键,将显示器清屏,同时清存放运算符号的单元{r7=0x00;for(i=0;i<8;i++){array[i]=0x10;array1[i]=0x10;}}else if(a==0x0e)//如果输入的是"=",继续往下执行,否则从新开始{if(array1[0]==0x10)//如果未按下第二个数之前就按下“=”,则出错显示error();else if(r7==0x0d)//如果r7中存放的是"+",则执行加运算{bian1();jia();bian2();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}else if(r7==0x0c)//如果r7中存放的是"-",则执行减运算{bian1();jian();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}else if(r7==0x0b)//如果r7中存放的是"*",则执行乘运算{bian1();cheng();bian2();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}else if(r7==0x0a)//如果r7中存放的是"÷",则执行除运算{bian1();chu();r7=0x00;for(i=0;i<8;i++)array1[i]=0x10;}elseerror();//如果r7没有存进运算符,则转出错处理}else{if(r7!=0x00)//如果已按过运算键,往下执行,否则转else{if(a>0x09&&a<0x0e)//如果还按下运算键,则后按的取代前面按的r7=a;else if(array1[0]==0x10)//判断是不是输入加数(减数...)的第一个数{for(i=0;i<8;i++)//是的话,将被加数(被减数...)存入array1中array1[i]=array[i];for(i=0;i<8;i++)array[i]=0x10;for(i=7;i>0;i--)//array中存入加数(减数...)array[i]=array[i-1];array[0]=a;}else //不是输入加数(减数...)的第一个数{if(array[7]!=0x10)//如果加数(减数...)已是八位整数,则转出错处理error();else{for(i=7;i>0;i--)//否则将加数左移array[i]=array[i-1];array[0]=a;}}}else//之前还没有运算键按下{if(a>0x09)//有运算键按下{if(array[0]==0x10)//但是在运算键按下之前没有输入被加数,则转出错error();elser7=a;//否则将运算键输入r7中保存}else if(array[7]!=0x10)//如果被加数已是八位整数,则转出错error();else //否则将被加数左移{for(i=7;i>0;i--)array[i]=array[i-1];array[0]=a;}}}}}}(6)加、减、乘、除、出错显示子函数void jia(void)//"加运算"子函数{num1+=num2;}void jian(void)//"减运算"子函数{uchar i;if(num1>num2){num1-=num2;bian2();}else if(num1==num2){for(i=1;i<8;i++)array[i]=0x10;array[0]=0x00;}else{num1=num2-num1;bian2();if(array[7]!=0x10)error();elsearray[7]=0x11;}}void cheng(void)////声明"乘运算"子函数{num1*=num2;}void chu(void)//"除运算"子函数{uchar i,j=0x00,k;double num3;num3=(double)(num1)/(double)(num2);num1=(ulong)(num3);num3-=num1;if(num3==0||num1>9999999)bian2();else{bian2();while(array[7]==0x10){j++;for(i=7;i>0;i--)array[i]=array[i-1];array[0]=0x10;}array[j]+=0x12;k=j-1;while(k>0){num3*=10;num2=(ulong)(num3);num3-=num2;array[k]=(uchar)(num2);k--;}num3*=10;num2=(ulong)(num3);array[0]=(uchar)(num2);while(array[0]==0x00){for(i=0;i<7;i++)array[i]=array[i+1];array[7]=0x10;}}}void error(void)//"出错显示"子函数(出错显示"HELLO") {array[7]=0x10;array[6]=0x10;array[5]=0x10;array[4]=0x1d;array[3]=0x0e;array[2]=0x1c;array[1]=0x1c;array[0]=0x12;}(7)全局变量定义,函数声明等#include <reg52.h>#include <intrins.h>//循环左右移要用该头文件(-cror-(),-crol-())#define uchar unsigned char#define ulong unsigned longuchar array[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};uchar array1[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};uchar a;ulong num1=0,num2=0;sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit F1=PSW^1;//定义一个标志位,F0在头文件里已定义void displayljy(void);//声明"显示"子函数void inkeylove(void);//声明"判断按下的是什么键"子函数void iskeyyou(void);//声明"判断是否有键按下"子函数void bian1(void);//声明"将uchar型变量转化为ulong型变量"子函数void bian2(void);//声明"将ulong型变量转化为uchar型变量"子函数void jia(void);//声明"加运算"子函数void jian(void);//声明"减运算"子函数void cheng(void);//声明"乘运算"子函数void chu(void);//声明"除运算"子函数void error(void);//声明"出错显示"子函数六、系统联调在焊接完板子后,我首先并没有把整个计算器的程序下进去,只是下了个显示的小程序,结果数码管的第四位没显示,首先我想段选肯定不会有错的,检查了程序对应的那个数和程序中位选的设置都没错,我想应该是接线中的位选错了,结果我用万用表检查电路发现也没错,这下我就纠结了,搞不清状况了,可是无意之中我按了板子,发下那个数码管显示了正确的数,但是只是一瞬间的事,我想肯定是我有个地方没焊稳,我就一个地方一个地方的按,最终定位在了单片机,单片机的底座我用的是单排母不是专门配的底座,因为用排母取下放上都比那个专门配的底座容易,我就重新认真的把底座补焊了下,结果就行了,接下来我就把计算器的程序下进去了,成功了,太开心了。
科学计算器设计报告(51单片机)
单片机课程设计报告(多功能计算器)班级:姓名:学号:指导老师:一、内容摘要利用89c51作为主控器设计一个四则运算的计算器。
首先通过在图书馆和网上查找有关设计计算器的资料,大概了解设计计算器需要哪几个模块,熟悉Keil 和Proteus 两个软件的用法,以及它们的联调,完成计算器的程序设计和仿真,然后就是进实验室进行计算器电路板的焊接,最后就是将程序下载到单片机芯片中,系统联调,直到得出结果。
二、设计内容及要求用单片机设计计算器,要求可以进行加、减、乘、除运算。
三、系统方案设计,画出系统框图四、画出完整的电路图,并说明电路的工作原理51系列单片机4*4键盘8位LED 显示6264 RAM 扩展复位电路晶振电路等系统原理框图电路图说明:(1)键盘的列扫描接单片机P2口的低4位,行扫描接单片机P1口的低4位;(2)数码管的段选通过单片机的P0口接74LS244来驱动,数码管的位选接单片机的P2口;(3)发光二极管电路用来说明电路是否上电;(4)晶振电路为单片机提供时钟频率;(5)复位电路为单片机提供复位信号。
计算器的功能实现:(1)此计算器适应于不大于八位整数的四则混合运算,若单个数大于八位或者结果大于八位(溢出)则显示“Chu cuo”。
(2)如果在还没有按数字之前按了一个符号键或者等号则显示“Chu cuo”。
(3)若接连按了几个运算符键,实际上进行的运算是最后一次按的运算键。
(4)可以显示负数、小数。
(5)此计算器不可实现连乘、连加、连减、连除。
四、软件仿真,根据系统硬件图编写系统程序并调试#include <reg52.h>#include <intrins.h>//循环左右移要用该头文件(-cror-(),-crol-())#define uchar unsigned char#define ulong unsigned longuchar array[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};uchar array1[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};uchar a;ulong num1=0,num2=0;sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit F1=PSW^1;//定义一个标志位,F0在头文件里已定义void displayljy(void);//声明"显示"子函数void inkeylove(void);//声明"判断按下的是什么键"子函数void iskeyyou(void);//声明"判断是否有键按下"子函数void bian1(void);//声明"将uchar型变量转化为ulong型变量"子函数void bian2(void);//声明"将ulong型变量转化为uchar型变量"子函数void jia(void);//声明"加运算"子函数void jian(void);//声明"减运算"子函数void cheng(void);//声明"乘运算"子函数void chu(void);//声明"除运算"子函数void error(void);//声明"出错显示"子函数void main(){uchar r7=0x00,i;while(1){displayljy();inkeylove();if(a!=0xff)//如果有键输入,继续往下执行,否则从新开始{if(a==0x0f) //如果输入的是"清除"键,将显示器清屏,同时清存放运算符号的单元 {r7=0x00;for(i=0;i<8;i++){array[i]=0x10;array1[i]=0x10;}}else if(a==0x0e)//如果输入的是"=",继续往下执行,否则从新开始{if(r7==0x0d)//如果r7中存放的是"+",则执行加运算{bian1();jia();bian2();}else if(r7==0x0c)//如果r7中存放的是"-",则执行减运算{bian1();jian();}else if(r7==0x0b)//如果r7中存放的是"*",则执行乘运算{bian1();cheng();bian2();}else if(r7==0x0a)//如果r7中存放的是"÷",则执行除运算{bian1();chu();}elseerror();//如果r7没有存进运算符,则转出错处理}else{if(r7!=0x00)//如果已按过运算键,往下执行,否则转else{if(a>0x09&&a<0x0e)//如果还按下运算键,则后按的取代前面按的r7=a;else if(array1[0]==0x10)//判断是不是输入加数(减数...)的第一个数 {for(i=0;i<8;i++)//是的话,将被加数(被减数...)存入array1中 array1[i]=array[i];for(i=0;i<8;i++)array[i]=0x10;for(i=7;i>0;i--)//array中存入加数(减数...)array[i]=array[i-1];array[0]=a;}else //不是输入加数(减数...)的第一个数{if(array[7]!=0x10)//如果加数(减数...)已是八位整数,则转出错处理 error();else{for(i=7;i>0;i--)//否则将加数左移array[i]=array[i-1];array[0]=a;}}}else//之前还没有运算键按下{if(a>0x09)//有运算键按下{if(array[0]==0x10)//但是在运算键按下之前没有输入被加数,则转出错error();elser7=a;//否则将运算键输入r7中保存}else if(array[7]!=0x10)//如果被加数已是八位整数,则转出错error();else //否则将被加数左移{for(i=7;i>0;i--)array[i]=array[i-1];array[0]=a;}}}}}}void bian1(void)//"将uchar型变量转化为ulong型变量"子函数{uchar i;for(i=7;i>0;i--){if(array[i]==0x10)array[i]=0x00;if(array1[i]==0x10)array1[i]=0x00;}num1=(ulong)array1[7]*10000000;num1+=(ulong)array1[6]*1000000;num1+=(ulong)array1[5]*100000;num1+=(ulong)array1[4]*10000;num1+=(ulong)array1[3]*1000;num1+=(ulong)array1[2]*100;num1+=(ulong)array1[1]*10;num1+=(ulong)array1[0];num2=(ulong)array[7]*10000000;num2+=(ulong)array[6]*1000000;num2+=(ulong)array[5]*100000;num2+=(ulong)array[4]*10000;num2+=(ulong)array[3]*1000;num2+=(ulong)array[2]*100;num2+=(ulong)array[1]*10;num2+=(ulong)array[0];}void bian2(void)//声明"将ulong型变量转化为uchar型变量"子函数{uchar i=7,F0=1;if(num1>99999999)error();else{array[7]=(uchar)(num1/10000000);array[6]=(uchar)(num1%10000000/1000000);array[5]=(uchar)(num1%1000000/100000);array[4]=(uchar)(num1%100000/10000);array[3]=(uchar)(num1%10000/1000);array[2]=(uchar)(num1%1000/100);array[1]=(uchar)(num1%100/10);array[0]=(uchar)(num1%10); while(i>0&&F0){if(array[i]==0x00){array[i]=0x10;i--;}elseF0=0;}}}void jia(void)//"加运算"子函数{num1+=num2;}void jian(void)//"减运算"子函数{uchar i;if(num1>num2){num1-=num2;bian2();}else if(num1==num2){for(i=1;i<8;i++)array[i]=0x10;array[0]=0x00;}else{num1=num2-num1;bian2();if(array[7]!=0x10)error();elsearray[7]=0x11;}}void cheng(void)////声明"乘运算"子函数{num1*=num2;}void chu(void)//"除运算"子函数{uchar i,j=0x00,k;double num3;num3=(double)(num1)/(double)(num2); num1=(ulong)(num3);num3-=num1;if(num3==0||num1>9999999)bian2();else{bian2();while(array[7]==0x10){j++;for(i=7;i>0;i--)array[i]=array[i-1];array[0]=0x10;}array[j]+=0x12;k=j-1;while(k>0){num3*=10;num2=(ulong)(num3);num3-=num2;array[k]=(uchar)(num2);k--;}array[0]=(uchar)(num3*10);while(array[0]==0x00){for(i=0;i<7;i++)array[i]=array[i+1];array[7]=0x10;}}}void error(void)//"出错显示"子函数(出错显示"Chu cuo.") {array[7]=0x0c;array[6]=0x1d;array[5]=0x1f;array[4]=0x10;array[3]=0x10;array[2]=0x1c;array[1]=0x1f;array[0]=0x1e;}void displayljy(void)//"显示"子函数{uchar array3[32]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00,0x40,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x58,0x74,0xdc,0x1c};uchar *p=array,count=0x80,i,time;F0=1;while(F0){i=*(p+7);P2=count;P0=array3[i];for(time=0xff;time>0x00;time--);p--;count=_cror_(count,1);if(count==0x80)F0=0;}}void iskeyyou(void)//"判断是否有键按下"子函数{P2=0x00;P1|=0x0f;a=P1;a|=0xf0;}void inkeylove(void)//"判断按下的是什么键"子函数{uchar b=0xfe,c=0x00,d;uchar array4[16]={0x07,0x08,0x04,0x05,0x01,0x02,0x0f,0x00, 0x09,0x0a,0x06,0x0b,0x03,0x0c,0x0e,0x0d}; F1=0;iskeyyou();if(a!=0xff){displayljy();displayljy();iskeyyou();if(a!=0xff){F0=1;while(F0){P2=b;P1|=0x0f;if(P10==0){a=0x00;F1=1;}else if(P11==0){a=0x02;F1=1;}else if(P12==0){a=0x04;F1=1;}else if(P13==0){a=0x06;F1=1;}else{a=c;a%=4;if(a==0x01){a=0x07;c+=a;}elsec++;b=_crol_(b,1);if(b&0x10==0){F0=0;a=0xff;}}while(F1){a+=c;a=array4[a];d=a;while(a!=0xff){displayljy();iskeyyou();}a=d;F1=0;F0=0;}}}}}五、系统联调在我将计算器的电路板焊接好以后,我将程序下载到单片机芯片上面,再接上电源测试发现键盘上面只有几个按键有显示,开始我就怀疑是自己的焊接键盘的线时,出现了虚焊或者是焊错了的错误,我就写了一个程序让数码管上面显示“4321”这四个数字,下载进去后,发现没有错误,这就证明我的数码管那一块没有出现错误,由此推论,最有可能出现错误的就是键盘,由于自己当时并不清楚键盘的行列线,所以没有自己测量了,我去问老师,老师就说“实验室的键盘可能也有点问题”,于是他就给我们拿了几个他自己借来的键盘,然后手把手的教我们怎么测试行列线,我也很快就测出了其对应的行列线,但是一接上电源测试,还是有一行不能显示,最后在老师的提点下,是发现P1.0口始终接了高电平,从而导致无法显示,在老师的帮助下,最终我做出了结果。
单片机简易计算器课程设计报告
1、源程序代码(根据需要选择)……………………………………………
2、整体电路原理图(根据需要选择)………………………………………
2、元件表(根据需要选择)…………………………………………………
3、PCB板制作(根据需要选择)……………………………………………
4、焊接与调试(根据需要选择)…………………………………………………
采用按键复位电路,电阻分别选取560Ω和10K,电容选取10μF。
键盘接口电路
计算器所需按键有:
数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’
功能键:’+’,’-‘,’*’,’/’,’=’,’C(清零)’
共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。
4.除法:整数除法
5.有清除功能
三、课程设计简述及整体方框图
1.总体设计思路简述
按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、键扫描接口电路共三个模块组成,电路系统构成框图如图1.1所示。主控芯片使用STC12C54单片机,比80C51速度更快,功能更强,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
设计时间:2010年12月28日星期二
设计地点:中南林业科技大学电子信息楼
指导教师评语:成绩:
签名:
年月日
一、题目……………………………………………………………………………
单片机课程设计计算器
单片机课程设计 计算器一、课程目标知识目标:1. 学生能理解单片机的基本原理和功能,掌握计算器的设计流程。
2. 学生能运用所学知识,设计并实现一个具有基本运算功能的单片机计算器。
3. 学生了解并掌握单片机编程的基本语法和逻辑结构。
技能目标:1. 学生掌握使用单片机开发工具进行程序编写、调试和下载的方法。
2. 学生具备分析问题、设计算法和解决问题的能力,能运用单片机技术解决实际计算问题。
3. 学生能够通过小组合作,进行项目设计和实践,提高团队协作能力。
情感态度价值观目标:1. 学生培养对单片机技术及电子工程的兴趣,激发创新意识和探索精神。
2. 学生通过动手实践,体验成功解决问题的喜悦,增强自信心和自主学习能力。
3. 学生在学习过程中,树立正确的价值观,认识到科技发展对社会进步的重要性。
课程性质:本课程为实践性较强的课程,要求学生在理论学习的基础上,动手实践,完成单片机计算器的设计与制作。
学生特点:学生处于高年级阶段,已具备一定的电子技术基础和编程能力,具备独立思考和解决问题的能力。
教学要求:结合学生特点,注重理论与实践相结合,引导学生通过小组合作,完成课程任务,达到课程目标。
同时,关注学生的个性差异,提供个性化的辅导和支持。
在教学过程中,注重培养学生的创新能力、实践能力和团队协作能力,为后续学习打下坚实基础。
二、教学内容根据课程目标,教学内容分为以下三个部分:1. 理论知识学习:- 单片机原理与结构:讲解单片机的组成、工作原理及性能特点,对应教材第1章。
- 编程语言基础:介绍单片机编程的基本语法、逻辑结构和编程规范,对应教材第2章。
2. 实践技能培养:- 硬件设计与连接:学习如何选用合适的元器件,设计计算器硬件电路,对应教材第3章。
- 软件编程与调试:掌握单片机程序编写、调试和下载的方法,对应教材第4章。
3. 项目实践:- 计算器设计与实现:结合所学知识,分组进行计算器项目设计,包括硬件选型、电路设计、程序编写和调试等,对应教材第5章。
单片机简易计算器课程设计报告
课程设计报告设计名称:简易计算器姓名:学号:专业班级:院(系):设计时间:2016.12.10设计地点:摘要:虽然现在科学计算器,已经得到了广泛的应用,但在某些地方,简易计算器,依然是主要的计算公具,如小学教学单位,市场,商店等。
并且随着科技的进步,我们已经告别了以前复杂的模拟电路,可以利用已有的软件和硬件条件,设计出更出色的计算器呢。
本设计是以AT89C52单片机为核心的计算器模拟系统设计,输入采用4×4矩阵键盘,可以进行加、减、乘、除4位带符号数字运算,并在LCD1602上显示操作过程。
关键词: AT89C52 LCD1602 计算器矩阵键盘一方案构思本设计可以采用两种方案,一种是以FPGA为核心处理芯片,配备相应的外设;另外一种是以AT89C52处理器,配备相应的外设。
1.1、方案一:采用FPGA控制FPGA是一种高密度的可编程逻辑器件,自从Xilinx公司1985年推出第一片FPGA以来,FPGA的集成密度和性能提高很快,其集成密度最高达500万门/片以上,系统性能可达200MHz。
由于FPGA器件集成度高,方便易用,开发和上市周期短,在数字设计和电子生产中得到迅速普及和应用,并一度在高密度的可编程逻辑器件领域中独占鳌头。
但是而基于 SRAM编程的FPGA,其编程信息需存放在外部存储器上 ,需外部存储器芯片 ,且使用方法复杂 ,保密性差,而其对于一个简单的计算器而言,实用FPGA有点大材小用,成本太高。
1.2、方案二:采用AT89C52单片机是单片微型机的简称,故又称为微控制器MCU(Micro Control Unit)。
通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:中央处理器CPU,存储器和I/O接口电路等。
因此,单片机只要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机广泛用于智能产品,智能仪表,测控技术,智能接口等,具有操作简单,实用方便,价格便宜等优点,而其中AT89C52以MCS-51为内核,是单片机中最典型的代表,应用于各种控制领域。
单片机课程设计报告简易计算器
{a=a*10+a2[i];
}
if(a2[i]!=14&&a2[i]>9)
//
{m=1; w=a2[i];
四则运算的判断
}
if(a2[i]<10&&m==1) //
第二个数
{b=b*10+a2[i];
}
if(a2[i]==13||o==1)
//
清零
{o=0;
lcd_w_cmd(0x01);
lcd_w_cmd(0x80);
4 软件调试........................................................8 个人小结...........................................................8 参考文 献........................................................... 9 附 录............................................................... 9
lcd_w_dat(a1[ge]);}
if(wan==0&&qian!=0)
//
千位显示
{lcd_w_dat(a1[qian]);
lcd_w_dat(a1[bai]);
lcd_w_dat(a1[shi]);
lcd_w_dat(a1[ge]);}
if(wan==0&&qian==0&&bai!=0) //
delay1();
E=1;
delay1();
P1=dat;
单片机计算器课程毕业设计
单片机课程设计一、课程设计的目的通过本课程设计使学生进一步巩固单片机原理与技术的基本概念、基本理论,分析问题的基本方法;增强学生的软件编程实现能力和解决实际问题的能力,使学生能有效地将理论和实际紧密结合,拓展学生在工程实践方面的专业知识和相关技能。
二、总体设计根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。
(3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD上出现错误显示“”。
系统模块图:三、硬件设计(一)、总体硬件设计本设计选用AT89C51单片机为主控单元。
显示部分:采用LCD 静态显示。
总体设计效果如下图:(二)、键盘接口电路计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。
单片机计算器课程设计报告
单片机课程设计课题名称:单片机简易计算器课程设计姓名:XXXX 学号:XXXXXX 年级专业班级:XXXXXXX学院:XXXX设计时间:XXXXXXX设计地点:XXXXXX指导老师:**目录一、单片机课程设计实习目的 (2)1、增进对单片机的感性认识,加深对单片机理论方面的理解; (2)2、掌握单片机的内部功能模块的应用,如定时器/计数器、中断、存贮器、I/O口等; (2)3、了解和掌握单片机应用系统的软硬件设计过程及实现方法。
(2)二、实习课题任务 (2)1、课题:简易计算器的设计 (2)2、设计基本要求: (2)利用单片机试验箱的键盘模块以及显示模块实现百位以内加减乘除。
(2)任选一种显示方式:即中文液晶显示屏、LED数码管可任选一种。
(2)3、功能实现: (2)4、设计任务 (2)5、设计思路 (2)三、系统分析 (4)四、硬件系统设计 (5)1、键盘接口电路 (5)2、数码管显示电路 (6)五、软件系统设计 (6)六、调试结果 (7)1)10以内计算器 (7)2)100以内计算器 (7)七、结论 (8)八、体会与收获 (8)九、附件(程序): (9)1、程序一:只能进行两位数与两位数格式的四则运算 (9)2、程序二:能进行百位以内的四则运算,但一位与两位数运算结果调试不对 (18)一、单片机课程设计实习目的1、增进对单片机的感性认识,加深对单片机理论方面的理解;2、掌握单片机的内部功能模块的应用,如定时器/计数器、中断、存贮器、I/O 口等;3、了解和掌握单片机应用系统的软硬件设计过程及实现方法。
二、实习课题任务1、课题:简易计算器的设计2、设计基本要求:利用单片机试验箱的键盘模块以及显示模块实现百位以内加减乘除。
任选一种显示方式:即中文液晶显示屏、LED数码管可任选一种。
3、功能实现:计算器将完成的功能有两位数以内加、减、乘、除功能,并通过LED数码管显示输入值及结果。
4、设计任务1.扩展4*4键盘,其中10个数字,5个功能键,1个清零2.使用五位数码管接口电路3.完成十进制的四则运算(加、减、乘、除);4.实现低于三位小于255数字的连续运算;5.使用keil C软件编写程序;6.最后用ptoteus仿真;7.具有较强的抗干扰能力;8.体积小、功耗低,便于嵌入其他系统。
基于单片机的计算器课程设计报告
昆明理工大学课程设计报告设计名称:单片机计算器课程设计姓名:学号:2011118521XXX专业班级:测控技术和仪器1111院(系):信息工程设计时间:2013年6月21日设计地点:昆明理工大学德信楼目录一、题目……………………………………………………………………………二、任务和要求…………………………………………………三、课程设计及整体方框图…………………………………………………a..总体设计思路简述····················································b.硬件设计简述························································c.软件设计简述························································d.程序主流程图························································四、课程设计原理分析及相关知识概述…………………………………………五、结论……………………………………………………………………………六、体会和收获……………………………………………………………………附件:1、源程序代码(根据需要选择)……………………………………………2、整体电路原理图(根据需要选择)………………………………………2、元件表(根据需要选择)…………………………………………………3、实验操作(根据需要选择)…………………………………………………一、题目使用单片机芯片AT89C51、LCD 1602 液晶显示屏,用KEIL uVision和porteus 仿真软件实现简易计算器的仿真和调试。
单片机课程设计——计算器
单片机综合课程设计——计算器一、实验目的1、学习使用单片机内部的I/O功能。
2、熟悉I/O与键盘矩阵和数码管的连接。
3、熟练掌握单片机I/O的编程。
二、实验分工三、功能实现1、采用键盘按键输入,数码管显示的模式。
2、实现计算器两位数以内的基本“+,-,*,/”运算功能。
3、扩展实现了计算器的乘方、阶乘、开平方根功能。
4、实现了计算器的退格功能,可以在运算过程中更改操作数,不影响运算继续进行。
5、数码管操作数显示两位以内,结果显示在四位数以内。
6、键盘各功能键分布如下:1 2 3 + or x a4 5 6 - or n!7 8 9 * orbackspace reset = /由于时间紧张,未来得及实现功能键的复用,只能将扩展功能与基本功能分开,用两个程序实现。
7、具体操作:开始运行程序后,数码管无显示,等待键盘输入。
通过定时中断,定时扫描按键。
有按键按下时,判断为1~9数字键,则显示在数码管上。
按下运算功能键屏幕清零,等待下一个操作数输入。
按下“=”号后,得出计算结果,结果显示于数码管上。
在操作数输入过程中,按下backspace,则数码管显示去掉最后一位数字,继续输入,不影响运算的进行。
按下“reset”,则回到初始状态,数码管显示和运算结果被清除,等待输入新的表达式。
四、实验原理1、通过MSP430 端口控制TM1638 芯片实现读取键盘状态(输入)和控制LED 数码管显示(输出)的功能。
2、键盘:键盘中A-F 分别对应KS1-KS6。
一旦有按键按下,TM1638 中相关的寄存器的值就会改变。
*注意:键盘用坐标形式表示,空白位表示本开发板暂未用到TM1638 最多可以读4个字节,不允许多读。
读数据字节只能按顺序从BYTE1-BYTE4 读取,不可跨字节读。
组合键只能是同一个KS,不同的K 引脚才能做组合键;同一个K 与不同的KS 引脚不可以做成组合键使用。
3、数码管:上图给出一个共阴数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1 为低电平的时候让SEG1,SEG2,SEG3,SEG4,SEG5,SEG6 为高电平,SEG7 为低电平,即在00H 地址单元里面写数据3FH 就可以让数码管显示“0”。
科学计算器—单片机课程设计报告
湘潭大学单片机课程设计报告——计算器设计班级:2008级通信工程二班学号:**********姓名:陶庆权日期:2011.3.25目录一、设计任务和性能指标 (1)1.1设计任务 (1)1.2性能指标 (1)二.设计方案 (2)三.系统硬件设计 (2)3.1单片机最小系统 (2)3.2键盘接口电路 (3)3.3数码管显示电路 (3)3.4按键提示电路 (3)四、系统软件设计 (4)4.1键盘扫描子程序设计 (4)4.2运算程序设计 (5)4.3显示子程序设计 (5)4.4主程序设计 (5)五、调试及性能分析 (6)5.1调试步骤 (6)5.2性能分析 (7)六、心得体会 (7)参考文献 (7)附录1 系统硬件电路图 (8)附录2程序清单................................................8-18一、设计任务和性能指标设计任务基本功能:利用89c51作为主控器组成一个四则运算的计算器。
发挥部分:增加一种以上的科学计算功能。
可选器件:51系列单片机、6264、7段LED数码管、74LS244或74LS240、与非门等二.设计方案按照系统设计的功能的要求,确定设计系统由主控模块、显示模块、按键提示模块、键扫描接口电路、扩张功能模块共五个模块组成,电路系统构成框图如图1.1所示。
主控芯片使用51系列STC89C54单片机。
键盘电路采用4*4矩阵键盘电路。
显示模块采用4位共阴极数码管。
按键提示电路采用5V扬声器。
三.系统硬件设计3.1单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取STC89C54RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便,可直接用USB线下载代码。
晶振选取11.0592MHz,晶振旁电容选取20pF。
采用按键复位电路,电阻分别选取100Ω和10K,电容选取0.1μF。
以下为单片机最小系统硬件电路图。
单片机计算器的课程设计报告
目录按键监视电路 (5)一、设计任务和性能指标设计任务自制一个单片机最小系统,包括复位电路,采用外部小键盘输入数据,能够实现加法、乘法及一个科学计算,计算结果显示在四位一体的数码管上。
要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要求的功能),印刷电路板(要求布局合理,线路清晰),绘出程序流程图,并给出程序清单(要求思路清晰,尽量简洁,主程序和子程序分开,使程序有较强的可读性)。
性能指标1.加法:四位加法,计算结果若超过四位则显示计算错误;2.减法:四位减法,计算结果若小于零则显示计算错误;3.乘法:个位数乘法;4.除法:整数除法;5.取对数;6.开平方;7.指数运算;8.有清零功能二.设计方案按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图所示。
主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
监测模块采用二极管和扬声器(实验室用二极管代替)组成电路。
键盘电路采用4*4矩阵键盘电路。
显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。
整个单片机的接口电路:P0用于显示输出;P1用于键扫描输入;P2用于数码管位选控制;P3用于键盘扩展(部分运算符输入);三.系统硬件设计单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。
晶振选取,晶振旁电容选取20pF。
采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。
以下为单片机最小系统硬件电路图。
单片机最小系统硬件电路键盘接口电路计算器所需按键有:数字键:’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’功能键:’+’, ’-‘ , ’*’, ’/ ’ , ’ = ’, ’ C( 清零)’扩展键:“log”,“ln”,“x^2”“小数点”,“开方”共计25个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接~,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。
单片机课程设计报告(简易计算机)
专业综合课程设计任务书班级:学号:姓名:成绩:电子与信息工程学院计算机科学系图1.2 图1.3图1.42.3键盘电路这部分有16个button构成4*4矩阵,通过p1口进行行扫描方式实现按键的读取。
硬件电路图如图1.4。
2.4总体硬件图如图1.5图1.53 软件详细设计3.1键盘扫描子程序要进行数据的计算就必须进行数据的输入,也就是确定按键输入的数值是什么,这就需要对键盘进行行扫描,从而确定究竟是那个键按下。
对于键盘的扫描,既可以使用行扫描也可以使用列扫描,这里采用行扫描的方法完成对键盘的扫描行扫描就是逐行扫描键盘,看那一行有键按下,再通过返回的见马来确定究竟是哪个按键按下。
对第一行扫描就置p1.0为底电平,其余p1口为高电平,如果有按键按下,则p1口的值就会变为别的值,再由新值来确定是那个键按下。
程序流程图如图1.6图1.6dd:mov r0,#0f7h mov r1,#0cc:mov a,r0 mov p1,amov a,p1 mov r2,asetb c mov r3,#4bb:rlc a jnc aaee:inc r1 djnz r3,bbmov a,r0 setb crrc a mov r0,ajc cc ljmp ddKAOO:LJMP KAO BBB2:LJMP BB2aa:lcall mm mov a,p1xrl a,r2 nz eeff:mov a,p1 xrl a,r2jz ff MOV A,51HCJNE A,#1,BBB2RET3.4主程序及其他部分程序下图为主程序流程图:主要有:初始化子程序,清屏子程序,固定字符显示,单元定义,端口定义,字模部分。
主程序:RG 0LJMP STARTSTART:MOV SP,#60HLCALL INT ;调用初始化子程序START1:LCALL CLEAR ;调用清屏子程序初始化子程序:INT: MOV COM,#0C0H ;设置显示起始行为第一行LCALL PRM0LCALL PRR0MOV COM,#3FH ;开显示设置LCALL PRM0LCALL PRR0RET清屏子程序:CLEAR:MOV R4,#00H。
51单片机计算器课程设计
51单片机计算器课程设计1. 前言51单片机凭借其简单易用、功能强大、可靠性高等诸多特点,成为了广大电子爱好者及相关从业人员的首选芯片类型。
在本次课程设计中,我们将利用51单片机的优势,设计一个简单的计算器。
通过该计算器的实现,旨在提高学生对51单片机的掌握程度,并且让他们能够更加深入地理解单片机的中断、定时器、按键等重要功能模块的理解。
2. 计算器设计需求分析在现实生活中,计算器的实现方案有很多,例如典型的哈工大计算器,其实现原理基于双栈式逆波兰表达式求值等。
而在51单片机的实现方案中,为了简化设计难度,我们采用了两次按键计算器。
即用户需要通过按数字键,来输入计算器要计算的操作数,在输入完所有的操作数后,再按下其他的计算符键,计算器通过读取已经输入的操作数,并根据按下的计算符键,来执行计算器指定的计算操作。
3. 设计思路在上面的需求分析中,我们设计了一个基于两次按键进行计算的计算器。
如果直接采用传统数字键和计算符键按下即时执行的计算器交互方式,由于涉及到用户输入顺序的问题,将会使程序开发难度大大增加。
因此,我们可以利用中断机制,在用户按下数字键和计算符键时,分别将其存储到数组中。
等到用户完成所有操作数的输入后,再由程序根据存储在数组中的操作数,按照计算符键的指令,进行计算操作。
4. 硬件设计计算器硬件设计采用与按键通用的IO口输入输出方式。
在本例中,我们设置计算器的数字键和计算符键均为IO口输入。
鉴于本次设计旨在简化流程,我们将设计与单片机外接数码管连接的部分留给读者自行研究。
在本次课程设计中,我们将不涉及数字键和计算符键信号的去抖动处理。
5. 软件设计通过对计算器设计的需求分析、设计思路以及硬件设计的分析后,我们来设计计算器的软件部分。
5.1 端口初始化根据本次课程设计的需求,我们采用两个IO口输入来实现计算器的数字键和计算符键,因此需要对IO口进行初始化。
```void PortInit(){P1=0xff;/数字键P1.0—P1.7设定为输出P1=0xff;/计算符键P2.0—P2.7设定为输出}```5.2 按键检测监测按键是否按下需要使用到中断机制,在本次课程设计中采用P1口的0~7位和P3口的0~3位硬件中断。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湘潭大学单片机课程设计报告——计算器设计班级:2008级通信工程二班学号:**********姓名:陶庆权日期:2011.3.25目录一、设计任务和性能指标 (1)1.1设计任务 (1)1.2性能指标 (1)二.设计方案 (2)三.系统硬件设计 (2)3.1单片机最小系统 (2)3.2键盘接口电路 (3)3.3数码管显示电路 (3)3.4按键提示电路 (3)四、系统软件设计 (4)4.1键盘扫描子程序设计 (4)4.2运算程序设计 (5)4.3显示子程序设计 (5)4.4主程序设计 (5)五、调试及性能分析 (6)5.1调试步骤 (6)5.2性能分析 (7)六、心得体会 (7)参考文献 (7)附录1 系统硬件电路图 (8)附录2程序清单................................................8-18一、设计任务和性能指标设计任务基本功能:利用89c51作为主控器组成一个四则运算的计算器。
发挥部分:增加一种以上的科学计算功能。
可选器件:51系列单片机、6264、7段LED数码管、74LS244或74LS240、与非门等二.设计方案按照系统设计的功能的要求,确定设计系统由主控模块、显示模块、按键提示模块、键扫描接口电路、扩张功能模块共五个模块组成,电路系统构成框图如图1.1所示。
主控芯片使用51系列STC89C54单片机。
键盘电路采用4*4矩阵键盘电路。
显示模块采用4位共阴极数码管。
按键提示电路采用5V扬声器。
三.系统硬件设计3.1单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。
主控芯片选取STC89C54RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便,可直接用USB线下载代码。
晶振选取11.0592MHz,晶振旁电容选取20pF。
采用按键复位电路,电阻分别选取100Ω和10K,电容选取0.1μF。
以下为单片机最小系统硬件电路图。
单片机最小系统硬件电路3.2键盘接口电路:计算器所需按键有:数字键:0、1、2、3、4、5、6、7、8、9.功能键:。
+、-、*、/ 、 = 、C( 清零)。
共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,我们就可以得到是哪个键按下,从而完成键盘的功能。
以下为键盘接口电路的硬件电路图:键盘接口电路3.3数码管显示电路本课程设计采用八位数码管显示,为了节约I/O口资源,从而采用动态扫描的方式,P0口段选,P2位选,由于是P0口段选所以要接上拉电阻,显示电路部分如下:数码显示电路硬件电路图3.4按键提示电路按键提示电路就是在有按键的时候提示有键按下,发出声音提示,提示使用者按键有效。
这里就采用5V扬声器作为提示设备,由P3.7对其进行控制。
系统整体硬件电路图见附录一四、系统软件设计4.1键盘扫描子程序设计采用先令高四位为低电平,高四位为高电平,然后看扫描键盘,看哪一列按下,再使高四位为高,低四位为低。
再扫描行,进而确定是哪个键按下。
键盘部分的子程序如下:uchar Keyscan(void){uchar i,j,temp,Buffer[4] ={0xef, 0xdf, 0xbf, 0x7f};for(j=0; j<4;j++){P1 = Buffer[j];/*以下三个_nop_();作用为让 P1口的状态稳定*/delay();temp = 0x01;for(i=0; i<4;i++){if(!(P1 &temp)){return (i+j*4);}temp <<= 1;}}}结合主程序部分的代码,实现键盘扫描。
4.2运算部分程序设计本部分采用全局变量a、b、c、d,将运算的结果都存入这几个变量里,通过将这些变量的值分部分存入数组里的各个元素,从而改变显示的值。
程序见附录二。
4.3显示子程序设计显示部分采用定时中断方式,每隔一段时间扫描一次数组xx[],从而使得各个时段数组中的数值显示在数码管上。
代码如下:void diaplay(void) interrupt 1{uchar len;TH0=(65536-2000)/256;TL0=(65536-2000)%256;P2=Disbuf[dcounter];len=dcounter;P0=xx[len];dcounter+=1;if(dcounter==8){dcounter=0;}}4.4主程序设计主程序既把以上各子程序串连成一个整体,使整个程序循环运行,同时启动定时。
中断部分的显示部分与主程序部分独立,一直执行;主程序一直调用扫描电路,若有键按下,则会进入以下的主程序部分执行相应的运算操作并作出相应的处理。
通过计算后,数组内的值发生改变,显示的值也会同时发生改变。
之后再进行键盘扫描,如此反复运行,就构成了程序的整体。
整体程序清单见附录二。
五、调试及性能分析5.1调试步骤焊接前考虑好布局,采用较为合理的一种,为了使得板子简洁不易出错,采用公共电源和地。
焊接插槽时先不要把所有的引脚都焊接上,以免在后面发现错误时无法再改变布局。
应先焊好两个引脚以固定好插槽就够了。
在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。
接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。
再插上单片机测试最小系统是否可用,一切正常后方可将其它芯片插入芯片座,以继续测试其他功能。
将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。
编写相关部分的测试程序对其进行测试。
各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。
成功下载程序后,查看结果,发现数码管显示数值不正常,首先测试是否是数码管有损坏,自己编一个点亮所有数码管所有段的程序进行测试,结果发现所有数码管e端不亮,说明数码管正常,而是前面部分的电路或芯片有问题。
通过用电压表测试发现是芯片74ls244损坏,输入端对应的输出端输出数值出现反向现象,从而导致前面的结果。
更换好的芯片后,从新下载计算器程序显示出现新的乱码问题。
归零后显示的数值不是零,而是乱码,自习观察发现刚好是显示零的显示数值按相反的顺序排列显示出来的情况,从而可以断定是P0口的各个位与74ls244接口的顺序接反了,调整后归零正常显示0。
通过以上的修正后仍不能进行正常的计算,同样出现乱码,最后考虑到我程序中采用了P3口引脚控制扩张功能,而P3口是有部分引脚接在下载电路部分max232芯片上,肯定会有一定影响,用电压表测试其对应引脚电压发现电平有变化,故可以确定会影响程序的执行,撤去MAX232后可正常运行。
5.2性能分析对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:加法运算:8位加法运算,和值不超过一亿,若超过上限,则显示错误提示ERROR,扬声器报警提示。
减法运算:8位减法运算,若结果为负,提示ERROR。
乘法运算:积不超过一亿的乘法运算,若超出上限,显示错误提示ERROR,扬声器报警提示。
除法运算:支持小数运算,结果最大保留四位小数,若除数为0,则输出ERROR扬声器报警提示。
小数运算:可支持小数输入运算,结果最大精确到0.0001,优先显示整数部分,剩余部分显示小数,不显示无效的零。
扩展功能:支持求自然对数,常用对数,开方,求e的幂次运算。
所有功能的计算都通过了与电脑计算器计算结果的对比验证,完全符合运算要求。
通过对实际性能的分析,可以得到本次设计满足设计的要求。
六、心得体会本次单片机课程设计是学了单片机后的第一次实际应用,获益匪浅。
通过本次课程设计我真正的自己完成了对给定要求系统的硬件选择及设计、电路设计、软件设计以及对成品的调试过程。
通过本次试验发现自己可以通过自己的知识真正做出可以实际应用的电子产品,增强自己的自信心,在设计过程中发现问题,解决问题,虽然过程有点累,但通过学习又扩张了自己的知识面,学到了新的单片机内容。
刚开始写程序时问题一大堆,就算是写个小程序验证下自己的某个想法都很吃力,但经过痛苦的四天钻研后,才有了实质的进展,第五天基本写出了程序,第六天完善了扩展功能同时消除了执行过程的按键稳定性问题,使得可以在长期按下键的时候同样不会影响数字的输入,在调试过程中同样经历了诸多问题,这些在“调试步骤”部分做了详细说明,由于只有我做了八位显示的计算器,且做了部分扩张功能和支持小数运算,与其他人都的不同,故出现问题都得完全靠自己解决,虽然有难度,但更有挑战性和成就感,相信在以后的学习工作中会大有裨益的。
在收获的同时也发现了自己诸多方面的不足,基础知识不够扎实,实际操作还不够熟练,很多东西都只停留在理论上,对于实际的硬件器件及芯片不够了解,在应用时比较吃力,说明没有将理论很好的与实际联系,同时自己电子方面知识面还不够广,应该加强在电子方面的相关知识,提高自己的电子专业技能。
参考文献[1][2][3][4]刘琨孙春亮.单片机C语言入门.人民邮电出版社,2008杨辉先黄辉先.单片机原理及应用.人民邮电出版社,2009谭浩强 .C语言程序设计.清华大学出版社,2008 姜志海赵艳雷.单片机的C语言程序设计与应用,2008附录1系统硬件电路图附录2程序清单#include<reg52.h>#include<intrins.h>#include<math.h>typedef unsigned char uchar;typedef unsigned int uint;void delay();uchar Keyscan(void);void result_a(void);void diaplay(void);void Delay_1ms(uint i);uchar vie_a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar exchg_a[16]={7,8,9,13,4,5,6,12,1,2,3,11,14,0,15,10};uchar xx[8];uchar xxu[8];void Speak_a(void);sbit spp=P3^7;//响铃sbit cl3=P3^6;//小数点sbit cl=P3^1;//求lnsbit cl0=P3^2;//开方sbit cl1=P3^3;//求logsbit cl2=P3^4;//求e的x次幂uchar flo[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; uchar zz[8]={0x77,0x3f,0x77,0x77,0x79};uchar Disbuf[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar yy[8]={0x3f,0,0};float a=0,b=0,c;uchar L=1;uuuuuuuu_a=0,dcounter=0;vvvvvvvv(void){uchar singlp_a=1,n=1;uchar key=18;uchar all_m=0,ent_a=0,att=1;signed long s,r;TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;EA=1;ET0=1;TR0=1;spp=0;while(1){if(singlp_a==1){singlp_a=0;P3=0x7f;if(P3!=0x7f){Delay_1ms(2);if(cl==0){Speak_a();cal_a=14;//求以㏑xkey=15;}if(cl0==0){Speak_a();cal_a=15;//开方key=15;}if(cl1==0){Speak_a();cal_a=16;//求以十为底对数key=15;}if(cl2==0){Speak_a();cal_a=17;//求e的x次幂key=15;}if(cl3==0){att=0;xx[0]=xx[0]+0x80;}}P1=0x0f;if(P1!=0x0f){Delay_1ms(2);if(P1!=0x0f){key=exchg_a[Keyscan()];Speak_a();}}}P1=0x0f;P3=0x7f;if(P1==0x0f&&P3==0x7f){singlp_a=1;}if(key<=9&&key>=0){if(all_m==0){if(ent_a==0){uchar i;eee_a=1;fff(i=0;i<=7;i++){xx[i]=0;}}else{}if(att==1){uchar i;a=a*10+key;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];key=18;}else{uchar i;double m;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];m=key;for(i=1;i<=n;i++){m=m/10;}a=m+a;n++;key=28;}}else{if(att==1){uchar i;b=b*10+key;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];key=18;}else{uchar i;double m;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];m=key;for(i=1;i<=n;i++){m=m/10;}b=m+b;n++;key=28;}}}if(key>=10&&key<=13) {uchar i;cal_a=key;for(i=0;i<=7;i++){xx[i]=xxu[i];}all_m=1;key=18;att=1;n=1;}if(key==14){uchar i;key=18;eee_a=0;fff(i=0;i<=7;i++){xx[i]=yy[i];}a=0;b=0;c=0;all_m=0;L=1;att=1;n=1;cal_a=0;}if(key==15){uchar i;all_m=0;key=28;for(i=0;i<=7;i++){xx[i]=0;}result_a();//调用求计算结果if(L==1){if(c==0){xx[0]=0x3f;}if(c>=0.0001){r=c;s=10000*(c-r);n=0;xx[n]=vie_a[s%10];if(s%10!=0){n++;}if(c>=0.001){r=c;s=1000*(c-r);xx[n]=vie_a[s%10];if(n==0&&s%10==0){}else{n++;}if(c>=0.01){r=c;s=100*(c-r);xx[n]=vie_a[s%10];if(n==0&&s%10==0){}else{n++;}if(c>=0.1){r=c;s=10*(c-r);xx[n]=vie_a[s%10];if(n==0&&s%10==0){}else{n++;}if(c>=1){s=c;xx[n]=flo[s%10];n++;if(c>=10){s=c/10;xx[n]=vie_a[s%10];n++;if(c>=100){s=c/100;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=1000){s=c/1000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=10000){s=c/10000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=100000){s=c/100000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=1000000){s=c/1000000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=10000000){s=c/10000000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=100000000){for(i=0;i<=7;i++){xx[i]=zz[i];}}}}}}}}}}else{xx[n]=0xbf;}}else{xx[n+1]=0xbf;xx[n]=0x3f;}}else{xx[n+2]=0xbf;xx[n+1]=0x3f;xx[n]=0x3f;}}else{xx[n+3]=0xbf;xx[n+2]=0x3f;xx[n+1]=0x3f;xx[n]=0x3f;}}}}}}void result_a(void){switch(cal_a){case 0:c=a;break;case 10:c=a+b;break;case 11:if(a<b){uchar i;for(i=0;i<=7;i++){xx[i]=zz[i];}L=0;}else{c=a-b;}break;case 12:c=a*b;break;case 13:c=a/b;break;case 14:c=log(a);a=c;break;case 15:c=sqrt(a);a=c;break;case 16:c=log10(a);a=c;break;case 17:c=exp(a);a=c;break;default:c=0;}}void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay(){int i,j;for(i=0; i<=10;i++)for(j=0; j<=2;j++);}20uchar Keyscan(void){uchar i,j,temp,Buffer[4] ={0xef, 0xdf, 0xbf, 0x7f};for(j=0; j<4;j++){P1 = Buffer[j];/*以下三个_nop_();作用为让 P1口的状态稳定*/delay();temp = 0x01;for(i=0; i<4;i++){if(!(P1 &temp)){return (i+j*4);}temp <<= 1;}}}void diaplay(void) interrupt 1{uchar len;TH0=(65536-2000)/256;TL0=(65536-2000)%256;P2=Disbuf[dcounter];len=dcounter;P0=xx[len];dcounter+=1;if(dcounter==8){dcounter=0;}}void Speak_a(void){uchar i;for(i=0;i<=20;i++){spp=1;delay();delay();21spp=0;delay();delay();}}22。