单片机课程设计计算器.docx

上传人:b****6 文档编号:8606084 上传时间:2023-02-01 格式:DOCX 页数:21 大小:468.86KB
下载 相关 举报
单片机课程设计计算器.docx_第1页
第1页 / 共21页
单片机课程设计计算器.docx_第2页
第2页 / 共21页
单片机课程设计计算器.docx_第3页
第3页 / 共21页
单片机课程设计计算器.docx_第4页
第4页 / 共21页
单片机课程设计计算器.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

单片机课程设计计算器.docx

《单片机课程设计计算器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计计算器.docx(21页珍藏版)》请在冰豆网上搜索。

单片机课程设计计算器.docx

单片机课程设计计算器

 

 

课程设计说明书

课程设计名称:

单片机课程设计

课程设计题目:

四位数加法计算器的设计

学院名称:

电气信息学院

专业班级:

学生学号:

学生姓名:

学生成绩:

指导教师:

课程设计时间:

 

格式说明(打印版格式,手写版不做要求)

(1)任务书三项的内容用小四号宋体,倍行距。

(2)目录(黑体,四号,居中,中间空四格),内容自动生成,宋体小四号。

(3)章的标题用四号黑体加粗(居中排)。

(4)章以下的标题用小四号宋体加粗(顶格排)。

(5)正文用小四号宋体,倍行距;段落两端对齐,每个段落首行缩进两个字。

(6)图和表中文字用五号宋体,图名和表名分别置于图的下方和表的上方,用五号宋体(居中排)。

(7)页眉中的文字采用五号宋体,居中排。

页眉统一为:

武汉工程大学本科课程设计。

(8)页码:

封面、扉页不占页码;目录采用希腊字母Ⅰ、Ⅱ、Ⅲ…排列,正文采用阿拉伯数字1、2、3…排列;页码位于页脚,居中位置。

(9)标题编号应统一,如:

第一章,1,,……;论文中的表、图和公式按章编号,如:

表、表……;图、图……;公式()、公式()。

 

课程设计任务书

一、课程设计的任务和基本要求

(一)设计任务(从“单片机课程设计题目”汇总文档中任选1题,根据所选课题的具体设计要求来填写此栏)

1.系统通过4x4的矩阵键盘输入数字及运算符。

2.可以进行4位十进制数以内的加法运算,如果计算结果超过4位十进制数,则屏幕显示E。

3.可以进行加法以外的计算(乘、除、减)。

4.创新部分:

使用LCD1602液晶显示屏进行显示,有开机欢迎界面,计算数据与结果分两行显示,支持小数运算。

(二)基本要求

1.有硬件结构图、电路图及文字说明;

2.有程序设计的分析、思路说明;

3.有程序流程框图、程序代码及注释说明;

4.完成系统调试(硬件系统可以借助实验装置实现,也可在Proteus软件中仿真模拟);

5.有程序运行结果的截屏图片。

二、进度安排

 

第9周,~

1)题目分析,文献查阅

2)方案比较,确定设计方案

3)~硬件电路设计

4)~程序设计,程序调试,系统联调,系统改进

5)课程设计说明书撰写

 

三、参考资料或参考文献

1.,.单片机原理及应用——基于Proteus和KeilC[M].北京:

电子工业出版社,2013

2.,.单片机原理与应用设计[M].北京:

电子工业出版社,2008

3.马忠梅.单片机的C语言应用程序设计(第5版)[M].北京:

北京航空航天大学出版社,2013

4.楼然苗、李光飞.51系列单片机设计实例[M].北京:

北京航空航天大学出版社,2003

 

本科生课程设计成绩评定表

姓名

专业班级

学号

课程设计题目:

课程设计答辩记录:

(手写)

成绩评定依据:

项目

得分

比例

考勤记录

设计结果

报告撰写

答辩成绩

备注:

成绩评定依据的项目内容和项目分值比例可以由老师按指导的专业进行调整,但成绩评定依据的项目数不得少于3项。

最终评定成绩:

 

指导教师签名:

年月日

第一章设计论证

设计分析

在方案设计过程中,我列出了两种不同的设计方案,分别对应于显示模块和单片机内部运算。

