简易计算器课程设计_第1页
简易计算器课程设计_第2页
简易计算器课程设计_第3页
简易计算器课程设计_第4页
简易计算器课程设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、实训成绩批阅教师日 期课程设计课程名称 单片机原理及接口技术 专业班级 电气 学 号 2013118508 学生姓名 指导教师 实训地点 2015年07月17日摘要随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了, 单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。近年来,单片机以其体积小、价格廉、面向控制等独特优点,在各种工业控制、仪器仪表、设备、产品的自动化、智能化方面获得了广泛的应用。与此同时,单片机应用系统的可靠性成为人们越来越关注的重要课题。影响可靠性的因素是多方面的,如构成

2、系统的元器件本身的可靠性、系统本身各部分之间的相互耦合因素等。其中系统的抗干扰性能是系统可靠性的重要指标。本设计采用80S51 芯片,实现了利用单片机进行了一个简单计算器设计。允许对输入数据进行加减乘除运算及LCD 显示。实例所设计的计算器是用LCD1LM016L显示的,当然也可以用其他的器件显示,如LED 显示屏,这样就可以显示出更多的字符。科技的进步告别了以前复杂的模拟电路,一块几厘米平方的单片机可以省去很多繁琐的电路。现在应用较广泛的是科学计算器,但在市场还是需要简易计算器,因为其价格低廉,设计简单,使用方便被广泛的运用于我们的日常生活之中。 目录一、设计的大体思路1二、所用元件的详细功

3、能11、运算模块AT89C5112、键盘输入43、液晶模块简介6三、计算器程序流程图7四、总的设计图8五、计算器C语言编程9六、功能实现截图171、图注释172、图注释:183、图注释:194、图注释:205、图注释:21七、实训心得与体会22一、设计的大体思路我选到的本次课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。比如,十进制数的加减乘除四则运算。我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于寄存器所存的数据较少,很难实现多位数的四则运算,C语言确有着解决汇编语言的优点,所以选用C语言完成

4、该程序的制作,首先运用单片机AT89c51扫描4*4矩阵键盘,从而实现按键的输入功能,键盘的输入是按照每行的电平扫描,并判断按下数字键之后是否有符号键,如果没有则在原数之后添加数字,如果按下符号接收符号后数据,并判断是否有等号键按下,如果按下,则调用运算函数和输出结果。二、所用元件的详细功能1、运算模块AT89C51MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中

5、断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图所示:第 2 页单片机(AT89S51)的引脚功能51系列单片机8031、8051及89c51/89s51均采用40Pin封装的双列直接DIP结构。上图是它们的引脚配置:40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用,如图所示:完整引脚图引脚介绍电源引脚:Vcc40脚正电

6、源脚,工作电压为5V,另有AT89LV51工作电压则是2.7-6V, 引脚功能一样。GND20脚接地端。型号同样为AT89C51的芯片,在其后面还有频率编号,有12,16,20,24MHz可选。大家在购买和选用时要注意了。如AT89C51 24PC就是最高振荡频率为24MHz,40P6封装的普通商用芯片。复位:在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的0000H处开始运行程序。复

7、位操作不会对内部RAM有所影响。当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。什么叫复位?复位是单片机重新执行程序代码的意思。8051的复位方式可以是自动复位,也可以是手动复位,如图3-6所示。此外,RESET/Vpd还是一复用脚,Vcc掉电期间,此脚可接上备用电源, 以保证单片机内部RAM的数据不丢失。输入输出(I/O)引脚:P39-P32为P0.0-P0.7输入输出脚,称为P0口,是一个8位漏极开路型双向I/O口。内部不带上拉电阻,当外接上拉电阻时,P0口能以吸收电流的方式驱动八个LSTTL负载电路。通常在使用时外接上拉电阻,用来驱动多

8、个数码管。 在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,不需要外接上拉电阻。P1-P8为P1.0-P1.7输入输出脚,称为P1口,是一个带内部上拉电阻的8位双向I/0口。P1口能驱动4个LSTTL负载。 通常在使用时外不需要外接上拉电阻,就可以直接驱动发光二极管。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。P21-P28为P2.0-P2.7输入输出脚,称为P2口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外

9、部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。 P10-P17为P3.0-P3.7输入输出脚,称为P3口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。P1P3端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。除此之外P3端口还用于一些专门功能,如P3引脚兼用功能P3.0串行通讯输入(RXD)P3.1串行通讯输出(TXD)P3.2外部中断0( INT0)P3.3外部中断1(INT1)P3.4

10、定时器0输入(T0)P3.5定时器1输入(T1)P3.6外部数据存储器写选通WRP3.7外部数据存储器写选通RD控制或复用引脚:(1) ALE/PROG 30 访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。在访问外部数据存储器时,出现一个ALE脉冲。对Flash存储器编程时,这个引脚用于输入编程脉冲PROG(2) PSEN 29 该引是外部程序存储器的选通信号输出端。当AT89C51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。但访问外部数据存储器时,将不会有脉

11、冲输出。(3) EA/Vpp 31 外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使AT89S51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。对Flash存储器编程时,用于施加Vpp编程电压。2、键盘输入当无按键闭合时,P10P13 与P14P17 之间开路;当有键闭合时,与闭合键相连的两条I/O 口线之间短路。判断有无按键按下的方法是:第一步,置列线P14P17 为输入状态,从行线P10P13 输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14P17 读入数据,若有某一列为低电平,则对

