单片机计算器(重理工大二课程设计)计算范围_第1页
单片机计算器(重理工大二课程设计)计算范围_第2页
单片机计算器(重理工大二课程设计)计算范围_第3页
单片机计算器(重理工大二课程设计)计算范围_第4页
单片机计算器(重理工大二课程设计)计算范围_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——单片机计算器(重理工大二课程设计)计算范围

课程:电子综合设计试验

项目:计算器

学期:2023.2~2023.7

学院:电子信息与自动化学院专业:自动化班级:713姓名:王瀚兴学号:10807010325指导教师:陈古波

电工电子技术试验中心

一、设计任务和目标

1.1设计任务

利用单片机设计一个计算器,要求

(1)键盘包含加、减、乘、除及数字键。

(2)能够显示输入数字并显示公式,计算结果。(3)四种运算都可以实现。

1.2性能指标

(1)单片机程序设计使用KeilC51实现。编译器使用longint,因此运算范围为±2147483648,并且浮点数精度总是15位。假使数据溢出,自动提醒溢出错误信息。

(2)可运算加、减、乘、除在内的四种运算。包括显示正数与负数。除零错误将自动提醒。显示公式。

(3)ON键用于清空并重新输入。

二、设计方案

依照单片机设计功能的要求,初步确定硬件系统由主控模块,显示模块,键扫描电路模块等组成。电路构成框图如图2-1所示。主控芯片使用51系列AT89C52单片机,该单片机采用高性能静态89C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能,低功耗8位CMOS处理芯片,市场应用好多。

图2-1计算器电路构成原理图

软件系统由键盘扫描模块、数据计算模块、数据纠错模块、数据显示模块等构成。

三、系统硬件设计

3.1单片机最小系统

单片机最小系统就是支持主芯片正常工作的最小部分,包括主控芯片和晶振电路部分。

主控芯片选取STC89C52RC芯片,因其具有良好的性能和稳定性,价格低廉使用便利。晶振选用1MHZ,晶振旁电容选用1pf。下面是单片机最小系统的电路图:

图3-1单片机最小系统电路图

3.2键盘接口电路

计算器所需按键有数字键:“0〞、“1〞、“2〞、“3〞、“4〞、“5〞、“6〞、“7〞、“8〞、“9〞。功能键:“+〞、“-〞、“×〞、“÷〞、“=〞、“ON(清零)〞。

共计16个按键,行列均连接有公共端,连接至单片机的P3.0—P3.7端口。这样扫描P3口就可以完成对所有键盘的扫描,通过对16个按键的编码,从而得到键盘端口地址。分别进行行扫描和列扫描,确定按键,经过单片机处理后输入数据至LED显示屏,完成了键盘的功能。

下面为键盘接口电路图。

图3-2键盘接口电路

3.3数码显示电路

数码显示电路采用的是LM016L显示器。基本参数及引脚功能

1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无区别,两者尺寸区别如下图10-54所示:

1602LCD尺寸图

1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最正确工作电压:5.0V字符尺寸:2.95×4.35(W×H)引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:

编符引脚说明编符引脚说明号号号号

1V9D2电源地数据

SS2V10D3电源正极数据

DD3V11D4液晶显示偏压数据

L4RS12D5数据/命令选择数据5R/13D6读/写选择数据

W6E14D7使能信号数据7D015BL背光源正极数据

A

8D116BL背光源负极数据

K

表10-13:引脚接口说明表第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影〞,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄放器选择,高电平日选择数据寄放器、低电平日选择指令寄放器。第5脚:R/W为读写信号线,高电平日进行读操作,低电平日进行写操作。当RS和R/W共同为低电平日可以写入指令或者显示地址,当RS为低电平R/W为高电平日可以读忙信号,当RS为高电平R/W为低电平日可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平日,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。2LCD的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:

RRDDDDDD序指令

D0

S/W7654321号

1000000001清显示200000001*光标返回

I/置输入模

30000000S

D式

显示开/关

40000001CB

控制光标或字

S

