计算器proteus综述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:计算器
学生姓名:任磊
学生学号: 1008030227 系别:电气信息工程学院
专业:电子信息工程
年级: 10 级
任课教师:张水锋
电气信息工程学院制
2012年12月
目录
摘要 (2)
课程任务与要求 (2)
方案论证 (2)
计算器工作流程图 (4)
单元电路: (5)
单片机芯片 (5)
Lcd602 (6)
矩阵盘 (8)
晶振电路 (8)
复位电路 (9)
与门电路 (9)
总图: (10)
心得体会 (10)
参考文献 (11)
附录 (11)
计算器的设计
学生:任磊
指导教师:张水锋
电气信息工程学院电子信息工程
摘要
通过学习《基于Proteus的51系列单片机设计与仿真》之后,知道了Proteus
能够对51系列的单片机控制的系统进行方正处理。

本次设计是结合大学学习的单片机课程与Proteus课程进行电子产品的设计。

通过设计更好的理解计算器的工作原理,了解单片机的用法与开发,熟练掌握Proteus软件的使用。

关键字:单片机 Proteus
一课程任务与要求
本次课程的任务就是要以51系列单片机为核心实现一个简易的计算器,它的结构非常简单,外部主要由4*4矩阵键盘,复位电路和一个液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。

要求:通过Proteus软件来实现设计的仿真,提高自己的编程水平,增加设计兴趣。

通过做自己喜欢的设计,提高自学能力。

为以后毕业走上工作岗位打下坚实的基础。

二方案论证
经分析,计算器电路包括三个部分:显示电路、4*4键扫描电路、单片机电
路。

具体如下:
2.1数码管显示电路
数码管是一种半导体发光器件,其基本单元是发光二极管。

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

功耗小,显示单一。

2.2 LCD显示电路
LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD。

2.3 4*4键盘扫描电路(中断式,扫描式,反转式)
扫描电路常采用3 种方法读取键值。

一种是中断式,外两种是扫描法和反转法。

中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个按件被按下。

扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。

若列值中有一位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。

反转法:先将所有行扫描线输出低电平,读列值。

若列值有一位是低,则表明有键按下,读列值;然后所有列扫描线输出低电平,再读行值。

根据读到的值组合就可以查出按下的按键。

综合以上所述采用中断式更加快捷方便,易于操作,适合我这样的新手完成。

2.4 单片机微控制电路
微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。

三计算器工作流程图
图 3.1
四单元电路:
4.1单片机控制芯片
图4.1
AT89C516RD+:该电路的核心控制元件是AT89C516RD+。

工作电压在3.3-5.5v之间。

最高时钟频率0-80hz,存储器字节64k。

P0口(32-39引脚)。

既可作为输入输出端口,又可作为地址数据复用总线使用。

当P0口作为输入输出口时,他是一个八位准双向口。

上电复位后处于开漏模式,P0口内部无上拉电阻所以P0口必须接10-4.7k上拉电阻,当作为地址/数据复用总线时。

无需上拉电阻。

EA(31脚)正五伏电源
外接晶振或外部振荡器引脚:
XTAL1 (19脚)当采用芯片内部时钟信号时,接外部时接外部12M晶振的一个引脚。

当采用外部时钟信号时,此脚应接地。

XTAL2 (18脚)当采用芯片内部时钟信号时,接外部时接外部12M晶振的一个引脚。

当采用外部时钟信号时,此脚应接地。

控制选通或电源复用引脚:
RST(9脚):复位信号输入,vcc掉电时此脚可接上备用电源,在低功耗条件下保持内部RAM中数据
ALE(30脚):ALE即允许地址锁存信号输出,当单片机访问外部存储器时该引脚的输出信号用于锁存P0口的低8位地址。

其输出的频率为时钟振荡频率的1/6,。

PSEN(29脚):访问外部程序存储器选通信号,低电平有效,用于外部存储器的读操作。

4.2 LCD1602显示电路
图4.2
3 LCD1602主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
4 引脚功能说明
第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

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

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W 共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

D0-d7口接STC89C516RD+ P0-P7进行数据传输。

1、3口分别接Vcc和Vdd。

4-6口分别接单片机rs rw e口。

4.3 矩阵盘电路
图4.3
每个按键有他的行值和列值,当按下按键后根据电平高低的变换,检测出是哪个按键,跟据按键在程序中的所赋予的含义进行加减乘除,完成操作。

4.4 晶振电路
图4.4
每个单片机系统里都有晶振,全程是叫晶体震荡器,在单片机系统里晶振的作用
非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指
令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速
度也就越快。

是单片机最小系统的重要组成部分。

4.5 复位电路
图4.5
这个子模块是单片机的最小系统中的一部分,当程序出现乱码等情况时,按下复位程序重新开始运行,使计算继续进行。

4.6 与门电路
图 4.6
这个模块是本次设计的亮点利用三个与门矩阵盘的四列引线转换成一条与单片机相连极大的提高了单片机端口的利用率,为以后为计算机附加更多新的功能提供了有利条件。

五总图:
图5.1
七实验改进与心得体会
很明显我的计算器处理数据及显示存在太大的局限性,我觉得主要还是我对程序中的运算模块理解不深,这点仍需大大加强。

这个实验给我的感觉,硬件的处理比软件的设计要难很多。

只要有一点不细心就会有产生错误,只要软件能行,仿真的硬件就能完美运行。

可惜,我就败在LCD1602,刚开始怎么都调不好最后实在没办法,自己又重新查了资料。