12、应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式。为此,我们引入了矩阵键盘的应用,采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘。在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率,如图所示:键盘介绍:每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩

13、阵的行线和列线分别通过两并行接口和CPU通信。键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。3、液晶模块简介LM016L的结构及功能LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,

14、hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码,CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系Proteus仿真:使用P

15、roteus仿真1602-即LM016L-依照数据手册说明可能遇到困难,可以尝试采用以下方案解决:1、数据手册中可能介绍1602内部D0D7已有上拉,可以使用P0口直接驱动。在Proteus里LM016L内部可能没有,应该人为加上拉电阻。建议不要使用排阻,使用普通电阻一个一个拉应该可以解决问题;2、可能碰到不能检测忙信号的问题,尝试使用延时把忙信号拖过去.引脚说明1602字符型LCD通常有14条引脚线电路接口设计,AT889C51的P0口作为数据的输出端,P2.0和P2.1,P2.2作为控制信号的输出端三、计算器程序流程图 系统程序流程图 LCD显示流程图开始预设数据显示开始调整指针指向下一行

16、LCD初始化功能设置系统初始化LCD初始化显示结束?显示RAM区清 N显示指针指向下一行处理按键值 Y待显示数据送缓冲判断当前状态结束LCD显示四、总的设计图简易计算器主要包括:键盘电路、显示电路。以下是设计的整个系统的图五、计算器C语言编程#include<reg51.h> /头文件 #define uint unsigned int / 将unit定义为无符号整数#define uchar unsigned char / 将uchar定义为无符号变量sbit lcden=P23; /定义引脚 sbit rs=P24; /定义引脚sbit rw=P20; /定义引脚sbit bu

17、sy=P07; /定义引脚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; /十六进制码 2f(除法)2a

18、(乘法)2d(减)01(清零)3d(等号)2b(加号)void delay(uchar z) / 延迟函数uchar y; uchar/定义为无符号变量for(z;z>0;z-)for(y=0;y<110;y+);void check() / 判断忙或空闲doP0=0xFF;rs=0; /指令rw=1; /读lcden=0; /禁止读写delay(1); /等待,液晶显示器处理数据lcden=1; /允许读写 while(busy=1); /判断是否为空闲,1为忙,0为空闲 void write_com(uchar com) / 写指令函数 P0=com; /com指令付给P0口r

19、s=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() /初始化 num=-1;lcden=1; /使能信号为高电平write_com(0x38); /8位,2行write_com(0x0c); /显示开,光标关,不闪烁*/write_com(0x06); /增量方式不移位 显竟獗暌贫 柚?write_com(0x80); /检测忙信号write_com(0x01); /显示开,光标关,不闪烁num_1

20、=0;i=0;j=0;a=0; /第一个参与运算的数b=0; /第二个参与运算的数c=0;flag=0; /flag表示是否有符号键按下,fuhao=0; / fuhao表征按下的是哪个符号void keyscan() / 键盘扫描程序P3=0xfe;if(P3!=0xfe) delay(20); /延迟20ms if(P3!=0xfe) 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

21、!=0xfe);/键盘第一行7 8 9 /if(num=0|num=1|num=2)/如果按下的是'7','8'或'9 if(j!=0) write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是'/' flag=1; fuhao=4;/4表示除号已按 i=table1num; write_date(0x30+i);P3=0xfd;if(P3!=0xfd)delay(5);if(P3!=0xfd)te

22、mp=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);/键盘第二行4 5 6 *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+tablenum;else/如果按过符

23、号键 b=b*10+tablenum; else/如果按下的是'/'flag=1; fuhao=3;/3表示乘号已按i=table1num;write_date(0x30+i);P3=0xfb;if(P3!=0xfb)delay(5); if(P3!=0xfb) 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); /键盘第三行1 2 3 -

24、if(num=8|num=9|num=10)/如果按下的是'1','2'或'3' if(j!=0) write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else if(num=11)/如果按下的是'-' flag=1; fuhao=2;/2表示减号已按 i=table1num; write_date(0x30+i); P3=0xf7; if(P3!=0xf7) delay(5); if(P3!=0xf7) t

25、emp=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; writ

26、e_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;

27、 /减法 else if(fuhao=2)write_com(0x80+0x4f); /光标前进至第二行最后一个显示处 write_com(0x04); /设置从后住前写数据,每写完一个数据,光标后退一格 if(a-b>0) c=a-b; else c=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(0x

28、80+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/

29、b=0) write_date(0x30); write_date(0x3d); a=0;b=0;flag=0;fuhao=0; break;case 15:write_date(0x30+table1num);flag=1;fuhao=1; break; main()init();while(1) keyscan();六、功能实现截图图1、图注释:可实现小数点后3位的显示,来自源程序c=(long)(float)a/b)*1000);Float:单精度实型变量取值范围在-1038到1038,有4字节,有效位数78位图2、图注释:减法的实现可以实现负数,源程序if(fuhao=2)write_

30、com(0x80+0x4f); /光标前进至第二行最后一个显示处 write_com(0x04); /设置从后住前写数据,每写完一个数据,光标后退一格 if(a-b>0) c=a-b; else c=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; 图3、图注释:源程序if(fuhao=1)write_com(0x80+0x4f);/按下等于键,光标前进至第二行最后

31、一个显示处 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;图4、图注释:源程序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; /最大可实现被

温馨提示

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

评论

0/150

提交评论