基于单片机的简易计算器_第1页
基于单片机的简易计算器_第2页
基于单片机的简易计算器_第3页
基于单片机的简易计算器_第4页
基于单片机的简易计算器_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、科技大学电工电子实验教学中心创新性实验研究报告课程名称:单片机原理与应用实验项目名称 简易计算器 梁兆飞 学号 0901101612 手机 Email liangzhaofei09163.专 业 电子信息工程 班级 2009级1班 指导教师与职称 钟宁帆开课学期 2011 至2012学年 1 学期提交时间 2012 年 1 月 4 日21 / 23一、实验摘要计算器在人们的日常中是比较的常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的计算器。该设计系统是以AT89C51为单片机, P1口作为输入端,外接4X4的键盘,通过键盘扫

2、描来对输入数的控制,并外接驱动电路,系统采用LCD作为显示器,软件程序采用均采用C语言编写,便于移植与升级。报告详细介绍了整个系统的硬件组成结构、工作原理和系统的软件程序设计。计算器将完成的功能有整数的加,减,乘,除等功能。关键字 计算器 AT89C51 LCD C语言二、实验目的为了满足计算器的基本要求,即可以 完成100以无符号整数的四则运算, 结果有小数的保持小数点后1位, 结果为负数需要显示负数,每次运算只需两个数据参加,数据归零和出错警告提示,我们采用基于单片机设计计算器,并用LED 数码管显示数据,4*4 的矩阵键盘实现数据输入。设计仿真和调试要用到Protues 、Keil等软件

3、。三、实验场地与仪器、设备和材料:实验场地: J11-324实验仪器:hot51单片机实验板,PC机一台,Protues软件,keil软件四、实验容1、实验原理根据功能和指标要求,本系统选用MCS 51 单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计考虑如下:由于要设计的是简单的计算器,可以进行100以无符号数的四则运算,对数字的大小围要求不高故我们采用可以进行四位数字的运算,选用LCD显示数据和结果。另外键盘包括数字键(09)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。2,系统结构框图51系列单片机系统4*4键盘LCD显

4、示 晶振电路复位电路线路原理框图2、实验容 该实验主体设计部分包括硬件部分和软件部分的设计,硬件设计部分有硬件设计:(一)、总体硬件设计:本设计选用AT89C52单片机为主控单元; 显示部分:采用1602LCD静态显示;按键部分:采用4*4键盘。总体设计效果如下图:(二)、单片机接口电路说明:1、手动上电复位电路:当VCC上电时,C充电,在10K电阻上出现电压,使得单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。工作期间,按下S,C放电。S松手,C又充电,在10K电阻上出现电压,使得单片机复位。几个毫秒后,单片机进入工作状态。2、部时钟模式电路:当单

5、片机工作于部时钟模式的时候,只需在XTAL1和XTAL2引脚连接一个晶体振荡器或者瓷振荡器,并接两个电容后接地即可,在使用时对于电容的选择有一定的要求:当外接晶体振荡器的时候,电容值一般选择C1=C2=30+10pF或30-10pF;当外接瓷振荡器的时候,电容值一般选择C1=C2=40+10pF或40-10pF;3、AT89C52单片机引脚介绍:VCC: 供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作

6、为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于部上拉的缘故。P2口当用于外部程序存储器或16位地址外部

