计算器课程设计报告

更新时间:2023-03-08 06:27:58 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

按键计算器课程设计报告

设计类型: 综合设计 设计题目: 基于单片机数字显示计算器 系 别: 年级专业: 电子信息工程系 电子09--2

姓名学号: 孙春生

指导教师:

2010 年 6月 22 日

课程设计报告

目录

摘要: ...................................................................... 2

一、计算器系统 .............................................................. 2

1.1 单片机及计算器概述 .................................................................................................................... 2 1.2.系统设计要求与整体规划 ........................................................................................................ 3

1.2.1基础设计要求 ........................................................................................................................ 3 1.2.1系统规划 ................................................................................................................ 3 1.3 AT89C51单片机的主要性能参数和主要引脚 ........................................................ 3

1.3.1 主要性能参数 .................................................................................................... 3 1.3.2功能引脚说明 ..................................................................................................... 4

二、硬件设计 ................................................................ 5

2.1.系统总框图 ...................................................................................................................... 5 2.2数码管原理 ....................................................................................................................... 5

2.2.1动态扫描 .............................................................................................................. 5 2.3 4X4键盘的工作原理 ....................................................................................................... 7 2.4 计算器控制线路图 .......................................................................................................... 8 2.5计算器控制线路图 ........................................................................................................... 9 三、系统调试 ................................................................ 9

3.1基于PROTEUS的电路仿真 ........................................................................................... 9

3.1.1用PROTEUS 绘制原理图 ................................................................................ 10 3.1.2 PROTEUS 对单片机内核的仿真 ................................................................... 11 3.2 计算器硬件调试 ............................................................................................................ 12 四、结 论 .................................................................. 12

附1:硬件仿真图 ........................................................... 13

附2:程序清单 ............................................................. 13

附3:实物图 ?????????????????????????????? 22

1

课程设计报告

基于单片机的数字显示计算器设计

摘要:

本设计中,采用了单片机采用 80S52 单片机,它能够满足数据的采集、控制和数据处理的需求。显示用 8 段 LED 数码管,输入采用按键方式。再采用AT89C51单片机进行控制,AT89C51单片机有8字节FLASH闪速存储器,256字竹内部RAM , 32个I/O口线,3个16 位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。AT89c51可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。空闲方式停止CPU 的工作,但允许RAM,定时/计数器。串行通信口及中断系统继续工作。在本系统设计中共有以下四个模块组成:开关模块、输入模块、单片机控制模块、数码管显示模块。能实现四则运算、累计运算、溢出判断。 关键字:矩阵键盘、AT89C51、

一、计算器系统

1.1 单片机及计算器概述

单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。

通常,单片机由单个集成电路芯片构成,内部包含有计算机的基本功能部件,中央处理器,存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。单片机的应用已经越来越贴近生活,用单片机来实现一些电子设计也变得容易起来。计算器在人们的日常中是比较的常见的电子产品之一。可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的计算器。该设计系统是以 AT89C51 为单片机,P0 口作为输入端,外接 4X4 的键盘,通过键盘扫描来对输入数的控制,在 P1 口,P2 口接了驱动电路。用来保证 LED 的工作正常。计算器将完成的功能有加、减、乘、除等功能。

2

课程设计报告

1.2.系统设计要求与整体规划

1.2.1基础设计要求

该设计通过89S52芯片控制6个一位数码管显示,并实时检测按键按下情况来实现计算器功能,16个按键有10个为数字按键 其他6个分别为加、减、乘、除、复位、等于根据功能和指标要求,本系统选用 89S 51 单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计考虑如下:

①由于要设计的是简单的计算器,可以进行四则运算,对数字的大小范围要求不高,故 我们采用可以进行四位数字的运算,选用 8 个 LED 数码管显示数据和结果。 ②另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可。

1.2.1系统规划

电路板一块,AT89c51单片机一片,LCD 1个,1K欧姆电阻8个,5V稳定电源1个等。 系统结构框图如下图1-1: 键盘 LCD显示 AT89C51 图1-1

1.3 AT89C51单片机的主要性能参数和主要引脚 1.3.1 主要性能参数

AT89C51 提供以下标准功能:8字节FLASH闪速存储器,256字竹内部RAM , 32个I/O

3

课程设计报告

口线,3个16 位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。空闲方式停止CPU 的工作,但允许RAM,定时/计数器.串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.

1.3.2功能引脚说明

Vcc:电源电压 GND:地

