基于STC89C52的简易计算器设计.doc

上传人:精*** 文档编号:1129624 上传时间:2024-09-05 格式:DOC 页数:15 大小:200.14KB
下载 相关 举报
基于STC89C52的简易计算器设计.doc_第1页
第1页 / 共15页
基于STC89C52的简易计算器设计.doc_第2页
第2页 / 共15页
基于STC89C52的简易计算器设计.doc_第3页
第3页 / 共15页
基于STC89C52的简易计算器设计.doc_第4页
第4页 / 共15页
基于STC89C52的简易计算器设计.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、目录目 录1.引言1 1.1 设计意义1 1.2 设计任务和主要内容12. 硬件设计1 2.1 系统框图1 2.2 最小系统2 2.3 矩阵键盘3 2.4 LCD160233. 软件设计5 3.1矩阵键盘扫描原理5 3.2 LCD1602的软件设计6 3.3 主程序设计7 3.4 源程序8 3.5 调试结果84. 设计小结9参考文献9附录1014福建电力职业技术学院 课程设计-智能仪器1.引言随着社会的发展,人们生活水平的提高,单片机的应用越来越贴近生活了,人们常用单片机来实现一些简单的电子设计。计算器在人们的日常生活中是不可或缺的电子产品之一,目前市场上的计算器基本可以满足我们的日常需求,但

2、它还在发展之中,我们要继续研究出更加强大的计算器。基于这样的理念,本设计采用单片机来设计简易计算器。本设计是以STC89C52为单片机,LCD为显示器设计的简易计算器,所设计的计算器将完成两位数的加、减、乘、除等功能。1.1 设计意义通过本次课程设计,进一步掌握单片机知识,知道AT89S52单片机的原理、编程和各种功能的应用,了解简易计算器的工作原理,初步掌握计算器的硬软件设计、编写、调试和仿真,充分提高动手能力和排除故障的能力,同时通过课程设计加深我们对单片机的认识和兴趣,发挥我们的创新能力和动手能力。1.2 设计任务和主要内容本设计要制作的就是单片机于生活中最为常见的一种应用简易计算器,以

3、STC89C52单片机作为核心来进行的数字计算器模拟系统设计,可以完成计算器的键盘输入,进行加、减、乘、除两位数范围内的基本四则运算,并在LCD上显示相应的结果。设计电路采用AT89C51单片机为主要控制电路,显示采用LCD静态显示,软件方面使用C语言编程,并用PROTUES仿真。 查阅相关文献资料,了解简易计算器程序的原理,能够运用C 语言进行简易计算器的设计与制作。 设计基于C 语言的计算器的控制系统硬件部分,画出控制系统硬件框图,设计简易计算器的控制系统的软件部分,首先根据简易计算器所需的具体功能设计好程序流程图,包括控制流程图、控制时序图、梯形图程序设计;根据设计的程序流程图写出代码,

4、并进行代码编译的调试。 把设计好的软件代码烧入硬件中,然后进行总体调试,直至原先预定要实现的功能完全实现为止。 设计出系统方框图、单元图、原理总图;画出控制程序流程图,以及编写完整的程序 2. 硬件设计2.1 系统框图本文所设计的简易计算器显示系统由STC89C52单片机及其最小系统、LCD1602液晶显示和矩阵键盘等部分组成。其系统框图如图2.1所示。图2.1 简易计算器系统框图2.2 最小系统单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。如图2.2为单片机的最小系统。 图2.2 ST

5、C89C52最小系统STC89C52 单片机概述:STC89C52是一个低功耗,高性能CMOS 8位单片机,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。STC89C52具有如下特点:40个引脚,8k的flash存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(IO)口,5 个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。2.3 矩阵键盘键盘是单片机系统中最常用的人机对话输入设备,用户通过键盘向单片机输入数据或指令。目前市场上键盘有独立键盘和矩阵键盘,

