基于单片机的计算器结构设计Word格式文档下载.docx

上传人:b****5 文档编号:16325341 上传时间:2022-11-22 格式:DOCX 页数:41 大小:327.25KB
下载 相关 举报
基于单片机的计算器结构设计Word格式文档下载.docx_第1页
第1页 / 共41页
基于单片机的计算器结构设计Word格式文档下载.docx_第2页
第2页 / 共41页
基于单片机的计算器结构设计Word格式文档下载.docx_第3页
第3页 / 共41页
基于单片机的计算器结构设计Word格式文档下载.docx_第4页
第4页 / 共41页
基于单片机的计算器结构设计Word格式文档下载.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

基于单片机的计算器结构设计Word格式文档下载.docx

《基于单片机的计算器结构设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的计算器结构设计Word格式文档下载.docx(41页珍藏版)》请在冰豆网上搜索。

基于单片机的计算器结构设计Word格式文档下载.docx

方案二:

采用汉字图形点阵液晶显示器RT12864M显示方案。

RT12864M汉字图形点阵液晶显示模块,可显示汉字及图形。

供电电源为3.3V~+5V(置升压电路,无需负压),能采用并行和串行两种通信方式。

并有光标显示、画面移位、自定义字符、睡眠模式等功能。

综上所叙,12864的显示效果好、功能齐全,所以我们选用12864液晶显示。

其与单片机的接口电路如图1-2所示。

图1-212864与单片机的接口电路

(3)单片机电源部分的设计方案论证与选择

由于本次设计中单片机工作电源为5V,所以需要稳压,对于5V电源这里有以下两种方案。

用固定式三端稳压器7805。

如图1-5,7805系列稳压器输出固定的正电压5V,输入端接电容C1可以进一步滤除纹波,输出端接电容C2能改变负载的瞬态影响,使电路稳定工作C1、C2最好采用漏电流小的钽电容。

如果采用电解电容,则电容要比图中数值增加10倍。

图1-3固定式三端稳压器

用7805加一些外围器件。

虽然7805三端集成稳压管部有过流、过热和安全区的保护电路,但其输出仍有可能发生过压的危险。

因此本电路加了过压保护电路,电路如图1-4所示,该电路由稳压管VD3、电阻R3和晶闸管VS组成。

另外由于7805的最大输出电流为1.5A,可以通过在7805的1脚与VT1的基极相连,7805的2脚与VT1的集电极相连,这样就可输出1.6A~2A的电流。

如需更大的电流,可再并联几个大功率三极管。

图1-4可扩流过压保护5V稳压电源

综上所述,方案一电路简单,而且已符合本次设计的要求,再加上第二种方案所用元件较多,性能价格比不高,所以我们选择方案一。

(4)键盘设计方案与选择

独立键盘。

独立键盘为一端接地,另一端接I/O口,并且要接上拉电阻。

这种键盘的硬件都很容易实现,但每一个按键就要用一个I/O口,非常的浪费单片机的I/O口资源,不适合本次设计。

4*4矩阵式键盘。

其电路图如图图1-5所示,这种键盘的硬件简单,使用的I/O口也不多,而且这种键盘的编程方法已很成熟。

所以本次设计采用这种矩阵式键盘。

其电路图如图

图1-54*4矩阵式键盘电路图

1.2.3系统组成

经过方案比较与论证,最终确定的系统组成框图如图1-6所示。

其中单片机作为主控设备对采集输入信号后并进行处理,最后通过输出设备输出给使用者,该系统的结构框图如图。

图1-6系统组成方框图

2重要器件的知识介绍

2.1单片机的知识介绍

由于ATMEL公司生产的AT89S52型单片机是即便于下载又好用,而且能够满足本设计的要求。

所以我选择AT89S52型单片机。

2.1.1单片机的主要性能

(1)与MCS-51单片机产品兼容

(2)8K节在系统可编程Flash存储器

(3)1000次擦写周期

(4)全静态操作:

0Hz-33Hz

(5)三级加密程序存储器

(6)32个可编程I\O口线

(7)三个16位定时器\计数器

(8)八个中断源

(9)全双工UART串行通道

(10)低功耗空闲和掉电模式

(11)掉电后中断可唤醒

(12)看门狗定时器

(13)双数据指针

2.1.2单片机的功能特性描叙

AT89S52是一种低功耗,高性能CMO58位微控制器,具有8K在系统可编程Flash存储器。

使用ATMEL公司高密度非易使性存储器技术制造,与工业80C51产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,迹适于常规编程器。

在单芯片上,拥有灵巧的8位CPU和在系统编程Flash,使得AT89S52为众多嵌入式控制应用系