P0:P0口是一组8位漏极开路型双向1/O 口,也即地址/数据总线复用口。作为输出口用时.每位能吸收电流的方式驱动8个TTL 逻辑门电路,对端口P0 写“1”时,可作为高阻抗输入端用。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部 上拉电阻。

在FLASH由编程时,P0口接收指令字节,而在程序校验时,输出指令字 节,校验时,要求外接上拉电阻。

P1口:PI 是一个带内部上拉电阻的8位双向I/O口,Pl的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻某个引脚被外部信号拉低时会输出一个电流IIL

与AT89C51不同之处是,Pl.0 和P1.1还可分别作为定时/计数器2 的外部计数输入(Pl.0/T2 )和输入(P1.1/T2EX) 。

AT89S51 引脚图如下图1-2:

图1-2 AT89C51芯片

4

课程设计报告

二、硬件设计

2.1.系统总框图

如图2-1:

键盘 LCD显示 AT89C51

图2-1系统总框图

(1)主要器件:单片机采用 80S52 单片机,它能够满足数据的采集、控制和数据处理的需求。显示用LCD 数码管,输入采用按键方式。

(2)功能和操作:加减乘除运算和显示,溢出判断出错。 ①上电后,屏幕初始化。

②计算。按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后 按下“﹦”号键,屏幕上显示出计算结果。

③如果要再次计算,可以按下“CLC”键清零,或者按下单片机的复位键,重新初始化。

2.2数码管原理

七段数码显示管七段数码管的显示不同的字形如 SP,g,f,e,d,c,b,a 管角上加上OFEH所以SP上为0伏不亮其余为TTL高电平,全亮则显示为8。采用共阴极连接:图2-2

2.2.1动态扫描

在本电路中,使用的是动态扫描显示方法。在动态LED显示程序中,需要不停地扫描

5

课程设计报告

字位口,从而实现不同字位的数据的动态显示效果。动态借口采用各数码管循环轮流显示的方法,由于一次只能让一个数码管显示,因此,要显示6位的数据,必须经过让数码管一个一个轮流显示才可以,同时每个数码管显示的时间大约在1ms到5ms之间,所以为了保证正确显示,我们必须每隔1ms,就得刷新一个数码管。而这刷新时间我们采用单片机的定时/计数器0来控制,每定时1ms对数码管刷新一次,T0采用方式2。在进行数码显示的时候,要对显示单元开辟6个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。对于现实的字形码数据我们采用查表方法来完成。

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划\的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低

图2-2 七段数码管的显示 显示数值 0 1 2 3 4 5 6 7 8 9

a b c d e f g dop 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 6

驱动代码(16进制) 0x3fH 0x06H 0x5bH 0x4fH 0x66H 0x6bH 0x7dH 0x07H 0x7fH 0x6fH 课程设计报告

2.3 4X4键盘的工作原理

矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。图2-3为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。图2-4按键排列 S1Comment: 0P14S54P15S98P16S13CP17P10P11P12P13S14DS15ES16FS109S11AS12BS65S76S87S21S32S43距阵键盘048CK1K K1P14独立键盘P14P15P16P17 图2-3 矩阵键盘电路 K2P15K3P16K4P17VCCK5RES伟 图2-4按键排列

7

课程设计报告

2.4 计算器控制线路图

图2-5 单片机晶振电路

图2-6 复位电路

8

课程设计报告

2.5计算器控制线路图

图2-7 计算器线路图

三.系统调试

3.1基于PROTEUS的电路仿真

PROTEUS嵌入式系统仿真与开发平台是由英国公司开发(授权风标科技公司为中国大陆总代理)的EDA工具软件,是目前世界上最先进最完整的嵌入式系统设计和仿真平台。Proteus软件有十多年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,您不需要别的,Proteus为您建立了完备的电子设计开发环境!真正实现了在没有目标原形时就可对系统进行调试,测试和验证。

9

课程设计报告

3.1.1用PROTEUS 绘制原理图

运行PROTEUS VSM 的ISIS 后出现相应的界面, 点状的栅格区域为绘图区。左侧的上方为电路图概览区, 下方是元器件列表区。单击P 后出现的Pick Device添加元器件的对话框, 输入所要添加的器件名称, 则该器件就会出现在右侧, 单击OK 按钮, 完成一个元器件的添加。重复以上过程, 添加好电路中所需的元器件。

