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

下载本文档

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

文档简介

1、基于单片机的简易设计原理 专业:通信专业 班级:通信1班 姓名:刘民学号:1304041127 摘要:按下键盘,通过键盘扫描程序,在LCD液晶显示屏上显示按键的操作过程,最终显示计算结果,实现计算器的基本功能。本文详细介绍LCD显示屏、矩阵键盘与C51单片机接口的应用,并介绍如何通过C51单片机实现计算器的算法。关键字:C51单片机,键盘,LCD液晶,计算器一、设计任务:本次实验是要以51系列单片机为核心实现一个简易计算器,它的结构简单,外部主要由4*4矩阵键盘和一个液晶显示屏构成,内部由一块STC90C51单片机构成,通过软件编程可实现简单加、减、乘、除、清除结果。实现对计算器的设计,具体设

2、计如下:1、采用6位显示,最大显示值为“999999”,设计16个按键的矩阵键盘,按键包括09、+、-、*、/、=、C。2、加减法做四字节运算;乘法做双字节运算;除法被除数为四字节,除数为两字节。3、当运算结果超出显示范围时,显示ERROR!。4、上述运算输入值均为整数,当结果带有小数时,可以采用四舍五入方式处理,也可以带小数显示。二 、方案论证经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机微控制电路。具体如下:1) LCD显示电路 LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。又

3、以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.2) 4*4键盘扫描电路(中断式,扫描式,反转式)用户设计行列键盘接口,一般常采用3 种方法读取键值。一种是中断式,外两种是扫描法和反转法。 扫描法:对键盘上的某一行送低电平,其他行及列全为高电平,然后读取列值,检查各列线点评的变化,如果某列线电平为低电平,就可以确定此行此列交叉点处的按键被按下,采用延时去抖动。 ) 单片机微控制电路微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。三 硬件电路的设计3.1 硬件设计电路框图LCD显示晶振电路 4*4键盘51系列单片机系统复位电路线路原理框

4、图3.2、系统模块图: 四、键盘接口电路: 计算器输入数字和其他功能按键要用到很多按键,矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图1所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。 图2 键盘接口电路图 五、LCD显示 LCD显示器介绍有字符型液晶显示模块(SMC1602A)和点阵式液晶显示模块(TCM12232A、TCM128

5、64N)下面以SMC1602A为例介绍字符型液晶显示模块的功能及应用。(一)、字符型液晶显示模块的引脚及功能引脚符号功能1VSS电源地2VDD电源正极3Ve0对比调整电压4RS0输入指令,1输入数据5R/W0写入指令或数据,1读取信息6E使能信号,1读取数据,下降沿执行指令714DB0DB7数据输入口15BLA背光电源正极16BLK背光电源负极 在1602液晶内部有字模发生存储器CGROM及显示数据存储器DDRAM。其中,字模发生存储器CGROM主要用来存储192个常用字符的字模编码,包含标准的ASCII码。DDRAM是显示数据存储器共80个字节,分别对应1602液晶显示器的两行。第一行地址为

6、0X00H0X27H,共40个字节;第二行地址为0X40H67H,共40个字节。 RAM 地址映像如下图:(二):字符型液晶显示模块的控制操作 RSR/WEDB0DB7011读出状态字111读出数据在1602读回的状态字中,D7位为状态BF,当BF=1时表示忙碌,此时不能进行写操作。当BF=0时表示状态为空闲,可以进行写操作。 (2)写操作: RSR/WEDB0DB700下降沿输入指令10下降沿输入数据(3) 初始化命令字: a.工作方式设置指令D7D6D5D4D3D2D1D0001DLNF00DL设置与MCU的接口方式。DL=1表示数据宽度为8位,DB0DB7有效。DL=0表示数据宽度为4位