显示模块在我的设计中有两种不同的显示方式,分别为数码管显示以及液晶屏显示。

对于数码管显示来说,优点是使用简单,反应速度更快,由于LCD有众多的接口,以及指令,因此在软件上要比数码管复杂。

数码管显示的缺点也比较明显,就是需要占用过多的单片机输出接口,同时,LCD的显示功能更多,也更直观,对于现实生活中的使用也更加舒适。

在综合了以上几点的考虑后,我最终选择了LCD1602液晶显示芯片作为显示模块。

在单片机内部运算方面,我的设想也有两种,即支持浮点数运算或只支持整数运算,若只支持整数运算,程序设计势必更加简单易懂,但是出于实用性的考虑,我最终决定了使计算器支持浮点数运算功能。

同时,这也能更好地锻炼我的编程思维能力。

设计方案

按照系统设计的功能的要求,初步确定设计系统由主控模块、显示模块、键盘扫描接口电路共四个模块组成。

主控芯片使用8051系列的AT89C52单片机,其中带有非易失性Flash程序存储器,它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。

显示模块采用LCD1602液晶显示器为主体构成。

键盘电路采用4x4矩阵键盘电路。

整个单片机的接口电路:

P0用于显示输出或LCD1602信号输入,P1口用于键盘扫描输入,P2口用于LCD1602的控制信号输出。

为了驱动系统的各个模块正常协调工作,在软件方面我设计了四大模块,分别为显示、键盘、运算、综合模块,通过综合模块的协调来使其它三大模块正常运行,使计算器能正确运算得出正确结果。

 

第二章硬件设计

硬件结构与工作原理

AT89C52

显示模块(LCD1602)

键盘扫描输入模块(4*4矩阵键盘)

图硬件结构框图

系统的主体部分由输入、运算、输出模块所组成,对应于图中有,输入模块为键盘扫描输入,输出模块为LCD1602显示,运算模块为单片机。

在系统上电后,单片机初始化,开始运行内部程序,在程序运行过程中,通过软件功能来实现按下键盘上特定按键后,执行不同的功能,例如加减乘除,并将数据输出至显示模块(LCD1602)显示。

在运算过程中显示运算数据及符号,运算完成后显示运算结果。

单元电路设计

单片机最小系统

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

主控芯片选取AT89C52芯片,因其具有良好的性能及稳定性,价格便宜应用方便。

晶振选取,晶振旁电容选取20pF。

采用按键复位电路,电阻分别选取100Ω和10K,电容选取10μF。

以下为单片机最小系统硬件电路原理图(图),仿真接线图(图)。

图单片机最小系统硬件电路原理图

图单片机最小系统仿真接线图

键盘接口电路

计算器所需按键有:

数字键:

’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’。

功能键:

’+’,’-‘,’*’,’/’,’=’,’C(清零、小数点)’共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接~,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。

在Proteus仿真中,我直接使用元件库所有的KEYPAD-SMALLCALC键盘,这种键盘直接实现了4*4键盘的功能,方便使用。

如下图所示。

在按下其中一个键时,其对应的行与列将都会变成低电平,此时,即可通过判断P1口的值来确定输入的是哪一个按键,然后将所取得的按键通过软件来进行接下来的处理、运算等工作。

图4*4矩阵键盘

LCD1602显示电路

LCD1602简介:

如图所示,1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

1602采用标准的16脚接口,其中:

第1引脚:

GND为电源地

第2引脚:

VCC接5V电源正极

第3引脚:

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

第4引脚:

RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5引脚:

RW为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作。

第6引脚:

E(或EN)端为使能(enable)端,高电平

(1)时读取信息,负跳变时执行指令。

第7~14引脚:

D0~D7为8位双向数据端。

第15~16脚:

空脚或背灯电源。

第15引脚背光正极,第16引脚背光负极。

特性

或5V工作电压,对比度可调

内含复位电路

提供各种控制命令,如:

清屏、字符闪烁、光标闪烁、显示移位等多种功能

有80字节显示数据存储器DDRAM

内建有192个5X7点阵的字型的字符发生器CGROM

8个可由用户自定义的5X7的字符发生器CGRAM

