《毕业设计基于STC89C52RC单片机的简易计算器设计.doc》由会员分享,可在线阅读,更多相关《毕业设计基于STC89C52RC单片机的简易计算器设计.doc(40页珍藏版)》请在三一办公上搜索。
1、电子设计实验名称:基于STC89C52RC单片机的简易计算器设计 姓 名: _学 号:指导老师: 目录一、可行性研究.3二、设计方案简述.4 2.1、功能介绍.4基本功能.4扩展功能.4 2.2、总体设计方案.5总体设计思路.5方案论证与比较.6系统组成.7三、详细设计.12 1.各个模块设计.12 输入模块:键盘扫描.13 运算模块:单片机控制.14 显示模块:LCD1602显示.15 2.硬件电路设计.16 硬件连接.16 3.元件的介绍17 STC89C52单片机组成.17 复位和复位电路.18 LCD1602显示器.19 4.PCB设计以及结果显示.22五、 总结24附录主要程序代码.
2、25一、设可行性分析:1.2.1 经济可行性由于只是实验性质的编程,所以在设计和开发都不需要过多的经费,但是系统投入运行以后,硬件维护和损耗所造成的耗费是必须的,但是数目也不会很大。所以经过初步分析,经济上基本上是可行的1.2.2技术可行性在技术方面,因为都学习了C语言,硬件课程设计等课程,对于开发语言c语言也有一定的掌控能力,应该能够完成相应的任务。1.2.3 运行可行性该成果简单易操作,非常容易使用。1.2.4 法律可行性由于我们需要完成的功能相对简单,没有太多涉及到很专业方面的内容,更没有计划将系统利用到商业用途,所以不存在侵权或者版权纠纷方面的问题。1.2.5结论该系统的软硬件都比较容
3、易理解和实现,所以,具有实现一计算器的可行性。二、设计方案简述2.1功能概述系统基本功能:(1)由于设计的计算器要进行四则运算,为了得到较好的显示效果,经综合分析后,最后采用LCD 显示数据和结果。(2)采用键盘输入方式,键盘包括数字键(09)、符号键(+、-、)、清除键(onc)和等号键(=),故只需要16 个按键即可,设计中采用集成的计算键盘。(3)在执行过程中,开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。(4)错误提示:当计算器执
4、行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示overflow;当除数为0时,计算器会在LCD上提示error。扩展功能:加上括号的混合运算2.2总体设计思路本设计主要采用以下基本模块来实现:控制器模块,输入模块,输出模块和电源模块。通过对控制器进行编程。使其对输入模块的信号进行处理计算,然后通过输出模块反馈给使用者以计算结果。STC89C52单片机4*4键盘LCD显示 晶振电路复位电路线路原理框图方案论证与比较控制部分的设计方案论证与选择根据设计要求,控制器主要用于红外信号的接收和辨认、控制步进电机的动作,控制显示
5、步进电机的转速等。对于控制器的选择有以下三种方案。方案一:采用计算器专用芯片实现。用计算器专用芯片进行设计并编程实现。这种设计方案计算效率高、速度快、而且成本也相对较低,是厂家做计算器的最佳方案。但是本人对计算器专用芯片掌握的不够,还不足以实现设计计算器,所以这个方案不可去。 方案二:采用FPGA(现场可编程门阵列)作为系统的控制器。FPGA将所有器件集成到一块芯片上,体积小,节省空间,提高了稳定性;直接面向用户,具有极大的灵活性和通用性,使用方便,硬件测试和实现快捷,开发效率高,工作可靠性好。可以实现各种复杂的逻辑功能,规模大,密度高,采用并行的输入输出方式,系统处理速度高,适合作为大规模实
6、时系统的控制核心。由FPGA内部编程实现计算器功能,本设计对数据处理速度的要求不是很高,FPGA的高速处理的优势得不到充分的体现,由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物电路板布线复杂,加重了电路设计和实际焊接的工作。并且FPGA的价格相对较高,性价比太低。 方案三、用单片机实现。由于单片机集成了运算器电路、控制电路、存储器、中断系统、定时器/计数器以及输入/输出口电路等,所以用单片机设计控制电路省去了很多分立元器件。由于单片机是可编程芯片,并且它可以运用C语言编写,对于一些复杂的计算功能,可以调用C语言库函数。使编写程序变得非常简单。所以该课题用单片机实现,不仅功能易于实现
7、,而且精确度高,稳定性好,抗干扰能力强。并且由于其成本低、体积小、技术成熟和功耗小等优点,且技术比较成熟。性价比也相当高。更重要的是本人经过几年的学习,对单片机已有深刻的理解,并且可以灵活运用。综上所述,并通过各个方面综合比较为达到最佳效果。我们采用方案三利用单片机控制器。显示电路的设计方案论证与选择方案一:数码管显示方案。数码管显示使用两个四位一体动态数码管显示方案,此设计电路如图所示。采用动态数码管显示,具有程序简单, 对外界环境要求低,易于维护,同时其精度比较高,精确可靠,操作简单。显示直观的特点。但只能显示数字和一些代码,不能显示汉字及一些常用的符号,且硬件设计比较复杂。方案二;LCD
8、1602显示器所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于大部分的字符型液晶。字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示: HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表: HD44780的指令集1
9、.清屏指令 功能: 清除液晶显示器,即将DDRAM的内容全部填入空白的ASCII码20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为0。 2.光标归位指令 功能: 把光标撤回到显示器的左上方; 把地址计数器(AC)的值设置为0; 保持DDRAM的内容不变 3.进入模式设置指令 功能:设定每次定入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示: 位名设置 I/D 0=写入新数据后光标左移 1=写入新数据后光标右移 S0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移1个字 4.显示开关控制指令 功能:控制显示器开/关
10、、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名设置 D0=显示功能关 1=显示功能开 C0=无光标 1=有光标 B0=光标闪烁 1=光标不闪烁 5.设定显示屏或光标移动方向指令 功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C R/L设定情况 0 0光标左移1格,且AC值减1 0 1光标右移1格,且AC值加1 1 0显示器上字符全部左移一格,但光标不动 1 1显示器上字符全部右移一格,但光标不动 6.功能设定指令 功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名设置 DL 0=数据总线为4位 1=数据总线为8位 N 0=显示1行 1=显示2行
11、 F0=57点阵/每字符 1=510点阵/每字符 7.设定CGRAM地址指令 功能:设定下一个要存入数据的CGRAM的地址。 8.设定DDRAM地址指令 功能:设定下一个要存入数据的CGRAM的地址。 (注意这里我们送地址的时候应该是0x80+Address,这也是前面说到写地址命令的时候要加上0x80的原因) 9.读取忙信号或AC地址指令 功能: 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令; 当BF=0时,液晶显示器可以接收单片机送来的数据或指令; 读取地址计数器(AC)的内容。 10.数据写入DDRAM或CGRAM指令一览 功能: 将字符码写入DD
12、RAM,以使液晶显示屏显示出相对应的字符; 将使用者自己设计的图形存入CGRAM。 11.从CGRAM或DDRAM读出数据的指令一览 功能:读取DDRAM或CGRAM中的内容。 基本操作时序: 读状态 输入:RS=L,RW=H,E=H 输出:DB0DB7=状态字 写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 输出:无 读数据 输入:RS=H,RW=H,E=H 输出:DB0DB7=数据 写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0DB7=数据 输出:无 2.2.2.3、键盘设计方案与选择方案一:独立键盘。独立键盘为一端接地,另一端接I/O口,并且要接上拉电阻
13、。这种键盘的硬件都很容易实现,但每一个按键就要用一个I/O口,适合本次设计。方案二:通过PS2协义,用键盘同单片机相接,从而实现单片机与键盘通信。其电路如图所示。现在PC机广泛采用的PS/2接口为miniDIN 6引脚的连接器。1数据线(DATA);未用;3电源地(GND);4电源(+5 V);5时钟(CLK);6未用。由此图可知,使用键盘硬件结构比较简单,但键盘的体积太大,所以此系统不采用此方案。方案三:自制编码键盘。编码键盘的电路如图所示,这种键盘有编程简单,占用资源少,但其硬件比较复杂,要用很多的二极管,不是很理想。 方案四:4*4矩阵式键盘。其电路图如图所示,这种键盘的硬件简单,使用的
14、I/O口也不多,而且这种键盘的编程方法已很成熟。本次设计也可以采用这种矩阵式键盘。其电路图如图主体设计部分:(1)、系统模块图:(2)、算术运算程序流程图:(3)、系统总流程图:(4)、硬件设计:(一)、总体硬件设计:本设计选用AT89C51单片机为主控单元; 显示部分:采用LCD静态显示;按键部分:采用4*4键盘;用MM74C922为4*4键盘扫描IC,读取输入的键值。总体设计效果如下图:(二)、单片机接口电路说明:1、手动上电复位电路:当VCC上电时,C充电,在10K电阻上出现电压,使得单片机复位;几个毫秒后,C充满,10K电阻上电流降为0,电压也为0,使得单片机进入工作状态。工作期间,按
15、下S,C放电。S松手,C又充电,在10K电阻上出现电压,使得单片机复位。几个毫秒后,单片机进入工作状态。 2、内部时钟模式电路:当单片机工作于内部时钟模式的时候,只需在XTAL1和XTAL2引脚连接一个晶体振荡器或者陶瓷振荡器,并接两个电容后接地即可,在使用时对于电容的选择有一定的要求:当外接晶体振荡器的时候,电容值一般选择C1=C2=30+10pF或30-10pF;当外接陶瓷振荡器的时候,电容值一般选择C1=C2=40+10pF或40-10pF;3、 STC89C52介绍:STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵
16、巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗电路,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率3
17、5Mhz,6T/12T可选。和atmel的对比STC89C52RC单片机:8K字节程序存储空间;512字节数据存储空间;内带4K字节EEPROM存储空间;可直接使用串口下载;AT89S52单片机:8K字节程序存储空间;256字节数据存储空间;没有内带EEPROM存储空间; 4、 LCD1602介绍:1602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电
18、平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极602LCD的特性n+5V电压,对比度可调n内含复位电路n提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能n有80字节显示数据存储器DDRAMn内建有192个5X7点阵的字型的字符发生器CGROMn8个可由用户自定义的5X7的字符发生器CGRAM读的时候,先读左边那列,再读上面那行,如:感叹号!的ASCII为0x21,字母B的ASCI
19、I为0x42(前面加0x表示十六进制)1602通过D0D7的8位数据端传输数据和指令。显示模式设置: (初始化)0011 0000 0x38 设置162显示,57点阵,8位数据接口;显示开关及光标设置: (初始化)0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),N=0(读或写一个字符后地址指针减1 &光标减1),S=1 且 N=1 (当写一个字符后,整屏显示左移)s=0 当写一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)其
20、他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。(三)、键盘接口电路:计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。矩阵键盘的工作原理:计算器的键盘布局如图1所示:一般有16个键组成,在单片机中正好可以用一个P口实现
21、16个按键功能,这种形式在单片机系统中也最常用。图 1 矩阵键盘布局图矩阵键盘内部电路图如图2所示: (四)、LCD显示模块:本设计采用LCD液晶显示器来显示输出数据。通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。图5 LCD 模块(五)运算模块(单片机控制):MCS-51 单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O 口、串行口、定时器/计数器、中断系统及特殊功能寄
22、存器(SFR)。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!因此我们采用单片机作为计算器的主要功能部件,可以很快地实现运算功能。PCB设计:1、实验现象、数据记录数码显示及运算最多九位显示及运算当超出时溢出显示五、总结在实验中遇到了这样那样的问题,软件的编辑中使得c语言的应用更加熟练;在硬件的实现中又出现了软件和硬件不统一的问题,本实验我做了两次,第一次的时候STC89C52单片机的P2口的P2.0P2.7分别对应连接到LCD1602的D7D0口,这就使得在写程序的时候需要把所有读写
23、的数据以及地址都按位取反,改写程序比较复杂,最终调试失败,又改变了硬件电路。最终成功; 本次设计不管在软件,或是在硬件方面都让我受益匪浅,让我所学的知识得以应用到实践,经过这次创新性实验,也令我看到了很多的不足,在实验中的一些程序不能够及时编辑正确,需要很长时间的设计。硬件中我对单片机实验板上的很多硬件不是很清楚,使得在下载程序后,又进行了很长时间的调整。六、主要程序代码Key.C #include #define uchar unsigned char #define uint unsigned int #define KEYDATA P1 uchar key; uchar dis_buff
24、; void Delay1(uint x) uint i,j; for(i=0;ix;i+) for(j=0;j4)|0xf0); if(temp=1)key=0; else if(temp=2)key=1; else if(temp=4)key=2; else if(temp=8)key=3; else key=16; KEYDATA=0x0f; Delay1(1); temp=KEYDATA; temp=temp&0x0f; temp=(temp|0xf0); if(temp=1)key+=12; else if(temp=2)key+=8; else if(temp=4)key+=4;
25、else if(temp=8)key+=0; else key=16; if(key16) dis_buff=key; return dis_buff; uchar KeyDown(void) uchar keyFlag; uchar temp; KEYDATA=0xf0; if(KEYDATA!=0xf0) temp=KEYDATA; Delay1(200); if(temp=KEYDATA) keyFlag=1; else keyFlag=0; else keyFlag=0; return keyFlag; 1602. C #include #include #define uchar u
26、nsigned char #define uint unsigned int sbit rs=P25; sbit rw=P26; sbit e=P27; sbit bf=P07; void delay1ms(void) uchar i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; void delay(uchar n) uchar i; for(i=0;in;i+) delay1ms(); uchar BusyTest(void) bit result1; rs=0; rw=1; e=1; _nop_(); _nop_(); _nop_(); _nop_(); re
27、sult1=bf; e=0; return result1; void WriteCommand(uchar command) while(BusyTest()=1); rs=0; rw=0; e=0; _nop_(); _nop_();P0=command;_nop_();e=1;_nop_();e=0;void WriteAddress(uchar addr) WriteCommand(addr|0x80); void WriteData(uchar d)while(BusyTest()=1);rs=1;rw=0;e=0;_nop_();P0=d;e=1;_nop_();e=0;void
28、LcdInit(void)delay(15);WriteCommand(0x38);delay(5);WriteCommand(0x38);delay(5); WriteCommand(0x38);delay(5);WriteCommand(0x06);delay(5);WriteCommand(0x01);delay(5);WriteCommand(0x0c);delay(5);WriteCommand(0x0e);delay(5);Main.c#include#define uchar unsigned char#define uint unsigned intuchar position
29、=0x00;uchar string30;/存放输入的表达式uchar code warn=ERROR;uchar code num=q,7,4,1,0,8,5,2,=,9,6,3,s,k,c,j;uchar Curtime7=50,15,13,7,5,1,8;uchar opr15; /操作符int opt15; /操作数uchar iopt,iopr; /记录操作数和操作符数组的下标bit flag=0; /标记是否输入“(”操作符 循环嵌套long result=0; uchar pp; /记录表达式的字符位置bit equal=0; /标记是否开始计算int op=0;/用来记录合成的
30、数值bit normal=1;/用来记录是否正常,正常就进行运算,否则停止运算uchar operate;/用来标记操作数和操作符的堆栈bit equalFlag=0;/用来标记等号是否按下,按下之后为1相当于清屏uchar shift=0; /shift键 sbit m1=P37; sbit m2=P36;sbit m3=P35; /用来标识shift键是否按下,按下则灭uchar pzp=0;/用来保存修改状态下等号的位置uchar WriteAddress(uchar addr);uchar WriteData(uchar d);uchar WriteCommand(uchar comm
31、and);void LcdInit();uchar KeyDown(void);uchar KeyScan(void);void Init(void) int i; position=0x00; for(i=0;i30;i+) stringi=a; flag=0; pp=0; equal=0; normal=1; shift=0; opr0=0; iopt=0; iopr=0; pzp=0; op=0;void DisplayNumble(long numble) /显示结果,把结果转换为字符串形式在输出 uchar numx8=a,a,a,a,a,a,a,a; uchar i=1,j=0x4
32、2; LcdInit(); WriteCommand(0x0c);/关光标显示 WriteAddress(0x40);WriteData(=); if(numble0) numxi=numble%10; i+; numble=numble/10; i=i-1; while(numxi!=a) WriteAddress(j+); WriteData(numxi+0x30); i-; void DisplayError(void) /显示错误uchar i;i=0;normal=0;while(warni!=0)WriteAddress(0x40+i);WriteData(warni);i+;vo
33、id Calculate(void)/计算int m;switch(opriopr%10)case 0:flag=1;break;case 1:m=opt-iopt+opt-iopt;optiopt+=m;break;case 2:m=optiopt-2-optiopt-1;iopt=iopt-2;optiopt+=m; break;case 3:m=opt-iopt*opt-iopt;optiopt+=m;break;case 4:m=optiopt-2/optiopt-1;if(optiopt-1=0)DisplayError();elseiopt=iopt-2;optiopt+=m; b
34、reak; void InsertOpr(uchar operate)reentrantif(operate/10opriopr/10|operate=10)opr+iopr=operate;elseif(iopr!=0)Calculate();if(operate=15)iopr-;if(flag=0)InsertOpr(operate);elseflag=0; /用来使递归结束elseif(iopr=0)iopr+=1;opriopr=operate;uchar KeyChar(void)uchar ch; uchar n=KeyScan();if(shift!=2)switch(n) c
35、ase 0:if(shift=0)ch=q; /q表示清除else ch=w;break; /w表示修改case 12:shift=(shift+1)%3;ch=m;break;case 13:if(shift=0)ch=(;else ch=);break;case 14:if(shift=0)ch=*;else ch=/;break;case 15:if(shift=0)ch=+;else ch=-;break;default:ch=numn;break;else ch=t;return ch;void WriteNum(uchar num,uchar add) /显示数字WriteAddress(add);WriteData(num/10+0x30);Writ