最终证实我之前的实验就是LCD的资料有错误。

没知识真可怕!我在磕磕碰碰中,固执的认为LCD资料是正确的,经过改正反而使我对LCD初始化,LCD字符显示,3种不同的矩阵键盘扫描的方法,及软件上的巧妙技巧有了更好的了解。

我在这次实验上,感觉收获了很多.更增加了我对单片机设计的兴趣,为以后设计具有更多功能的计算器打下了坚实的基础。

了解了自己还有很多东西要学。

增强自己的动手能力。

参考文献
【1】谭浩强著《C语言程序设计》第三版
【2】康光华陈大钦张琳主编《电子技术基础模拟部分》第五版
【3】康光华陈大钦张琳主编《电子技术基础数字部分》第五版
【4】周荣富曾技主编《电子线路CAD》
【5】《单片机原理与接口技术》清华版
【6】《零基础学单片机C语言》
【7】《黑色MSC51》
【8】《物联网技术与应用》
【9】《基于Protues的51系列单片机设计与仿真》陈忠平
附录:
#include<reg51.h>
#define CLEARSCREEN LCD_write_command(0x01)
#define uint unsigned int
#define uchar unsigned char
/**************定义接口************************/
#define LCDIO P0
#define KEYBOARD P1//保留
sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_EN=P2^2;
/************************************************/
code uchar mayuan[16]={'0','1','2','3','4','5','6','7','8','9','0','/','* ','-','+','='};//不错,这个比较明了
unsigned char code keycode[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,
0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};//键盘编码值()
int i,j,k=1,s;//
int t,t1,t2,a[];//
void delay(uchar);//延时
/**************定义函数************************/
void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
void LCD_write_command(unsigned char command);//写入指令函数void LCD_write_dat(unsigned char dat);//写入数据函数
void delay_10ms();
initial();
uchar keyscan();//键盘扫描函数
calc(uchar);//计算函数
uchar num,temp,key,keynum;
void main()//主函数
{
LCD_init();
delay_nms(100);
while(1)
{
initial();//有中断
KEYBOARD =0xf0;//键盘的列值全置高电平
}
}
/**********************************开中断***************************************/
initial()
{
EA=1;//总开关
EX0=1;//中断方式0开启
IT0=0;
}
/************************************************************* ******************/
/*********************************中断函数************************************/
void inter0() interrupt 0
{
unsigned char n;
delay_10ms();//延时
if(INT0==0)//没键按下
{
EX0=0;//关中断
n=keyscan();
calc(n);
EX0=1;//开中断
KEYBOARD=0xf0;//键盘的列值全置高电平
}
}
/************************************************************* ***********/
calc(uchar n)
{
if(n<10)//键值小于10
{
t1=t1*10+n;
LCD_write_command(0x00);//写命令语句
LCD_write_dat(mayuan[n]);//写数据函数
}
else
{
if(n==10){LCD_init();t1=0;t2=0,t=0;k=1;}
else{
if(n<15){
t2=t1;t1=0;j=n;
LCD_write_command(0x00);
LCD_write_dat(mayuan[n]);}
else{
LCD_write_command(0x00);
LCD_write_dat(mayuan[n]);
switch(j){
case 11:
t=t2/t1;
break;
case 12:
t=t2*t1;
break;
case 13:
t=t2-t1;
break;
case 14:
t=t2+t1;
break;
}
if(t<=9){ LCD_write_command(0x00);
LCD_write_dat(t+48);}
if(t>9)
{
while(t>9)
{
s=t%10;
t=t/10;
a[k]=s;
k++;
}
if(t<=9){
LCD_write_command(0x00);
LCD_write_dat(t+48);}
for(i=k-1;i>=1;i--)
{
LCD_write_command(0x00);
LCD_write_dat(a[i]+48);
}
}
}
}
}
}
/*****************************************键盘扫描函数
************************************/ uchar keyscan()//键盘扫描
{
KEYBOARD=0xf0;//键盘的列值全置高电平
delay_10ms();//延时
if(KEYBOARD!=0xf0)//有键按下
{
temp=KEYBOARD;//保存键盘此刻的键植
delay_10ms();//延时
if(KEYBOARD==temp)//再次确认键盘是否被按下{
uchar i;
KEYBOARD=0x0f;//键盘的行值全置高电平
delay_10ms();//10MS时间延时
keynum=temp | KEYBOARD;//保存键盘的行值while(KEYBOARD!=0x0f);//松手检测
for(i=0;i<16;i++)
if(keycode[i]==~keynum)
return (i);
}
}
return -1;
/************************************************************* *****************/
/********** 延时**********************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<10;j++);
}
void delay_10ms()//10MS延时
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<120;j++);
}
/**************************************/
/**************写指令函数********************************/
void LCD_write_command(unsigned char command)
{
LCDIO=command;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_EN=0;
LCD1602_EN=1;
delay_nms(10);
}
/***************************************************/
/****************写数据函数************************/ void LCD_write_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_EN=0;
delay_nms(1);
LCD1602_EN=1;
}
/****************************************************/
/************初始化函数****************/
void LCD_init(void)
{
CLEARSCREEN;//clear screen
LCD_write_command(0x38);//set 8 bit data transmission mode LCD_write_command(0x0c);//open display (enable lcd display) LCD_write_command(0x80);//set lcd first display address CLEARSCREEN;//clear screen
}
/****************************************************/
16。

相关文档
最新文档