在元器件列表区选中某元器件后, 在电路图概览区会出现该元器件, 用鼠标将其拖至绘图区, 将所有需要的元器件在绘图区放置好, 即可开始连线。连线方法很简单, 将鼠标移至元器件引脚后会出现一个小十字, 单击鼠标左键后移动鼠标, 将线引至某一引脚处会再次出现小十字, 再次单击左键就完成了一条连线。在布线时, 如果需要转弯,可以在转弯处单击鼠标左键。图4-1就是绘制完成的电路图。

10

课程设计报告

图4-1 在PROTEUS绘制的电路图

3.1.2 PROTEUS 对单片机内核的仿真

电路图绘制完成后, 再添加AT89C51 的应用程序。将鼠标移至AT89C51 上, 单击鼠标右键使之处于选中状态, 在该器件上单击左键, 打开如图4-2所示的对话框。在 Program File 栏添加编译好的十六进制格式的程序文件AA.hex(可以接受3 种格式的文件) , 单击OK 按钮完成程序添加工作,图4-2。 下面就可以进行系统仿真了。单击主界面下方的按钮开始系统仿真。PROTEUS 所进行的是一种交互式仿真, 在仿真进行中可以对各控制按钮、开关等进行操作, 系统对输入的响应会被真实的反映出来。仿真结果如图4-3。开始仿真后,开关,按钮通过鼠标单击来改变状态,所改变状态的结果会在LED和数码管显示出来。仿真结果与设计方案相符。

图4-3计算器仿真界面

11

课程设计报告

3.2 计算器硬件调试

按照系统硬件连线图连接好系统并调试 (由于个人原因没有做实物调试,只有软件测试) 1、调试程序

(1)把编写好的16进制文件(jtd.hex) 输入单片机AT89S51仿真器和对其进行初始化。 (2)给实验板进行通电,观察运行结果,不一致则跳到第一步进行反复调试,直到与预定目的一致。

2、硬件调试中常见故障:

(1)逻辑错误:它是由设计错误或加工过程中的工艺性错误所造成的。这类错误包括错线、开路、短路等。

(2元器件失效:有两方面的原因:一是器件本身已损坏或性能不符合要求;二是组装错误造成元件失效,如电解电容、二极管的极性错误、集成电路安装方向错误等。

(3)可靠性差:引起可靠性差的原因很多,如金属化孔、接插件接触不良会造成统时好时坏,经不起振动;走线和布局不合理也会引起系统可靠性差。

(4)电源故障:若样机有电源故障,则加电后很容易造成器件损坏。电源故障包括电压值不符合设计要求,电源引线和插座不对,功率不足,负载能力差等。调试方法:包括多级调试和联机调试。在调试过程中要针对可能出现的故障认真分析,直至检查出原因并且排除。

四、结 论

通过这次单片机课程设计,不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。设计结果能够符合题意,成功完成了此次课程设计要求,不只在乎这一结果,更加在乎的,是这个过程。这个过程中,花费了大量的时间和精力。在高老师的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,单片机领域这对我今后进一步学习及工作有极大的帮助。

12

课程设计报告

附1:硬件仿真图

附2:程序清单

#include //头文件 #define uint unsigned int // #define uchar unsigned char sbit lcden=P3^2; //定义引脚 sbit rs=P3^0; sbit rw=P3^1; sbit busy=P1^7;

13

课程设计报告

char i,j,temp,num,num_1;

long a,b,c; //a,第一个数 b,第二个数 c,得数 float a_c,b_c;

uchar flag,fuhao; //flag表示是否有符号键按下,fuhao表征按下的是哪个符号 uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0}; uchar code

table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};

