单片机设计实验报告简单计算器的设计Word文档格式.docx

上传人:wj 文档编号:623340 上传时间:2023-04-29 格式:DOCX 页数:18 大小:264.69KB
下载 相关 举报
单片机设计实验报告简单计算器的设计Word文档格式.docx_第1页
第1页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第2页
第2页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第3页
第3页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第4页
第4页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第5页
第5页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第6页
第6页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第7页
第7页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第8页
第8页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第9页
第9页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第10页
第10页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第11页
第11页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第12页
第12页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第13页
第13页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第14页
第14页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第15页
第15页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第16页
第16页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第17页
第17页 / 共18页
单片机设计实验报告简单计算器的设计Word文档格式.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机设计实验报告简单计算器的设计Word文档格式.docx

《单片机设计实验报告简单计算器的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机设计实验报告简单计算器的设计Word文档格式.docx(18页珍藏版)》请在冰点文库上搜索。

单片机设计实验报告简单计算器的设计Word文档格式.docx

单片机主控模块、键盘模块、功率放大模块、闹铃模块、按键设置模块。

下面对各个模块的设计方案逐一进行论证分析。

2.硬件原理电路图的设计及分析

2.1主控模块

STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。

STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。

STC89C52单片机的基本组成框图见图2-1。

图2-1

2.1.1STC89C52单片机主要特性

1.一个8位的微处理器(CPU)。

2.片内数据存储器RAM(128B),用以存放可以读/写的数据,如运算的中间结果、最终结果以及欲显示的数据等,SST89系列单片机最多提供1K的RAM。

3.片内程序存储器ROM(4KB),用以存放程序、一些原始数据和表格。

4.四个8位并行I/O接口P0~P3,每个口既可以用作输入,也可以用作输出。

5.两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。

6.五个中断源的中断控制系统。

7.一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单机与微机之间的串行通信。

8.片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。

最高允许振荡频率为12MHz。

2.1.2STC89C52单片机管脚图

图2-289S52单片机管脚图

1.时钟电路引脚XTAL1和XTAL2:

2.控制信号引脚RST,ALE,PSEN和EA:

3.输入/输出端口P0/P1/P2/P3:

2.1.3STC89C52单片机的中断系统

STC89C52系列单片机的中断系统有5个中断源,2个优先级,可以实现二级中断服务嵌套。

由片内特殊功能寄存器中的中断允许寄存器IE控制CPU是否响应中断请求;

由中断优先级寄存器IP安排各中断源的优先级;

同一优先级内各中断同时提出中断请求时,由内部的查询逻辑确定其响应次序。

2.1.4STC89C52单片机的定时/计数器

在单片机应用系统中,常常会有定时控制需求,如定时输出、定时检测、定时扫描等;

也经常要对外部事件进行计数。

89C52单片机内集成有两个可编程的定时/计数器:

T0和T1,它们既可以工作于定时模式,也可以工作于外部事件计数模式,此外,T1还可以作为串行口的波特率发生器。

2.2.1矩阵键盘原理介绍

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。

这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。

行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。

2.2.2矩阵键盘电路设计

图2-3矩阵键盘硬件连接图

首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。

方法是:

向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。

如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。

判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。

依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;

如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。

2.3LCD液晶显示器简介

液晶是一种既具有液体的流动性又具有光学特性的有机化合物,它的透明程度和呈现的颜色受外加电场的影响,利用这特点便可做成字符显示器。

液晶显示器(LCD)英文全称为LiquidCrystalDisplay,它一种是采用了液晶控制透光度技术来实现色彩的显示器。

显示接口用来显示系统的状态,命令或采集的电压数据。

本系统显示部分用的是LCD液晶模块,采用一个16×

1的字符型液晶显示模块。

2.3.1液晶模块简介

LCD1602液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。

IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码, CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4. CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LCD1602液晶模块的引脚图如图2-4所示。

图2-4LCD1601引脚图

寄存器选择控制如表2-1。

表2-1寄存器选择控制

RS

R/W

操作说明

写入指令寄存器(清除屏等)

1

读busyflag(DB7),以及读取位址计数器(DB0~DB6)值

写入数据寄存器(显示各字型等)

从数据寄存器读取数据

2.3.2液晶显示部分与89S52的接口

如图2-5所示。

用89C51的P2口作为数据线,用P3.2、P3.1、P3.0分别作为LCD的E、R/W、RS。

其中E是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号本模块设计要点如下:

显示模块初始化:

首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×

7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。

向LCD的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。

图2-5LCD1602与STC89C52的接口

3系统软件设计

3.1系统软件流程图

图3-1软件流程图

18

3.2系统整体原理图

4.系统调试

4.1硬件调试

计算器的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。

在本计算器的设计调试中遇到了很多的问题。

回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

(1)程序调试初期液晶一直没有正常显示,总在第一行显示黑条。

解决:

经调查发现液晶对比度没有调好,旋转液晶调节对比度用的电位器直到液晶显示正常。

(2)开始时程序一直不能往单片机下载。

检查复位电路,时钟电路,以及单片机的供电系统,后来发现晶振没有起振,最终把晶振的起振电容换了就能够下载程序。

4.2软件调试

计算器是多功能的数字型设备,可以根据用户按下的按键记录要计算的数值。

并通过单片机内部运算计算出结果并在屏幕上显示。

计算器的功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。

最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。

在软件的调试过程中主要遇到的问题如下:

1.每次计算一次数值运算后,屏幕上会残留以前换算的结果,进行下一次运算的时候也没有消除。

经过分析初步确认是液晶在进行下一次运算的时候没有进行清屏,在上一次运算完成后,进行新一次运算的时候单片机对液晶进行处理使其进行清屏处理,最后解决了此问题。