特征应用

微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。

操作控制

注:

关于E=H脉冲——开始时初始化E为0,然后置E为1。

图LCD1602硬件原理图

采用LCD1602显示器对计算过程、结果以及提示信息进行显示,在仿真电路中,由于Proteus中并没有LCD1602显示芯片,故采用功能相似的LM016L进行替代,其中LM016L的D0~D7三个输入输出端口接至单片机的~口,用来对显示屏输出显示、输出控制指令以及获取状态信息。

单片机的~分别与LM016L的RS、RW、E端口相连,用来对显示芯片进行控制。

以下为LCD显示电路的仿真接线图(图)。

图LCD1602(LM016L)仿真接线图

 

第三章软件设计

系统软件结构

如图所示,系统启动后,执行LCD初始化程序,然后调用LCD显示程序,在屏幕上输出欢迎信息。

接下来调用键盘扫描处理程序,等待按键按下,按下任意键后执行LCD清屏程序,并再次调用键盘扫描处理程序,等待用户输入数据,若用户按下数字键(0~9),则在显示器上显示并且将输入数据保存至数据存储区。

Y

 

 

 

 

 

 

图程序流程图

本次设计采用模块化设计思想,包括主程序和初始化子程序、延时子程序、输出数据子程序、检测是否有按键按下子程序、确定按键子程序、清第一行屏与显示“Welcome”子程序、换算第一个数子程序、运算子程序、显示结果子程序等子程序。

运行程序后,首先调用子程序清屏第一行并显示“Welcome”,清屏第二行并显示“ZCY’sCaculator!

”,然后检测是否有按键按下,如果没有,继续检测,如果按下,则判断是否是加减乘除键被按下,如果是加减乘除被按下,则显示相应的字符并换算出字符前输入的数据和字符后输入的数字,然后检测是否有等号按下,如果有则完成相应的运算并显示相应的结果,然后检测是否有清屏键按下,如果有则清屏,相应的流程图如图所示。

对于数字键的程序段进行相应的设计,如果运算键(+、-,*,/)相应标志不为一,则将输入的数字送入第一个操作数缓存区,并且清空所有响应位。

否则送入第二个操作数缓存区。

其次对功能键的程序段进行相应的设计。

如果功能键(+、-,*,/)第一次被按下,则置相应的标志位为一,并且将运算键响应标志位置一,清空第二个操作数的缓存区,为输入操作数做准备,如果是第二次按下则先调用运算操作子程序,执行上次按下的运算键的运算,置相应的标志位为一,并且将运算键响应标志位置一,清空第二个操作数的缓存区,为输入操作数做准备。

程序上的具体实现:

在单片机上电后,执行两个函数LCD_dsp_string(4,0,"Welcome!

")以及LCD_dsp_string(1,1,"ZCY'sCaculator")输出欢迎信息初始化LCD。

然后执行keyscan()函数判断是否有按键输入,若有则读取按键,否则循环扫描,直到有按键按下。

在获取按键后,判断按键是否为数字,若是,则执行cacul(a)函数,将获取的数字保存为数,然后执行LCD单个字符显示函数LCD_dsp_char(x,y,dat)。

若按键不是数字,则判断是否为操作符,若是,则执行LCD_dsp_char(x,y,dat)显示操作符,然后将flag标志位置1,代表第一个操作数输入结束。

若不是操作符,则判断是否为‘=’,若是,则执行函数Caculator(x,y)函数,计算结果,然后执行LCD_dsp_string(x,y,string)函数,将计算结果显示在屏幕上,然后执行keyscan()函数,等待按下任意键,按下任意键后,再次执行LCD初始化程序。

若不是‘=’,则判断是否是第一次按下清零键,若是,则显示小数点,并再次调用keyscan()函数,获取下一个按键,若不是第一次按下,则再次执行LCD初始化程序。

 

主要功能子程序设计

开始

LCD显示子程序

 

Y

 

N

 

YN

 

 

图LCD显示子程序流程图

如图所示,当主程序调用了LCD显示程序后,首先判断LCD是否处于忙碌状态,若是,则等待,若不是,则开始设置显示位置,然后判断显示的是单个字符还是字符串,分别实现对单个字符的输出以及对字符串的输出。

之所以对单字符和字符串设置不同的显示函数,是为了实现程序对单片机资源的最优利用,因为单字符只占据一个字节的存储区,而字符串则至少占用两个字节。

在显示完成后,返回主程序,继续执行下一步。

LCD的显示程序中主要的部份为LCD显示位置的设置以及LCD显示数据的输出。

为此,我编写了LCD显示位置设置函数,以及LCD显示函数,如下。

LCD显示位置设置函数:

1.voidLCD_set_xy(unsignedcharx,unsignedchary)

#include<>

#include<>

#include<>

unsignedcharn;

floatidataa,b;;

xsd=1;

#include<>

sbitlcden=P2^7;//读写控制输入端

sbitrw=P2^6;//读写控制端

sbitrs=P2^5;//指令、数据选择端

sbitbusy=P0^7;//LCD内部忙标志

voiddelay(unsignedintm)//延时函数

{

unsignedintn;

for(n=0;n<=m;n++);

}

voidcheck()//判断LCD是否忙碌

{

do

{

P0=0xff;

rs=0;

rw=1;

lcden=0;

delay(100);

lcden=1;

}while(busy==1);//当busy=1,即LCD忙时,等待

}

voidwrite_com(unsignedcharcom)//写显示命令

{

P0=com;

rs=0;

rw=0;

lcden=0;

check();

lcden=1;

}

voidwrite_data(unsignedchardate)//写显示数据

{

P0=date;

rs=1;

rw=0;

lcden=0;

check();

lcden=1;

}

voidinit()//初始化LCD

{

write_com(0x38);//16x2行显示,5x7点阵,8位数据接口

write_com(0x0c);//开显示,光标不显示、不闪烁

write_com(0x06);//光标自增,画面不动

write_com(0x80);//选择第一行

write_com(0x01);//清屏

}

voidLCD_set_xy(unsignedcharx,unsignedchary)//设置LCD显示的位置

{

unsignedcharaddress;

if(y==0)//y=0为第一行

address=0x80+x;//x=0为一行的第一个

else//第二行

address=0xc0+x;

write_com(address);//设置数据指针位置

}

voidLCD_dsp_char(unsignedx,unsignedchary,unsignedchardat)

//单个字符显示函数

{

LCD_set_xy(x,y);//设置显示位置

write_data(dat);//写入待显示数据

}

voidLCD_dsp_string(unsignedcharX,unsignedcharY,unsignedchar*s)

//字符串显示函数

{

LCD_set_xy(X,Y);

while(*s)//当字符串未到达结尾('\0')时,循环输出单个字符

{

write_data(*s);

s++;//指向下一个字符

}

}

3.

#include<>

externvoiddelay(intms);//外部延时函数声明

externunsignedcharn;//外部变量声明

voidkey_scan(void)

{

unsignedchartemp;

P1=0xfe;

if(P1!

=0xfe)

{

delay(200);

if(P1!

=0xfe)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

n='c';break;

case0xd0:

n='0';break;

case0xb0:

n='=';break;

case0x70:

n='+';break;

}

}

while(P1!

=0xfe);

}

else

{

P1=0xfd;

if(P1!

=0xfd)

{

delay(200);

if(P1!

=0xfd)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

n='1';break;

case0xd0:

n='2';break;

case0xb0:

n='3';break;

case0x70:

n='-';break;

}

}

while(P1!

=0xfd);

}

else{

P1=0xfb;

if(P1!

=0xfb)

{

delay(200);

if(P1!

=0xfb)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

n='4';break;

case0xd0:

n='5';break;

case0xb0:

n='6';break;

case0x70:

n='*';break;

}

}

while(P1!

=0xfb);

}

else{

P1=0xf7;

if(P1!

=0xf7)

{

delay(200);

if(P1!

=0xf7)

{

temp=P1&0xf0;

switch(temp)

{

case0xe0:

n='7';break;

case0xd0:

n='8';break;

case0xb0:

n='9';break;

case0x70:

n='/';break;

}

}

while(P1!

=0xf7);

}

elsen=17;

}}}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1