unsigned char hy[]={\void delay(uchar z) // 延迟函数 {uchar y; for(z;z>0;z--) for(y=0;y<110;y++);} void check() // 判断忙或空闲 {do{P1=0xFF; rs=0; //指令 rw=1; //读

lcden=0; //禁止读写

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

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

void write_com(uchar com) // 写指令函数 {P1=com; //com指令付给P0口 rs=0; rw=0; lcden=0; check(); lcden=1; }

14

课程设计报告

void write_date(uchar date) // 写数据函数 {P1=date; rs=1; rw=0; lcden=0; check(); lcden=1; }

void init() //初始化 { num=-1;

lcden=1; //使能信号为高电平 write_com(0x38); //8位,2行

write_com(0x01); //显示开,光标关,不闪烁 write_com(0x0c); //显示开,光标关,不闪烁*/ write_com(0x06); //增量方式不移位 显竟獗暌贫 柚? num_1=0; i=0; j=0;

a=0; //第一个参与运算的数 b=0; //第二个参与运算的数 c=0;

flag=0; //flag表示是否有符号键按下, fuhao=0; // fuhao表征按下的是哪个符号 }

void keyscan() // 键盘扫描程序 {P2=0xfe; if(P2!=0xfe) { delay(20); if(P2!=0xfe) {temp=P2&0xf0;

15

课程设计报告

switch(temp)

{ case 0xe0:num=0; break; case 0xd0:num=1;break; case 0xb0:num=2;break; case 0x70:num=3;break; } } while(P2!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9 { if(j!=0)

{ write_com(0x01); j=0; }

if(flag==0)//没有按过符号键 {a=a*10+table[num]; }

else//如果按过符号键 {b=b*10+table[num]; }}

else//如果按下的是'/' {flag=1;

fuhao=4;//4表示除号已按 }

i=table1[num]; write_date(0x30+i);} P2=0xfd; if(P2!=0xfd) {delay(5); if(P2!=0xfd) { temp=P2&0xf0; switch(temp)

{ case 0xe0:num=4; break;

16

课程设计报告

case 0xd0:num=5; break; case 0xb0:num=6; break; case 0x70:num=7; break; } }

while(P2!=0xfd);

if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6' { if(j!=0)

{ write_com(0x01); j=0; }

if(flag==0)//没有按过符号键 {a=a*10+table[num]; }

else//如果按过符号键 b=b*10+table[num]; }}

else//如果按下的是'/' { flag=1;

fuhao=3;//3表示乘号已按 }

i=table1[num]; write_date(0x30+i);} P2=0xfb; if(P2!=0xfb) {delay(5); if(P2!=0xfb) {temp=P2&0xf0; switch(temp)

{ case 0xe0:num=8;break; case 0xd0:num=9;break; case 0xb0:num=10;break;

17

课程设计报告

case 0x70:num=11;break; }}

while(P2!=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3' { if(j!=0)

{ write_com(0x01); j=0; }

if(flag==0)//没有按过符号键 {a=a*10+table[num]; }

else//如果按过符号键 {b=b*10+table[num]; }}

else if(num==11)//如果按下的是'-' {flag=1;

fuhao=2;//2表示减号已按 }

i=table1[num]; write_date(0x30+i); } P2=0xf7; if(P2!=0xf7) {delay(5); if(P2!=0xf7) {temp=P2&0xf0; switch(temp)

{ case 0xe0:num=12; break; case 0xd0:num=13;break; case 0xb0:num=14;break;

18

课程设计报告

case 0x70:num=15; break; } }

while(P2!=0xf7); switch(num) {

//按下的是\

case 12:

{write_com(0x01);a=0;b=0;flag=0;fuhao=0; } break; case 13:

//按下的是\

{ if(flag==0) //没有按过符号键 {a=a*10;

write_date(0x30); P2=0;}

else if(flag==1) //如果按过符号键 { b=b*10; write_date(0x30); }} break; case 14: {j=1; if(fuhao==1)

{ write_com(0x80+0x4f); //按下等于键,光标前进至第二行最后一个显示处 write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格 c=a+b; while(c!=0)

{ write_date(0x30+c); c=c/10;}

write_date(0x3d); //再写\ a=0;b=0;flag=0;fuhao=0; }

else if(fuhao==2)

19

课程设计报告

{write_com(0x80+0x4f);//光标前进至第二行最后一个显示处

write_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样) if(a-b>0) c=a-b; else c=b-a; while(c!=0)

{ write_date(0x30+c); c=c/10; } if(a-b<0)

write_date(0x2d);

write_date(0x3d); //再写\ a=0;b=0;flag=0;fuhao=0; }

else if(fuhao==3) {write_com(0x80+0x4f); write_com(0x04); c=a*b; while(c!=0)

{ write_date(0x30+c); c=c/10;}

write_date(0x3d); a=0;b=0;flag=0;fuhao=0; }

else if(fuhao==4) {write_com(0x80+0x4f); write_com(0x04); i=0;

c=(long)(((float)a/b)*1000);

20

课程设计报告

while(c!=0)

{ write_date(0x30+c); c=c/10; i++; if(i==3)

write_date(0x2e); } if(a/b<=0)

write_date(0x30);

write_date(0x3d); a=0;b=0;flag=0;fuhao=0; } break; case 15:

{write_date(0x30+table1[num]); flag=1;fuhao=1; } break; }}}} void main() {init();

write_com(0x80); for(j=0;j<6;j++) {write_date(hy[j]);} while(1) {eyscan(); }}

3:实物图

21

附件

课程设计报告

22

本文来源:https://www.bwwdw.com/article/h7e.html

Top