统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能:

8K字节Flash、256字节RAM、32位I\O口线、看门狗定时器、2个数据指针、三个16位定时器\计数器、一个6向量2级中断结构、全双工串行口、片晶振及时钟电路。

另外,AT89S52可降至0Hz静态逻辑操作,支持2钟软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM定时器\计数器、串口、中断继续工作。

掉电保护方式下,RAM容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

2.1.3单片机的部结构方框图及芯片

图2-1单片机的部结构方框图

2.1.4单片机各引脚功能说明

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行

校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:

P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89S52的一些特殊功能口,如图表2.1。

表2.1AT89S52的一些特殊功能口

管脚

备选功能

P3.0RXD

(串行输入口)

P3.1TXD

(串行输出口)

P3.2/INT0

(外部中断0)

P3.3/INT1

(外部中断1)

P3.4T0

(记时器0外部输入)

P3.5T1

(记时器1外部输入)

P3.6/WR

(外部数据存储器写选通)

P3.7/RD

(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有部程序存储器。

注意加密方式1时,/EA将部锁定为RESET;

当/EA端保持高电平时,此间部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

2.1.5单片机时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

在MCS-51芯片部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。

此电路采用12MHz的石英晶体。

时钟电路如下图2-2:

图2-2时钟电路

2.1.6单片机复位电路

复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。

除了进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。

RST引脚是单片机复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上,若使用频率为12MHz的晶振,则复位信号持续时间应超过4

s才能完成复位操作。

复位操作有上电自动复位和按键手动复位两种方式。

上电自动复位是通过外部复位电路的电容充电来实现的。

按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的。

在本设计中采用了按键电平复位方式,其复位电路如下图2-3。

图2-3复位电路

2.1.7单片机下载口电路

下载口电路以一块74HC373芯片为主,电路原理图如图2-4所示。

由于电路中只用了一片74HC373所以完全可以把电路装在DB25插针式并口插头部,这个可以做到很小巧,可以很方便的使用。

为了稳定也可以芯片外围加一些电阻、电容等元件,具体电路网上有提供下载。

光是做好下载线是不行的,S51系统的ISP下载方式还要求要下载程序单片机运行在最小化系统中。

只要把的相应引脚连接起来就可以对S51进行ISP下载了。

要接的引线是S51的6,7,8,9,20,40引脚。

晶振可以在3M-24M间选用,当然是看你的目标板而选择。

为了方便使用我们需要做一个下载头,电路简单接线正确的话一般无需要调整就可以正常使用,如有问题可以用软件中的IspTest.exe(下载线调试程序)

检查你的74HC373芯片是否正常和你的电脑并口是否正常。

图2-4下载口电路原理图

3程序流程图

主程序流程图

显示程序流程图

键扫程序流程图

毕业设计是我大学学习生活的最后一项学习任务,是对我大学学习的综合考核。

在为期三个多月的毕业设计过程中,我不仅较为系统的复习了以前学过的知识,而且又学习了许多新知识,使我的只是结构更加系统化,也更加完善。

同时,也提高了我独立分析问题、解决问题的能力。

在本文的选题、构思、写作和修改直至最终定稿的过程中,更是浸透了导师大量的心血,感激之情难以言表。

而且,在和老师的交流过程中,还学到了许多做人、处事的道理,使我终身受益。

我要诚挚地向培养我的各位领导以及实验室的各位老师表示感!

在此,我表示衷心感。

三年的学习生活,他们无形中给了我很大的帮助,使我顺利完成学业。

掌握了一技之长。

同时,我要感我的母校——襄阳汽车职业技术学院,特别是我即将踏上工作岗位时,给我这样一个锻炼、学习的机会,使我加深了对以前知识的理解,拓宽了知识面,也提高了我对所学知识的综合应用能力。

在此我谨向我的导师以及在毕业设计过程中给予我很大帮助的老师、同学们致以最诚挚的意。

参考文献

(1)广弟《单片机原理及应用》航天航空大学2008.2

(2)新民《微型计算机控制技术》电子工业2008.5

(3)梅丽凤《单片机原理及接口技术》清华大学2004.6

(4)陪金《C语言程序设计案例教程》电子科技大学2008.1

(5)戴佳《51单片机C语言应用程序设计实例精讲》电子工业2006.4

(6)谭浩强《C程序设计》清华大学2006.4

附录1系统原理图

附录2程序清单

#include<

reg52.h>

stdio.h>

intrins.h>

math.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlong

sbitrs=P2^0;

sbitrw=P2^1;

sbiten=P2^2;

sbitpsb=P2^3;

sbitret=P2^5;

sbitrd=P3^7;

sbits=P1^0;

sbits1=P1^4;

sbits2=P1^5;

sbits3=P1^6;

sbits4=P1^7;

ucharcount,s1num;

unsignedintnin,ss;

charyue,re,qi,shi,fen,miao;

uchardshi,dfen,dmiao,ling,aa,t1,p;

ucharcommand,data0,data1,data2,com0,j,l;

unsignedcharcommand,data1,data2,com0,bb,bb0,aa,cc,i,yun;

//

ucharlcdH,lcdL,key;

floatds,m,k;

ulongds0;

bitflag,flag1,flag2,flag3,flag4;

uchardisbuf[9]={0};

//定义显示缓冲区//

ucharcodetable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e};