6、经过多方考量,本设计采用矩阵键盘。在键盘中按键数量较多时,为了减少IO口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成4*4=16个按键,比直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。所以,在需要的键数比较多时,采用矩阵法来做键盘较为合理。2.3.1 独立键盘与矩阵键盘的区别计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会比较简单,但是会占用大量的IO口资源,因此在很多情况下都不采用这种方式。矩阵键盘扫描程序的优点在于,不用专门的按键延时程序,提高了

7、CPU效率,也不用中断来扫描键盘,节省了硬件资源。此外,本键盘扫描程序每次扫描占用CPU时最短,不论有键按下或者无键按下都可以在很短的时间完成一次扫描。2.3.2 矩阵键盘与单片机的接口电路下图为矩阵键盘与单片机的接口电路图,由图可知,当无按键闭合时, P10P13与P14P17之间开路;当有键闭合时,与闭合键相连的两条IO口线之间短路。 图2.3 矩阵键盘接口电路2.4 LCD16022.4.1 LCD1602液晶简介本设计使用LCD1602液晶显示器来显示。液晶是介于固态和液态间的有机化合物,将其加热会变成透明液态,冷却后变成结晶的混作固态。在点击的作用下,产生冷热变化,从而影响它的透光性

8、,来达到显示的目的。1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,它有若干个5*7或者5*11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用,所以它不能显示图形 。LCD1602液晶显示器具有以下几个优点:低压、微功耗、显示信息量大、寿命长、无辐射、无污染。2.4.2 LCD1602与单片机的接口电路1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式设置和数据显示等。本设计采用的是LCD1602液晶模块,是标准的16针插座,接口电

9、路如下图所示: 图2.4 LCD1602接口电路知道接口图后,还要了解每个引脚接口的说明,引脚接口说明如下表所示: 编号 符号 引脚说明编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极表2.4 引脚接口说明表3.软件设计3.1矩阵键盘扫描原理如图2.3所示,初始化时,将P1.4置为低电平,通过与0x0f

10、 相与来判断所按下的键,此次为扫描位于P1.4那一行的键,若相与结果为0x0e时说明P1.0所检测出的为低电平,闭合的键应为P1.4行与P1.0列的交叉处的键。若相与结果为0x0d则P1.1所检测为低电平,闭合的键应为P1.4行与P1.1列的交叉处的键。若相与结果为0x0b则P1.2所检测为低电平,闭合的键应为P1.4行与P1.2列的交叉处的键。若相与结果为0x07则P1.3所检测为低电平,闭合的键应为P1.4行与P1.3列的交叉处的键。要把16个键盘全部扫描完需要进行4次这样的逐行扫描,所用方法相同程序类似分别另P1.5,P1.6,P1.7为低电平执行相同操作。判断有无按键按下的方法:第一步

11、,置列线P14P17为输入状态,从行线P10P13输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。第二步,行线轮流输出低电平,从列线P14P17读入数据,若有某一列为低电平,则对应行线上有键按下。综合一二两步的结果,可确定按键编号。但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。 图2.3 矩阵键盘接口电路3.2 LCD1602的软件设计3.2.1 LCD1602的指令说明1602液晶模块内部的控制器共有11条控制指令,如表3.2所示。 表 3.2控制命令表序号指令RSR/WD7D6D5D4D3D2

12、D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容如上表所示,1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(1为高电平、0为低电平) 3.2.2 LCD1602的时序图LCD1602与HD4

13、4780相兼容的芯片时序表如下:表3.3基本操作时序表读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出无读写操作时序图如下: 图3.2 读操作时序图 图3.3 写操作时序图3.3 主程序设计在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计,编程和调试,然后组合起来。这种方法便于设计和调试,容易

14、实现多个程序共存,但各个模块之间的连接有一定的难度根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计, 然后再制作各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。程序流程图如图3.3 图3.4主程序流程图3.4 源程序见附录3.5 调试结果在查找了相关书籍后编写出程序,并根据程序焊接所需要的元器件,将各类元器件及管脚座焊接完毕后,插入单片机、LCD显示屏、矩阵键盘等各类芯片。随后进行功能验证。加、减、乘、除运算和LCD液晶显示。1)上电后,屏幕初始化。 2)计算。按下数字键,屏幕显示按