2.当用户按下按键的时候,单片机读取的数值跟设定的数值不对。

重新检查矩阵键盘电路的连接,重新建立一个新的对应关系。

4.3调试结果

经过一系列的问题查找后系统最终能正常工作,并完成所有的功能。

以下为系统仿真图:

图4-1系统仿真图

5.心得体会

通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。

经过我长时间的设计及调试,本系统基本能实现设定的要求。

通过这些我的硬件和软件开发能力都获得了提高。

首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。

基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。

通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。

并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。

我的动手能力得到了很大的提高,创新意识得到了锻炼。

在整个设计过程中,虽然忙碌劳累,但也充实快乐,老师每天都会不厌其烦的陪着我们在机房,有任何问题都会对我们倾囊相授,在这我想向陪伴我们三年的老师说声谢谢,你们辛苦了!

参考文献

[1]彭伟.单片机C语言程序设计实训100例.电子工业出版社.2009年

[2]吴运昌.模拟电子线路基础.广州:

华南理工大学出版社,2004年

[3]阎石.数字电子技术基础.北京:

高等教育出版社,1997年

[4]张晓丽等.数据结构与算法.北京:

机械工业出版社,2002年

[5]马忠梅等.ARM&

Linux嵌入式系统教程.北京:

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

[6]李建忠.单片机原理及应用.西安:

西安电子科技大学,2002年

[7]韩志军等.单片机应用系统设计[M].机械工业出版社,2004

[8]周润景等.Proteus在MCS-51&

ARM7系统中的应用百例[M].电子工业出版社,

[9]马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2006

[10]刘树中,孙书膺,王春平.单片机和液晶显示驱动器串行接口的实现[J].微计算机信息,2007

系统源程序

#include<

reg52.h>

#include"

LCD1602.h"

math.h"

//端口及函数说明----------------------------------------------------------------------------

#defineKey_portP2 //按键

unsignedcharkey_scan(void);

//键盘扫描函数

bitFlagN=0;

//是否有数字按下,按下后置1

bitFlagO=0;

//是否有操作符按下,按下后置1

bitFlagD=0;

//是否按下小数点,按下后置1

bitFlagNegX=0;

bitFlagNegY=0;

doubleX=0.0,Y=0.0,RES=0.0;

//X为第一个操作数Y为第二个操作数

unsignedcharOPER=0;

//操作符号

intNum[16]={0};

//存放结果位

//-------------------------------------------------------------------------------

voiddelay(unsignedinti)

{

unsignedintx,y;

for(x=0;

x<

i;

x++)

for(y=0;

y<

110;

y++);

}

while(Num[i]==0)//判断第一个不为0的数

{

i++;

}

k=4-i;

if(i>

3) //RES<

1时

LCDDispChar(2,2,'

0'

);

LCDDispChar(3,2,'

.'

for(l=0;

l<

4;

l++)

{

LCDDispNum(4+l,2,Num[l+4]);

}

else

for(j=0;

j<

k;

j++) //显示所有的整数部分

LCDDispNum(2+j,2,Num[i++]);

LCDDispChar(2+j,2,'

j++;

LCDDispNum(2+j,2,Num[l+4]);

j++;

}

}

//计算部分的函数

//传入参数:

x-运算数1,y运算数2,oper运算符号

//返回值:

运算结果

voidCalculate(void)

switch(OPER)

{

case11:

RES=(double)X*1.0+Y;

break;

case12:

RES=(double)X*1.0-Y;

case13:

RES=(double)X*1.0*Y;

case14:

RES=(double)X*1.0/Y;

default:

}

//主函数

voidmain()

{

unsignedchari=0;

unsignedinttemp=0;

unsignedcharlocation=0;

//当前显示指针位置

FlagN=0;

FlagO=0;

FlagD=0;

FlagNegX=0;

FlagNegY=0;

LCDInit();

while(FlagO)

LCDCursor();

while(FlagN)//输入X的过程中没有按下操作符建按下后跳出

{

i=key_scan();

OPER=i;

//取得操作符

if((i>

=0)&

&

(i<

10))

{

if(FlagD)//当没有按下小数点时

{

X=X*10+i;

}

else //按下小数点后的情况,

{ //储存值以便显示

Num[temp+4]=i;

//更新X值以便计算

if(temp==0)

X=X+(double)i/10;

if(temp==1)

X=X+(double)i/100;

if(temp==2)

X=X+(double)i/1000;

if(temp==3)

X=X+(double)i/10000;

if(temp==4)

X=X+(double)i/100000;

temp++;

}

LCDDispNum(location++,1,i);

}

elseif(i==10) //显示小数点

LCDDispChar(location++,1,'

}

elseif(i==12&

X==0)//按下‘-’号

FlagN=0;

FlagNegX=1;

LCDDispChar(location++,1,'

-'

}//输入X

if(FlagNegX)

X=0-X;

if(i==11) //显示操作符

LCDDispChar(location++,1,'

+'

elseif(i==12)

LCDDispChar(location++,1,'

elseif(i==13)

X'

elseif(i==14)

/'

else

?

'

temp=0;

FlagD=0;

FlagN=0;

FlagO=0;

//所有标志位清零

while(FlagO)//没有按下=时

i=key_scan();

10))

if(!

FlagD)//当没有按下小数点时

Y=Y*10+i;

else

{

Y=Y+(double)i/10;

Y=Y+(double)i/100;

Y=Y+(double)i/1000;

Y=Y+(double)i/10000;

Y=Y+(double)i/100000;

}

LCDDispNum(location++,1,i);

Y==0)//按下‘-’号

FlagNegY=1;

('

if(i==10) //显示小数点

if(!

FlagNegY)

Y=0-Y;

)'

if(i==15)

='

LCDNotCursor();

Calculate();

connum(RES);

while

(1);

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

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2