ucharcodetable1[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9};

//日~六//

ucharcodetable2[]={0x32,0x30,0x30,0x39,0xc4,0xea,0x30,0x35,0xd4,0xc2,0x30,0x31,0xc8,0xd5};

//年月日//

ucharcodetable4[]={0xd0,0xc7,0xc6,0xda,0xc1,0xf9};

//星期六//

ucharcodetabping[]={32,29,32,31,32,31,32,32,31,32,31,32};

ucharcodetabrun[]={32,30,32,31,32,31,32,32,31,32,31,32};

ucharcodexing1[]={3,6,0,3,5,1,3,6,2,4,0,2};

ucharcodexing2[]={4,0,0,3,5,1,3,6,2,4,0,2};

ucharxing[12]={0};

uchartab[12]={0};

//延时//

voiddelay(uintms)//延时250us

{

uchari;

while(ms--)

{

for(i=0;

i<

125;

i++);

}

}

//LCD初始化//

voidlcd_int()

ret=0;

delay(3);

ret=1;

_nop_();

psb=1;

//将PSB置1,通信方式为8BIT数据并口//

//写指令程序//

voidwrite_command(ucharcommand)

rs=0;

rw=0;

P0=command;

en=1;

en=0;

//写数据程序//

voidwrite_data(uchardata0)

{

rs=1;

P0=data0;

//LCD功能设置//

voidlcd_set()

command=0x30;

//基本指令集//

write_command(command);

command=0x01;

command=0x06;

command=0x0c;

//清屏程序//

voidclear_lcd()

command=0x34;

voiddisplay()

command=com0;

data2=lcdH;

write_data(data2);

data1=lcdL;

write_data(data1);

voiddisplay1(uchary,ucharx,uchar*p)

switch(y)

{

case1:

write_command(0x7f+x);

break;

//液晶第一行

case2:

write_command(0x8f+x);

//0x90+(x-1)

case3:

write_command(0x87+x);

break;

case4:

write_command(0x97+x);

default:

while(*p)

write_data(*p++);

voidxiaoshu()//先判断k是否为小数,如果k为小数,就将k转化为小数//

uintmg=1;

if(flag1)

cc;

i++)mg*=10;

k=k/(mg*1.0);

cc=0;

flag1=0;

//键扫描程序//

ucharkeyscan()

{ucharscancode,tmpcode;

P1=0xf0;

//行全为0

if((P1&

0xf0)!

=0xf0)//有键按下

{delay(100);

//延时去抖动

=0xf0)//判是否真的有键按下

{scancode=0xfe;

//诼行扫描

while((scancode&

0x10)!

=0)

{P1=scancode;

if((P1&

=0xf0)//本行有键按下

{tmpcode=(P1&

0xf0)|0x0f;

//返回特征字节码,为1的位即对应于行和列

return((~scancode)+(~tmpcode));

}

elsescancode=(scancode<

<

1)|0x01;

//行扫描码左移一位

}

return(0);

//无键按下,返回值为0

}

disjia()

com0=0x83;

lcdH=0xbc;

lcdL=0xd3;

display();

com0++;

lcdH=0xb7;

lcdL=0xa8;

com0=0x87;

disjian()

lcdL=0xf5;

discheng()

lcdH=0xb3;

lcdL=0xcb;

dischu()

lcdL=0xfd;

voidjishu()//把ds0处理后放入显示缓冲区中//

disbuf[0]=ds0/1000000000%10;

disbuf[1]=ds0/100000000%10;

disbuf[2]=ds0/10000000%10;

disbuf[3]=ds0/1000000%10;

disbuf[4]=ds0/100000%10;

disbuf[5]=ds0/10000%10;

disbuf[6]=ds0/1000%10;

disbuf[7]=ds0/100%10;

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

当前位置:首页 > 初中教育 > 科学

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

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