基于C51单片机的简易电子计算器制作Word下载.docx
- 文档编号:19525067
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:19
- 大小:314.63KB
基于C51单片机的简易电子计算器制作Word下载.docx
《基于C51单片机的简易电子计算器制作Word下载.docx》由会员分享,可在线阅读,更多相关《基于C51单片机的简易电子计算器制作Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
但数码管在硬件设计电路中,会因线太多、线路复杂而过于繁琐,则舍弃LED数码管,选择LCD液晶显示。
4、硬件资源分配
主要用到的硬件:
单片机STC89C52、液晶显示屏LCD1602、4*4按键键盘
硬件分配:
1、P1口:
作为输入口,与键盘连接,实现数据的输入;
2、P0、P2口:
作为输出口(P2口为高位,P0口为低位),控制LCD液晶显示屏显示数据的结果;
3、液晶显示屏LCD1602显示输出。
二、计算器硬件设计
1、系统组成及硬件框图
图2-1-1系统组成及硬件框图
2、元器件简介
2.1STC89C52特点
图2-2-1单片机STC89C52
1,、主要性能:
与MCS-51单片机产品兼容;
8K字节在系统可编程Flash存储器;
1000次擦写周期;
全静态操作:
0Hz-33Hz;
三级加密程序存储器;
32个可编程I/O口线、三个16位定时器/计数器、8个中断源;
全双工UART串行通信;
低功耗空闲和掉电模式,掉电后中断可唤醒;
看门狗定时器;
双数据指针;
掉电标识符。
2、STC89C52的功能特性概述
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
2.2LCD1602液晶显示屏
1、液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式计算机、数字摄像机、PDA移动通信工具等众多领域。
2、LCD1602的应用简介
LCD1602液晶显示器采用HD44780及其兼容芯片作为点阵式LCD的控制器驱动器,还采用HD44100进行LCD的时分割驱动。
HD44780的内部结构主要包括显示数据RAM(DDRAM)、字符发生器ROM(CGROM)、字符发生器RAM(CGRAM)、指令寄存器IR、数据寄存器DR、地址计数器AC(AddressCounter)和忙标志BF(BusyFlag)等逻辑电路。
1602液晶模块内部的控制器共有11条控制指令,丰富的指令可以完成液晶的时序控制、工作方式设置和数据显示等。
采用的LCD1602液晶模块是标准16针插座,接口电路如图2-2-5所示,及各引脚说明如表2-2-2所示。
图2-2-5LCD1602的引脚接口电路图
第1脚
Vss为地电源
第2脚
VDD接5V正电源
第3脚
Vo为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚
Rs为寄存器选择,高电平选择数据寄存器、低电平选择指令寄存器。
第5脚
Rw为读写信号线,高电平时进行读操作,低电平时选择指令寄存器。
第6脚
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7-14脚
D0-D7为8位双向数据线。
第15-16脚
背光阳极和背光阴极。
表2-2-2LCD1602的引脚说明
3、其他方面简介
DDRAM用来暂存显示字符的代码,共80个字节,DDRAM的各个单元对应着显示屏上的各个字符位,如图2-2-6所示。
因此,DDRAM的地址也就意味着显示字符的地址,显示字符时首先要向LCD送显示字符地址。
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
OE
OF
10
……
27
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
67
图2-2-6DDRAM单元地址与显示屏字符位的对应关系
三、系统的硬件设计
为了更好地实现系统的功能,硬件电路的设计应该遵循以下原则:
1、优化硬件电路
采用软件设计与硬件设计相结合的方法。
尽管采用软件来实现硬件系统的功能时,也许响应的时间会比单纯使用硬件时长,而且还要占用微处理器(MCU)的时间;
但是,用软件实现硬件的功能可以简化硬件结构,提高电路的可靠性。
所以,在设计本系统的时候,在满足可靠性和实时性的前提下,尽可能地通过软件来实现硬件功能。
2、可靠性及抗干扰设计
根据可靠性设计理论,系统所用芯片数量越少,系统的平均无故障时间越长。
而且,所用芯片数量越少,地址和数据总线在电路板上受干扰的可能性也就越小。
因此,系统的设计思想是在满足功能的情况下争取较少数量的芯片。
3、灵活的功能扩展
功能扩展是否灵活是衡量一个系统优劣的重要指标。
一次设计往往不能完全考虑到系统的各个方面,系统需要不断完善以及进行功能升级。
进行功能扩展时,应该在原有设计的基础上,通过修改软件程序和少量硬件完成。
对于本系统而言,就是要求在系统硬件不变的情况下,能够通过修改软件程序,完成功能的升级和扩展。
根据提出的系统设计方案,结合以上三条原则,确定了系统硬件的设计。
计算器主要由以下一些功能模块组成:
非编码键盘模块、运算模块(单片机内部)、LCD液晶显示模块等。
该系统的硬件设计采用了模块化的设计方法。
STC89C52单片机与LCD液晶显示屏显示电路是整个电路的核心,它们能实现系统的功能要求。
简易计算器主要包括:
键盘电路、运算电路、输出显示电路。
前面说明了该系统的设计,系统采用了比较简单的设计方案,所以该系统的硬件设计的总外围电路不会产生过多的干扰。
下面对系统的外围电路分别作了说明。
键盘部分采用4*4按键键盘,显示部分采用LCD液晶显示屏完全能够很好地实现显示方面的要求。
4、键盘电路的设计
键盘可分为两类:
编码键盘和非编码键盘。
编码键盘是较多按键(20个以上)和专用驱动芯片的组合;
当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。
通用计算机使用的键盘就是编码键盘。
在智能仪器中,使用并行接口芯片8279或串行接口HD7279均可以组成编码键盘,同时还可以兼顾数码管的显示驱动,其相关的接口电路和接口软件均可在芯片资料中得到。
当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。
非编码键盘成本低廉。
从成本角度出发,本设计选用的是非编码键盘。
如图
图键盘电路
5、显示电路的设计
当系统需要显示少量数据时,采用LCD液晶显示屏进行显示是一种经济实用的方法。
P0口作为液晶显示的数据端口,P2.0-P2.2口作为其控制端口,控制LCD液晶显示屏显示输出数据。
最终显示电路如图所示
6、其它电路部分
四、计算器软件设计
五、项目总结与体会
这个项目的选择是基于提升自我的目的,在程序设计方面有一定的难度。
主要是在系统还没有到设计完全的时候就开始很心急地买元器件及动手焊板子。
后来发现与设计的要求还有偏差,而后反复地改了好几次,浪费了大量的时间和精力。
从这次做板子的过程中就发现,虽然制作电路板不是很难,但是马虎不得。
不管你是在量长度或者是图线条是有一点疏忽,都可能导致做出的板子有问题不能正常工作。
所以我们对待每一个部分都必须认真,这样才更能成功。
此次的项目是由我们小组共同完成的。
其中遇到了许多的问题,例如有些意见不同。
但是我们都尝试着去理解他人的想法,最终得以结合大家的意见完成项目,也让我们明白了合作的重要性。
六、程序部分
/*简易计算器程序*/
#include<
reg52.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitlcdrs=P2^3;
//定义端口
sbitlcdrw=P2^4;
sbitlcden=P2^5;
sbitsound=P2^0;
ucharcodetable[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
'
+'
-'
*'
/'
='
.'
};
ucharkey,flag1,cal,judge1,judge2;
//cal:
计算calculationflag:
标志flag1用于标记按键进度
//judge1,judge2为两个判断变量
uchara[20],b[25];
floatAnswer=0;
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间大概为5US。
***********************************************************************/
voiddelay()
{
_nop_();
}
voidDelay(uinti)
uintx,j;
for(j=0;
j<
i;
j++)
for(x=0;
x<
=148;
x++);
}
voiddelay1(ucharz)//用于普通延时
ucharx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
bitBusy(void)
这个是一个读状态函数,读出函数是否处在忙状态
bitBusy(void)
bitbusy_flag=0;
lcdrs=0;
lcdrw=1;
lcden=1;
delay();
busy_flag=(bit)(P0&
0x80);
lcden=0;
returnbusy_flag;
wcmd(uchardel)
1602命令函数
voidwcmd(uchardel)
while(Busy());
lcdrw=0;
P0=del;
wdata(uchardel)
1602写数据函数
voidwdata(uchardel)
lcdrs=1;
L1602_init()
1602初始化,请参考1602的资料
voidL1602_init(void)
wcmd(0x38);
Delay(5);
wcmd(0x0d);
/*蜂鸣器发声函数*/
voidvoice()
sound=1;
delay1(2000);
sound=0;
/*LCD写命令函数*/
voidwrite_com(ucharcom)
lcdrs=0;
//写指令控制端为低
P0=com;
delay1(5);
lcden=1;
//给个高脉冲结束
delay1(4);
lcden=0;
/*写数据函数*/
voidwrite_data(uchardate)
lcdrs=1;
//写数据控制端高电平
P0=date;
/*键盘扫描函数*/
voidkeyscan()
{
uchartemp,xy=0xf7;
//xy变量存储第几行
uinti;
for(i=0;
i<
4;
i++)//行移动
{
xy=_crol_(xy,1);
//_crol_为左移函数
P1=xy;
temp=P1;
temp=temp&
0x0f;
if(temp!
=0x0f)
{delay1(10);
//去抖
{temp=P1;
voice();
switch(temp)//按键定位
case0xee:
key=7;
break;
case0xde:
key=8;
case0xbe:
key=9;
case0x7e:
key=10;
case0xed:
key=4;
case0xdd:
key=5;
case0xbd:
key=6;
case0x7d:
key=11;
case0xeb:
key=1;
case0xdb:
key=2;
case0xbb:
key=3;
case0x7b:
key=12;
case0xe7:
key=0;
case0xd7:
key=15;
case0xb7:
key=14;
case0x77:
key=13;
}
while(temp!
flag1=1;
//flag=1标志按键检测完毕
/*计算结果并显示函数*/
voidcal_show()
{uchari,j,n;
longdoubles,temp2;
longints1,s2,a1,b1,c1,temp1;
a1=b1=1;
s1=s2=0;
s=0;
if(judge2!
=0)
{
judge1+1;
j++)//存放第一操作数
{for(i=0;
judge1-j;
i++)//判断输入的是几位数
{a1=a1*10;
}
s1=s1+a[j]*a1;
a1=1;
for(j=judge1+1;
judge2+1;
j++)//存放第二操作数
judge2-j;
i++)//判断是几位数
{b1=b1*10;
s2=s2+a[j]*b1;
b1=1;
if(cal==10)//判断是什么运算,并执行运算
{s=s1+s2;
if(cal==11){s=s1-s2;
if(cal==12)
s=s1*s2;
if(cal==13)
s=(s1*0.1)/(s2*0.1);
//把s1,s2转化为小数形式?
Answer=s;
elses=Answer;
//下面对结果进行四舍五入
c1=(longint)(s*1000)%10;
if(c1>
5||c1==5)s=s+0.01;
//下面对数据进行处理
temp1=(longint)(s);
//temp1是答案的整数部分
temp2=s-temp1;
//temp2是答案的小数部分
n=0;
while(temp1)//整数部分放入数组
{b[n]=temp1%10;
temp1=temp1/10;
n++;
b[n]=temp2*10;
//把小数部分的第一位变成整数并放进数组
b[n+1]=(uchar)(temp2*100)%10;
//小数第二位......放进数组
//下面把得到的结果显示到液晶上面去
for(i=n;
i>
i--)
write_data(table[b[i-1]]);
//输出整数部分
write_data(table[15]);
//输出小数点间隔整数部分和小数部分
write_data(table[b[n]]);
//小数点后第一位
write_data(table[b[n+1]]);
//小数点后第二位
L1602_string(ucharhang,ucharlie,uchar*p)
1602写字符串函数
voidL1602_string(ucharhang,ucharlie,uchar*p)
uchara,b=0;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
while
(1)
wcmd(a++);
if((*p=='
\0'
)||(b==16))break;
b++;
wdata(*p);
p++;
L1602_char(ucharhang,ucharlie,charsign)
1602写指令函数
voidL1602_c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 C51 单片机 简易 电子 计算器 制作