7、,DB4DB7有效。N设置显示字符行数。N=0表示显示一行字符,N=1表示显示两行字符。F设置显示字符字体,一般为0。F=0表示显示5X8点阵字体,F=1表示显示5X11点整字体。b.显示状态设置D7D6D5D4D3D2D1D000001DCBD为画面显示状态位。D=1表示显示功能开,D=0表示显示功能关。C为光标显示状态位。C=1表示有光标,C=0表示无光标。B闪烁显示状态位。B=1表示光标闪烁,B=0表示光标不闪烁。 c.输入方式设置指令D7D6D5D4D3D2D1D0000001I/DS该指令的操作主要是设置显示字符的输入方式。即在操作数据写入/读出后,AC数据地址指针的修改方式。I/D

8、=1时,AC为自动加一计数器,I/D=0时,AC为自动减一计数器。S设置写入字符时是否允许画面滚动。S=1时允许画面/光标滚动,S=0时禁止画面/光标滚动。d.光标或画面滚动设置指令D7D6D5D4D3D2D1D00001S/CR/L00S/C滚动对象选择位。S/C=1时画面滚动,S/C=0时光标滚动。R/L滚动方向选择位。R/L=1时向右滚动,R/L=0时向左滚动。e.清屏指令D7D6D5D4D3D2D1D000000001执行清屏指令后,DDRAM内容为空白的ASCII码20H,光标归位在左上方,地址计数器AC=0.f.光标复位指令D7D6D5D4D3D2D1D000000010执行光标复

9、位指令后,AC=0,DDRAM中的值不变。g.DDRAM地址设置指令D7D6D5D4D3D2D1D01A6A5A4A3A2A1A0当需要向某一地址中写入数据时,先写入地址,再写入数据。开始程序图程序初始化是“=”?Y数字键键码功能读键码有键输入LCD显示等待数值输出结果送入缓存保存结果,或执行功能保存状态执行计算NY功能键NY输入缓存输入键值五、运算模块(单片机控制): MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM

10、/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。六:设计心得、体会、总结我的题目简易计算器的设计,对于我们这些实践中的新手来说,这是一次考验,怎样才能找到课堂所学与实际应用的最佳结合点?怎样让自己的计划更具有程序性,而不会忙无一用?这都需要我们所要考虑和努力的。这次设计我学到了很多,在设计过程中怎样去克服心理上的不良情绪。不仅巩固

11、了所学知识,而且学到了很多书上学不到的知识,掌握了一种系统的学习方法,可以进行一些简单的编程。这次设计使我懂得了理论与实际结合很重要,只有理论知识是远远不够的,从而提高自己的实际动手能力和独立思考的能力,同时在设计过程中发现自己的不足,加强巩固,有利于后续的单片机考试。调试过程中也遇到了很多问题,例如,液晶显示明明定义了两行显示,但实际中却只有一行,最后竟查资料发现,液晶内部自检时间比单片机慢,需要延时多定义,避免未完成自检就执行指。主要参考文献单片机原理与接口技术,李升主编,北京大学出版社,2011年7月单片机原理及应用实验指导书,屈波等编,2012年2月25日微处理器综合实训系统模块化设计

12、戴建 编 2012年2月单片机原理及应用,赵德安等编,机械工业出版社,2009年 附原理图附:硬件设计电路的元件清单器件名称数量AT89C511按键174k7x424k7x91电容22uF1LCD16021晶振12MHz1电容30pF2电位器1031附源代码/*P1.0P1.3接行*P1.4P1.7接列. * P0接LCD*/ #include<reg52.h> #define uchar unsigned char uchar code dis1="!rorre"/后面使用倒序显示 uchar code dis2="!rorre htam"

13、 sbit busy=P07; sbit RS=P22; sbit RW=P21; sbit EN=P20; char i,j,temp,num; long a,b,c; uchar 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, 0x01-0x30,0,0x3d-0x30,0x2b-0x30 ;void delay(uchar z) /延时 uchar x,y; for(x=z;x>0;x-) f

14、or(y=0;y<125;y+); void ready() /忙检测 do P0=0xff; RS=0; RW=1; EN=0; delay(5); EN=1; while(busy=1); void write_com(uchar com) /写指令 P0=com; RS=0; RW=0; EN=0; ready(); EN=1; delay(10); void write_data(uchar m) /写数据 P0=m; RS=1; RW=0; EN=0; ready(); EN=1; void inital() /初始化 EN=1; write_com(0x38); /【设置LC