7、数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口:P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(

8、外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一

9、个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有部程序存储器。注意加密方式1时,/EA将部锁定为RESET;当/EA端保持高电平时,此间部程序存储器。在FLASH编程期间,此引脚也用于施

10、加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入与部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。4、单片机与复位、时钟电路连接电路图:(三)、键盘接口电路:计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理

11、:计算器的键盘布局如图1所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。为了得到键盘中资源,进行键盘扫描程序,得到按键的数码,以便进行运算。uchar Keyscan(void) uchar i, j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f; for(j = 0; j < 4; j+) /循环四次 P2 = Bufferj; /在P1高四位分别输出一个低电平 temp = 0x01; /计划先判断P1.0位 for(i = 0; i < 4; i+) /循环四次 if(!(P2 &am

12、p; temp) /从P1低四位,截取1位 return (i + j * 4); /返回取得的按键值 temp <<= 1; /判断的位,左移一位 return 16; /判断结束,没有键按下,返回16 (四)、LCD显示模块:本设计采用LCD液晶显示器来显示输出数据。通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。(五)运算模块(单片机控制):MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM

13、)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统与特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以与高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。3、实验步骤系统总流程图:五、实验结果与分析1、实验现象、数据记录数码显示与运算最多九位显示与运算当超出时溢出显示当出错时报错显示本设计可以进行9位以的四则运算,以与除法进行中产生的小数精确到小数点后一位。可以进行溢出提示与报错显示。2、对实验现象、数据与观察结

14、果的分析与讨论: 本设计的运算与时,显示清楚,可以很好地完成设计的基本与扩展要求。3、关键点: 在编程过程中本设计采用了单片机c语言编程,硬件中液晶显示更加直观,稳定,较比数码管有不少的优势。 在本设计中又添加溢出与报错显示,可以很好地为使用者服务,更加的人性化。显示稳定与时,是可以作为简易计算器的作品。六、实验结论 在实验中遇到了这样那样的问题,软件的编辑中使得c语言的应用更加熟练,在硬件的实现中又出现了软件和硬件不统一的问题,本实验我做了两次,由于在实验室没有MM74C922芯片,使得原来一个更加简便的应用程序成为了废物,我又在原程序上添加了扫描程序与其稳定程序,使得实验得以继续进行。 本

15、次设计不管在软件,或是在硬件方面都让我受益匪浅,让我所学的知识得以应用到实践,经过这次创新性实验,也令我看到了很多的不足,在实验中的一些程序不能够与时编辑正确,需要很长时间的设计。硬件中我对单片机实验板上的很多硬件不是很清楚,使得在下载程序后,又进行了很长时间的调整。七、指导老师评语与得分:签名: 年 月 日附件:源程序代码:#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned intchar translate(int keycode);void arithm

16、etic();void init_LCM();void write_data(char ddata);void write_(char command);void check_BF();void clearLCD();void display(long a);void dealerror(); void dataoverflow();void dealquyu(); uchar Keyscan(void); void Delay_1ms(uint x) ;/*定义变量和数组*/long x=0,y=0,num=0;int operators,input,iny=0;char key;char

17、error5="error"char overflow8="overflow"sbit EN=P34;sbit R_W=P35;sbit RS=P36; /*主函数*/main() uchar Key_Value = 16, Key_Temp1, Key_Temp2; EA=1; EX0=1; IT0=1; P2 = 0xff; display(0); init_LCM(); write_data(0x30+num); while(1) P2 = 0xff; Key_Temp1=Keyscan(); /先读入按键 if(Key_Temp1!= 16) /

18、如果有键按下 Delay_1ms(10); /延时一下 Key_Temp2 = Keyscan(); /再读一次按键 if (Key_Temp1 = Key_Temp2) /必须是两次相等 Delay_1ms(10); Key_Value= Key_Temp1; /才保存下来,这就是消除抖动 key=translate(Key_Value); if(key<='9'&&key>='0') /判断按下的键是否为数值 num=num*10+(key-'0'); if (operators>0) y=num; iny=

19、1; else x=num; if(num<134217728&&num>-134217728) /当前数值是否超出限定围 display(num); else dataoverflow(); else switch(key) case 'c':x=0;y=0;num=0;iny=0;operators=0;display(num);break; case '=':arithmetic();iny=0;operators=0;num=0;break; case '+': if (operators)arithmetic

20、();operators=1;num=0;break; case '-': if (operators)arithmetic();operators=2;num=0;break; case '*': if (operators)arithmetic();operators=3;num=0;break; case '/':if (operators)arithmetic();operators=4;num=0;break; while(Keyscan()<16) /等待按键释放 /display(Key_Value); /等待期间显示键值 /

21、display(Key_Value); /display(num); /*键值转化为键盘上按键值函数*/ uchar Keyscan(void) uchar i, j, temp, Buffer4 = 0xef, 0xdf, 0xbf, 0x7f; for(j = 0; j < 4; j+) /循环四次 P2 = Bufferj; /在P1高四位分别输出一个低电平 temp = 0x01; /计划先判断P1.0位 for(i = 0; i < 4; i+) /循环四次 if(!(P2 & temp) /从P1低四位,截取1位 return (i + j * 4); /返回取

22、得的按键值 temp <<= 1; /判断的位,左移一位 return 16; /判断结束,没有键按下,返回16 char translate(int keycode) switch(keycode) case 0: return '7' break; case 1: return '4' break; case 2:return '1'break; case 3:return 'c'break; case 4:return '8'break; case 5:return '5'brea

23、k; case 6:return '2'break; case 7:return '0'break; case 8:return '9'break; case 9:return '6'break; case 10:return '3'break; case 11:return '='break; case 12:return '/'break; case 13:return '*'break; case 14:return '-'break; case

24、 15:return '+'break; /case 16:/return ' '/break; /*算术运算函数*/void arithmetic() if (iny) switch(operators) case 1: x=x+y; num=x; if(num<134217728&&num>-134217728) display(num); else dataoverflow(); break; case 2: x=x-y; num=x; if(num<134217728&&num>-134217728

25、) display(num); else dataoverflow(); break; case 3: x=x*y; num=x; if(num<134217728&&num>-134217728) display(num); else dataoverflow(); break; case 4: if (y=0) dealerror(); else if (x%y!=0) dealquyu(); else x=x/y; num=x; if(num<134217728&&num>-134217728) display(num); else

26、 dataoverflow(); break; y=0; /*LCD显示程序设计/*LCD初始化函数*/void init_LCM() write_(0x30); write_(0x30); write_(0x30); write_(0x38); write_(0x08); write_(0x01); write_(0x06); write_(0x0e);/*LCD写数据函数*/void write_data(char ddata) RS=1;/*写指令*/ R_W=0; EN=1;/*使能信号开*/ P1=ddata;/*将数据送入p1口*/ EN=0;/*使能信号关*/ check_BF();/*LCD写指令函数*/void write_(char command) RS=0;/*写指令*/ R_W=0; EN=1;/*使能信号开*/ P1=command;/*将数据送入p1口*/ EN=0;/*使能信号关*/ check_BF();/*LCD检查忙碌函数*/void check_BF() char i,x=0x80; P1=0xff; while(x&0x80) RS=0; R_W=1; EN=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论