5000001/**符移位

/C

L

D置功能

600001N**

L

置字符发字符发生存贮器地址

70001

生存贮器地址

置数据存显示数据存贮器地址

8001

贮器地址

B读忙标志计数器地址

901

F或地址

写数到要写的数据内容

1

10CGRAM或

0

DDRAM)

从读出的数据内容

1

11CGRAM或

1

DDRAM读数表10-14:控制命令表

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

图字符代码与图形对应表下面为数码显示电路电路图。

图3-3数码显示电路

四、系统软件设计

4.1键盘扫描程序设计

要进行数据计算就需要先进行数据的输入,也就必需确定按键输入的数值是什么,这就需要对按键进行扫描,从而确定是哪个按键按下了。

按键扫描的程序代码十分明了易懂,并且写好了解释。下面是源代码。

//按键处理命令//获取按键位置//16为无按键按下ucharKeyPosRowScan()//返回行扫描结果

{

ucharTemp=0;//扫描状态暂存。ucharRow;//行号P3=0x0f;

Temp=P3;//暂存P2状态for(Row=0;Row9999||Data[3]

}}}

return7;

4-4程序显示功能设计。

LM016L显示器需要初始化,写端口等操作。voidWaitCheck()//等待空闲{

do{

P0=0xFF;

RS=0;//选择指令寄放器

RW=1;//读rsrw值为01时,忙标志和地址计数器读出EN=0;//E=0,阻止读写

Delay(1);//等待,液晶显示器处理数据EN=1;//E=1,允许读写

}while(BUSY==1);//判断是否为空闲,1为忙,0为空闲}

voidWriteCom(ucharcom)//写指令{

P0=com;RS=0;RW=0;EN=0;

WaitCheck();EN=1;}

然后需要进行初始化voidInit()//初始化{

EN=1;//使能信号为高电平WriteCom(0x38);//显示模式设置

WriteCom(0x0e);//显示开,光标开,不闪烁WriteCom(0x06);//光标右移文字移动无效WriteCom(0x80);//设置访问地址}

初始化完成后我写了几个基本的命令,用来扩展对LCD屏幕更简单的显示。//设置命令

voidSetLine1Pos(ucharpos)//设置光标位置{

WriteCom(0x80|pos);}

voidSetLine2Pos(ucharpos)//设置光标位置

{

WriteCom(0xC0|pos);}

voidSetCursorStyle(ucharstyle)//0光标左移1光标右移{

if(style)WriteCom(0x04);//光标左移elseWriteCom(0x06);//光标右移}

//运算命令

uintAbs(intnumber){

if(number32767||number9999)bitnum=10000;elseif(number>999)bitnum=1000;elseif(number>99)bitnum=100;elseif(number>9)bitnum=10;elseif(number>=0)bitnum=1;//SetCursorStyle(1);

if(minusflag)ShowChar(0x2d);//显示负号while(bitnum>0){

bitbuf=number/bitnum;ShowBitNum(bitbuf);

number-=(bitbuf*bitnum);bitnum/=10;}}

voidShowFormula()//显示公式命令,用来显示公式{

SetLine1Pos(0);

ShowNumber(Data[0]);switch(Data[1]){

case10:ShowChar('+');break;case11:ShowChar('-');break;case12:ShowChar('*');break;case13:ShowChar('/');break;}

ShowNumber(Data[2]);ShowChar('=');SetLine2Pos(0);

ShowStr(\ShowNumber(Data[3]);

}

if((Data[1]==13)}

4.4主程序设计

下面为主程序

主程序既把各个功能串联一起,又能够进行循环执行。

首先进行LCD的初始化,再进行欢迎词,在进行键盘扫描,根据ShowFlag变量的值进行显示错误提醒或者显示结果或者显示数值等。

voidmain(){

Init();

while(Welcome(10));while(1){

if(KeyPosScan()==12){

DataInit();

if(ShowFlag<3)ShowFlag=InputChar(//勿影响显示

if(ShowFlag<3)ShowFlag=InputChar(//结果和错误

}

RegisterShowFlag();}}

还有部分代码未贴出,整体程序清单见附录。

五、调试及分析1调试分析

做好器件后先不要把芯片插在芯片板上,先验证电源是否好用,有无短路等状况,接上低电源测试各个点无误后方可插上芯片。

芯片插好后进行测试各个硬件模块是否能够完成功能,包括按键是否好用,显示是否正常等。

2性能分析

(1)单片机程序设计由于使用的是KeilC51。为扩大运算范围,使用longint范围。假如数据溢出,自动提醒溢出错误信息。

(2)可运算加、减、乘、除在内的四种运算。包括显示正数与负数。除零错误将自动提醒等信息。

(3)可以显示运算的公式。

六、心得体会

通过本次课程设计我真正的完成了自己设计计算器的目标,了解了从设计硬件,电路设计,电路板设计,软件设计,成品调试等各方面的过程,从而从整体学到了多方面的知识,为以后工作打下了一定的基本基础。

另外从本次试验中我也发现了自己有好多的不足,对知识了解的可能仍不够扎实,做事不够稳定等。相信同样的问题以后能够很好的解决,并能够把单片机做的更好。

七、

程序源代码

#include#include

#defineuintunsignedint#defineucharunsignedchar

sbitEN=P2^2;//定义引脚sbitRS=P2^0;sbitRW=P2^1;sbitBUSY=P0^7;sbitP13=P1^3;//键盘数据

ucharLineScan[4]={0xE0,0xD0,0xB0,0x70};//列线扫描电压,分为第1,2,3,4根列线ucharRowScan[4]={0x0E,0x0D,0x0B,0x07};//行线扫描电压,分为第1,2,3,4根行线//计算类定义

ucharShowFlag=9;//0显示Data[0]1正常允许进行下一步2显示Data[2]3显示Data[3]4显示溢出错误5显示除零错误6显示错误7初始化程序8操作错误9提醒按初始化

键99无法预计错误

ucharDivFloatFlag=0;//是否显示除法所得的float数据//该变量设置取消ucharDivFloatData[15]={0};ucharFloatShowNum=0;

longintData[4]={0,10,0,0};//记录运算数据及结果//系统端口操作函数voidDelay(uinto){uinti,j;for(i=0;i2147483647||number=0;bitbuf--){ShowBitNum(idnumbuf[bitbuf]);}return0;}

voidShowFormula(){SetLine1Pos(0);ShowNumber(Data[0]);switch(Data[1]){case10:ShowChar('+');break;case11:ShowChar('-');break;case12:ShowChar('*');break;case13:ShowChar('/');break;

}ShowNumber(Data[2]);ShowChar('=');SetLine2Pos(0);ShowNumber(Data[3]);if(Data[1]==13){ShowChar('.');for(FloatShowNum=0;FloatShowNumucharKeyPosScan()//返回按键位置{returnKeyPosRowScan()*4+KeyPosLineScan();}

//返回指定位置按键的键值

ucharGetPosKeyID(ucharkeypos){switch(keypos)

温馨提示

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

评论

0/150

提交评论