15、下的数字,再按下加、减、乘、除符号键,然后再按下数字键,最后按下“”号键,屏幕即显示出计算结果。本次计算器可实现两位数间的计算。 3)如果要再次计算,可以按下清零键清零,或者按下单片机的复位键,重新初始化。经过以上步骤验证可知,实验目标功能基本实现,设计成功。4. 设计小结为期3周的课程设计在紧锣密鼓的实验中接近尾声了,这次的课题是基于STC89C52的简易计算器设计,本设计采用了STC89C52芯片,基本上实现了利用单片机进行了一个 简单的计算器设计,允许对输入数据进行加、减、乘、除运算以及液晶 1602 进行显示。 在实验前我们组先是在网上和图书馆找了一些前辈所设计的计算器方案进行学习参考

16、,一开始认为简易计算器制作起来结构相对简单,涉及的知识也有文献可查询,除了程序繁琐一些,其他都还好。但在实际制作过程中并不是这么简单,我们遇到了许多问题,不仅仅是专业知识上的问题,还存在组员之间的意见不同等。最后在老师的指导和组员之间的磨合,都克服了困难,完成了设计。总的来说,一次课程设计我们不仅将专业知识融会贯通,还提高了动手能力和分工合作,通过课程设计,我们对单片机的认识也有所提升。参考文献1徐志保,基于工程导向的单片机实战教程.20112郭天祥,新概念51单片机c语言教程.北京:电子工业出版社,20093马忠梅,单片机的C语言应用程序设计.北京:北京航空航天大学出版社,19974张毅刚,

17、单片机原理及应用.北京,高等教育出版社,20085谭浩强,C程序设计(第二版)M.北京:清华大学出版社,20036余锡存,曹国华,单片机原理及接口技术.西安:西安电子科技大学出版社,2000附录#include#include #include#include #include #define uchar unsigned char#define uint unsigned intuchar key,sym,sumsz13,adders=0; /定义变量float sum,number1=0,number2=0; /定义变量bit flag=0; / 定义位变量标志位sbit lcdrs=P2

18、0; / 定义液晶的读IO口sbit lcdwr=P21; / 定义液晶的写IO口sbit lcden=P22; / 定义液晶的使能IO口uchar lcd_s=0,1,2,3,4,5,6,7,8,9,+,-,*,0xfd,.,=;/uchar curpos=0xc0;void keyscan(); / 函数声明void delayms(uchar z); void write_com(uchar com);void write_data(uchar dat);void init(); void delay(int z); bit buzz();void yuans();void clear(

19、);/*主函数*/void main() init(); /液晶初始化while(1) /循环函数 write_com(0x80);write_data( );write_data( );write_data( );write_data(C);write_data(a);write_data(l);write_data(c);write_data(u);write_data(l);write_data(a);write_data(t);write_data(e);write_data(r); keyscan(); /调用键盘扫描函数 /*键盘扫面*/void keyscan() uchar t

20、emp=0; P1=0xfe; /第1次判断函数 temp=P1; temp=temp&0xf0; if(temp!=0xf0) delayms(15); temp=P1; temp=temp&0xf0; if(temp!=0xf0) temp=P1; adders+;/确定按键按下,执行if函数 switch(temp) case 0xee: key=1;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key;break;/显示字符

21、1,并记入相加的变量 case 0xde: key=2;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key;break;/显示字符2,并记入相加的变量 case 0xbe: key=3;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key;break;/显示字符3,并记

22、入相加的变量 case 0x7e: key=10;write_com(curpos);curpos+;write_data(lcd_skey);sym=+;flag=1; break;/显示+号,并将sym付+ while(P1&0xf0)!=0xf0);/等待按键释放 P1=0xfd; /第2次判断 temp=P1; temp=temp&0xf0; if(temp!=0xf0) delayms(15); temp=P1; temp=temp&0xf0; if(temp!=0xf0) temp=P1;adders+;/确定按键按下,执行if函数 switch(temp) case 0xed:

23、key=4;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key; break;/显示字符4,并记入相加的变量 case 0xdd: key=5;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key; break;/显示字符5,并记入相加的变量 case 0xbd: ke

24、y=6;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key;break; /显示字符6,并记入相加的变量 case 0x7d: key=11;write_com(curpos);curpos+;write_data(lcd_skey);sym=-;flag=1; break;/显示-号,并将sym付- while(P1&0xf0)!=0xf0); P1=0xfb; /第3次判断 temp=P1; temp=temp&0xf0; i

25、f(temp!=0xf0) delayms(15); temp=P1; temp=temp&0xf0; if(temp!=0xf0) temp=P1;adders+; /确定按键按下,执行if函数 switch(temp) case 0xeb: key=7;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key; break;/显示字符7,并记入相加的变量 case 0xdb: key=8;write_com(curpos);curp

26、os+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key; break;/显示字符8,并记入相加的变量 case 0xbb: key=9;write_com(curpos);curpos+;write_data(lcd_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key;break; /显示字符9,并记入相加的变量 case 0x7b: key=12;write_com(curpos);curpo

27、s+;write_data(lcd_skey);sym=*;flag=1; break;/显示*号,并将sym付* while(P1&0xf0)!=0xf0); /等待按键释放 P1=0xf7;/ 第4次判断 temp=P1; temp=temp&0xf0; if(temp!=0xf0) delayms(15); temp=P1; temp=temp&0xf0; if(temp!=0xf0)temp=P1;adders+; /确定按键按下,执行if函数 switch(temp) case 0xe7: key=0; write_com(curpos);curpos+;write_data(lcd

28、_skey);if(flag=0)number1=number1*10+key; else number2=number2*10+key; break;/显示字符0,并记入相加的变量case 0xd7: key=14;clear(); break;/调用清零函数 case 0xb7: key=15;yuans();flag=1;adders-;break;/调用运算函数 case 0x77: key=13;write_com(curpos);curpos+;write_data(lcd_skey);sym=/;flag=1; break;/显示/号,并将sym付/ while(P1&0xf0)

29、!=0xf0); /等待按键释放 /*液晶*/void write_com(uchar com) /液晶写指令程序while(buzz() ; lcdrs=0; / lcdwr=0; / lcden=0; P0=com; / _nop_(); _nop_(); _nop_(); _nop_(); lcden=1; / _nop_(); _nop_(); _nop_(); _nop_(); lcden=0; /void write_data(uchar dat) /液晶写数据程序 while(buzz(); lcdrs = 1; lcdwr = 0; lcden = 0; P0 = dat; _

30、nop_(); _nop_(); _nop_(); _nop_(); lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); lcden = 0; void init() / 液晶初始化程序 lcden=0; / write_com(0x38); / write_com(0x0c); / write_com(0x06); / write_com(0x01); / bit buzz()/液晶测忙程序 bit b; lcdwr=1; / lcdrs=0; / lcden=1; _nop_(); _nop_(); _nop_(); _nop_(); b=(bit

31、)(P&0x80); lcden=0; return b; void delay(int z) / 延时子程序 int i;while(z-) for(i = 0; i0;i-) for(j=110;j0;j-);/*运算*/*清零函数*/void clear() /清零程序 uchar i; for(i=0;i16;i+)/对液晶写入空格 write_com(0x80+i); write_data( ); for(i=0;i15;i+) write_com(0x80+0x40+i); write_data( ); write_data(0); write_com(0x80); curpos=

32、0xc0; flag=0; number1=0;number2=0;adders=0; /将数据变量清零/*运算程序*/void yuans() /运算函数 uchar i,j,temp1; switch(sym) case +:number1+=number2;break; /两数相加 case -:number1-=number2;break; /两数相减 case *:number1*=number2;break; /两数相乘 case /:number1/=number2;break; /两数相除 sprintf(sumsz,%10.0f,number1); / j=strlen(sumsz); write_com(0x80+0x40+16-j); for(i=0;ij;i+) /显示结果 temp1=sumszi; write_data(temp1); delay(10); number2=0; write_com(0x80+adders-1); curpos=0xc0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922