15、D为16X2显示,5X7点阵,八位数据接口】 delay(10); write_com(0x38); /【LCD内检较单片机慢,为防止未完成内检就执行指令,延迟,再写指令以完成内检】 write_com(0x0c); /无光标 write_com(0x06); /光标后移 write_com(0x80); write_com(0x01); /清屏 i=0; j=0; a=0; /第一个参与运算的数 b=0; /第二个参与运算的数 c=0; flag=0; /flag表示是否有符号键按下 fuhao=0; /fuhao表征按下的是哪个符号 void keyscan() /键盘扫描程序 P1=0x

16、fe; /将某一行置低,列全为高 if(P1!=0xfe) /判断是否有键按下 delay(20); /延时去抖动 if(P1!=0xfe) /重新确认 temp=P1&0xf0; /【行全置低,判断列是否变化】 switch(temp) case 0xe0: num=0; break; case 0xd0: num=1; break; case 0xb0: num=2; break; case 0x70: num=3; break; while(P1!=0xfe); if(num=0|num=1|num=2) /如果按下的是'7','8'或'9

17、 if(j=1) /确认一次计算完毕,清屏 write_com(0x01); j=0; if(flag=0) /没有按过符号键 a=a*10+tablenum; else /如果按过符号键 b=b*10+tablenum; else /如果按下的是'/' flag=1; fuhao=4; i=table1num; write_data(0x30+i); P1=0xfd; if(P1!=0xfd) delay(20); if(P1!=0xfd) temp=P1&0xf0; switch(temp) case 0xe0: num=4 ; break; case 0xd0:

18、num=5; break; case 0xb0: num=6; break; case 0x70: num=7; break; while(P1!=0xfd); if(num=4|num=5|num=6) /如果按下是'4','5'或'6 if(j=1) write_com(0x01); j=0; if(flag=0) a=a*10+tablenum; else b=b*10+tablenum; else flag=1; fuhao=3; i=table1num; write_data(0x30+i); P1=0xfb; if(P1!=0xfb) del

19、ay(20); if(P1!=0xfb) temp=P1&0xf0; switch(temp) case 0xe0: num=8; break; case 0xd0: num=9; break; case 0xb0: num=10; break; case 0x70: num=11; break; while(P1!=0xfb); if(num=8|num=9|num=10) /如果按下的是'1','2'或'3 if(j=1) write_com(0x01); j=0; if(flag=0) a=a*10+tablenum; else b=b*1

20、0+tablenum; else flag=1; fuhao=2; i=table1num; write_data(0x30+i); P1=0xf7; if(P1!=0xf7) delay(20); if(P1!=0xf7) temp=P1&0xf0; switch(temp) case 0xe0: num=12; break; case 0xd0: num=13; break; case 0xb0: num=14; break; case 0x70: num=15; break; while(P1!=0xf7); switch(num) case 12: /按下的是"清零&

21、quot; write_com(0x01); a=0; b=0; flag=0; fuhao=0; break; case 13: /写'0' if(j=1) /确认一次计算完毕,清屏 write_com(0x01); j=0; if(flag=0) a=a*10; write_data(0x30); if(flag=1) b=b*10; write_data(0x30); break; case 14: write_data(0x3d); / 写'=' j=1; if(fuhao=1) /'写+' write_com(0x80+0x4f); /

22、【也可写成成 write_com(0xc0+0x0f); 定义第二行】 write_com(0x04); / 光标前移 c=a+b; if(c=0) write_data(0x30); while(c!=0) write_data(0x30+c%10); c=c/10; 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; else c=b-a; if(c=0) write_data(0x30); while(c!=0) write_data(0x30+c%10); c=c/10; if(a-b<0) write_data(0x2d); /写负号"-" a=0; b=0; flag=0; fuhao=0; else if

温馨提示

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

评论

0/150

提交评论