单片机计算器课程设计报.docx
- 文档编号:9074608
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:38
- 大小:187.72KB
单片机计算器课程设计报.docx
《单片机计算器课程设计报.docx》由会员分享,可在线阅读,更多相关《单片机计算器课程设计报.docx(38页珍藏版)》请在冰豆网上搜索。
单片机计算器课程设计报
单片机计算器课程设计报
天津职业技术师范大学电子工程学院
电子信息工程
课程设计报告
同组学生姓名(学号):
李佩航0990*******
王芝利09900110502
刘瑶09900120311
班级:
电信1302班
任务分工:
李佩航—程序编写
王芝利—电路原理设计
刘瑶—报告编写
设计时间:
2015年12月28日——2016年1月8日
指导教师:
成丹、梅建强
题目:
六、课程设计小结
七、参考文献
一、课程设计的目的与要求(含设计指标)
1.1设计目的:
要求通过软件设计实现加减乘除计算等功能,并显示。
1.2设计要求
(1)对计算器硬件系统进行设计,利用AT89S52作为主控器件,组成一个能实现加减乘除等运算的计算器,能进行数据归零,按键提示。
(2)运用keil进行计算器软件系统的设计。
1.3设计方案
按照系统设计的功能的要求,确定设计系统由主控模块、显示模块、键盘扫描接口电路、按键提示电路4个模块组成。
系统构成框图如图所示:
系统构成框图1-3-1
4.单片机最小硬件系统
单片机最小应用系统,是指用最少的原件组成的单片机可以工作的系统。
对51系列单片机来说,最小系统应包括单片机、晶振电路、复位电路。
下面介绍51单片机的最小系统电路图:
单片机最小系统图1-4-1
二、方案论证及选择
1、方案一:
采用FPGA控制
FPGA是一种高密度的可编程逻辑器件,自从Xilinx公司1985年推出第一片FPGA以来,FPGA的集成密度和性能提高很快,其集成密度最高达500万门/片以上,系统性能可达200MHz。
由于FPGA器件集成度高,方便易用,开发和上市周期短,在数字设计和电子生产中得到迅速普及和应用,并一度在高密度的可编程逻辑器件领域中独占鳌头。
但是而基于SRAM编程的FPGA,其编程信息需存放在外部存储器上,需外部存储器芯片,且使用方法复杂,保密性差,而其对于一个简单的计算器而言,实用FPGA有点大材小用,成本太高。
2、方案二:
采用AT89S52
单片机是单片微型机的简称,故又称为微控制器MCU(MicroControlUnit)。
通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:
中央处理器CPU,存储器和I/O接口电路等。
因此,单片机只要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机广泛用于智能产品,智能仪表,测控技术,智能接口等,具有操作简单,实用方便,价格便宜等优点,而其中AT89S52以MCS-51为内核,是单片机中最典型的代表,应用于各种控制领域。
通过以上两种方案论证和比较,从设计的实用性,方便性和成本出发,选择了以AT89S52单片机作为中央处理单元进行计算器的设计,这样设计能够实现对六位浮点数的加减和三位浮点数的乘除运算。
三、原理设计(或基本原理)
基本原理,电路仿真,系统组成框图、单元电路设计、总体电路图、元件列表
3.1时钟电路
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。
晶振的频率可以在1MHz-24MHz内选择。
电容取30PF
左右。
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
AT89单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
单片机复位电路如下图所示:
时钟电路图3-1-1
3.2复位电路
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。
复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。
当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。
复位是由外部的复位电路来实现的。
片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。
复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。
当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1K。
复位操作不会对内部RAM有所影响。
常用的复位电路如下图所示:
复位电路图3-2-2
3.3键盘接口电路
键盘接口电路如下图所示:
键盘接口电路3-3-3
4*4矩阵键盘工作原理:
矩阵键盘又称为行列式键盘。
它由4条I/O线为行线,4条I/O线做列线组成,在行线和列线的每个交叉点上设置一个按键。
这样键盘中的按键数为4*4个,所以称之为4*4矩阵键盘,这种行列行线置高电平,接P1口的低四位P1.3-P1.0,列线置低电平,接P1口的高四位P1.7-P1.4高四位为输入,低四位为输出。
1.检测当前是否有键按下,采用逐行扫描法,检测方法为先将P1.7-P1.4依次置0,检验P1.3-P1.0状态,若全为1则无键闭合,否则有键闭合。
2.取出键抖动,当检测到有键按下后,延时一段时间再做下一步判断。
3.若有键按下,应判断究竟是哪一键按下。
方法是对键盘的行线进行扫描
将P1.7-P1.4依次置0时,P1.3-P1.0状态表如下:
P1.3
1
1
1
0
P1.2
1
1
0
1
P1.1
1
0
1
1
P1.0
0
1
1
1
闭合状态
第一行闭合
第二行闭合
第三行闭合
第四行闭合
P10-P13状态表
3.4液晶显示电路
本设计液晶显示部分采用LCD1206电路图如下:
LCD1206电路图3-4-1
液晶显示原理:
线段的显示:
图象形式的液晶显示装置有M×N个基本的显示单元,假设LCD显示64行,每行有128列,一字节的8位对应每8位,即组成方式是由每行16字节,共16×8=128个点而组成的,64×16显示单元与RAM的显示区对应于1024个字节,以对应于每一个显示位置上的每个字节的显示的亮暗程度。
例如,屏幕亮和暗的第一行的内容由16个字节的RAM区内容来决定,而当000H-00FH(000H)=FFH时显示在屏幕左上角的短亮线,长度是8个小点,而当(3FFH)=FFH,就在屏幕的右下角会显示一个简短的亮线;(000H)=FFH(001H)=00H(002H)=00H,......(00EH)=00H(00FH)=00H,第8段亮线和8个暗线,在屏幕顶部显示一条虚线。
这是液晶显示器(LCD)显示的基本原理。
字符的显示:
一个字符在液晶显示中显示是比较复杂的,因为一个字符是由6×8或者8×8的点阵构成的,不仅要找到和显示在屏幕上的显示RAM的8个字节的位置对应的字节,而且还要使每个字节不同的位是“1”,另一个是“0”,
把“1”点亮,而“0”是不亮。
用这样的方法来组成一个字符。
但是显示字符对于内带有字符发生器的控制器,是比较简单的,可以允许控制器工作在文本模式中,根据液晶屏上开始显示的行和列的号,和就可以找出RAM所对应的地址,设置一个游标,发送这个字符所对应的代码就可以了。
汉字的显示:
对于汉字的显示一般是采用图形的方式,将要显示的中国汉字的点阵码(字模提取软件)从微机中提取,每个汉字占32B,分为左,右两半,每半各16B,左边是基数1,3,5……右边是偶数2,4,6…..正确的显示中文字符,根据在LCD上现实的行列号,及行列数可以找出在RAM上所对应的的地址,在光标的位置上加1,发送的第二个字节,先换行再按列对齐,给第三个字节......直到32B完全被显示,就可以在液晶显示屏上得到一个完整的中文字符。
LCD1206引脚如下图所示:
LCD1206引脚图3-4-2
LCD1602采用标准的16脚接口,但在proteus仿真中无字库,故为14脚
第1脚:
VSS为电源接地
第2脚:
VCC接5V电源的正极
第3脚:
V0为液晶显示器的对比度调整端,当接正电源的时时候对比度最弱,而接地电源时对比度最高(而当对比度过高时会,就会产生“鬼影”,使用时可
以通过接一个10K的电位器来调整对比度)。
第4脚:
RS为寄存器选择脚,当高电平1时就选择数据寄存器,当低电平0时就选择指令寄存器。
第5脚:
RW是读写信号线,当高电平时进行读操作,当低电平时进行写操作。
第6脚:
E(或EN)端为使能端,当高电平1时读取信息,当负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:
LCD1602的指令码如下表所示:
指令码
功能
令
R
S
R
/W
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
清除显示
0
0
0
0
0
0
0
0
0
1
将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
地址归位
0
0
0
0
0
0
0
0
1
X
设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM的内容
显示状态
开/关
0
0
0
0
0
0
1
D
C
B
D=1:
整体显示ONC=1:
游标ONB=1:
游标位置反白允许
进入点设定
0
0
0
0
0
0
0
1
I
/D
S
指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位
游标或显示移位控制
0
0
0
0
0
1
S
/C
R
/L
X
X
设定游标的移动与显示的移位控制位;这个指令不改变DDRAM的内容
功能设定
0
0
0
0
1
D
L
X
R
E
X
X
DL=0/1:
4/8位数据RE=1:
扩充指令操作RE=0:
基本指令操作
设定CGRAM地址
0
0
0
1
A
C
5
A
C
4
A
C
3
A
C
2
A
C
1
A
C
0
设定CGRAM地址
设定DDRAM地址
0
0
1
0
A
C
5
A
C
5
A
C
3
A
C
2
A
C
1
A
C
0
设定DDRAM地址(显示位址)第一行:
80H-87H第二行:
90H-97H
读取忙标志和地址
0
1
B
F
A
C
6
A
C
5
A
C
5
A
C
3
A
C
2
A
C
1
A
C
0
读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值
写数据到RAM
1
0
将数据D7——D0写入到内部的RAM(DDRAM/CGRAM/IRAM/GRAM)
读出RAM的值
1
1
从内部RAM读取数据D7——D0(DDRAM/CGRAM/IRAM/GRAM)
3.5蜂鸣器滴滴电路
当矩阵键盘有键按下时,蜂鸣器发出滴滴的声音提示。
蜂鸣器由单片机P3^2口控制,用三极管驱动。
蜂鸣器报警电路图3-5-1
3.6课程设计总图:
电路图3-6-1
四、程序设计
4.1键盘扫描部分程序设计
键扫程序的过程为:
开始时,先判断是否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后确定是否有键按下,若无键按下,则返回继续判断是否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。
流程图如下:
键盘扫描流程图4-1-1
4.2运算部分程序设计
算术运算程序的过程为:
首先判断当前输入的运算符是以下运算符中的哪一个+、-、*、/,如果是+或者是*,则要先判断运算结果是否会溢出,如果结果溢出则不显示运算结果,没溢出就显示运算结果,若是/,则要先判断除数是否为零,为零就不显示结果,不为零则显示运算结果,若是-,则直接显示运算结果。
其流程图如下图所示:
运算流程图4-2-1
4.3显示部分程序设计
显示程序的过程为:
显示开始时,先进行LCD的初始化,判断是否显示汉字或ACSII码或图形,若不显示,则返回,若显示的是汉字或ACSII码,则进行相应功能的设置,然后送地址和数据,再判断是否显示完,显示完则返回,没有显示完则继续送地址,若显示的是图形,则先进行相应功能的设置,再送行地址和列地址,然后送数据,
最后判断是否显示完,显示完则返回,没有显示完则继续送行地址和列地址。
其流程图如下所示:
显示流程图4-3-1
4.4主函数程序设计
主函数流程图如下所示:
主函数流程图4-4-1
五、方案实现与测试(或调试)
功能和操作:
加减乘除运算和显示。
①上电后,屏幕初始化。
②计算。
按下数字键,屏幕显示要运算的第一个数字,再按下符号键,然后再按下
数字键,屏幕显示要运算的第二个数字,最后按下“﹦”号键,屏幕上显示出计算结果。
③如果要再次计算,可以按下“ON/C”键清零,或者按下单片机的复位键,重新初始化。
#include
#defineuintunsignedint
#defineucharunsignedchar
//--------LCD1602-------------------
//P00-07====D0-7
sbitrs=P2^2;//指令or数据
sbitwela=P2^1;//读or写
sbitlcden=P2^0;//使能信号
//--------LCD1602-------------------
//--------KEY-----------------------
//P1口
//--------KEY-----------------------
//--------BUZZER-----------------------
sbitbuzzer=P3^2;//蜂鸣器
//--------BUZZER-----------------------
ucharcodetable[]="";
longintdata_a,data_b;//第一个数和第二个数
longintdata_c;//计算结果
uchardispaly[10];//显示缓冲
//=====================5ms延时==============================
voidDelay5Ms(void)
{
unsignedintTempCyc=5552;
while(TempCyc--);
}
//************************************************************************/
//描述:
延时tus函数
//************************************************************************/
voidLCD_Delay_us(unsignedintt)
{
while(t--);//t=0,退出
}
//************************************************************************/
//描述:
延时tms函数
//************************************************************************/
voidLCD_Delay_ms(unsignedintt)
{
unsignedinti,j;
for(i=0;i for(j=0;j<113;j++);//执行113次循环 } //=======================一声提示音,表示有效输入======================== voidOneBuzzer(void) { buzzer=0; Delay5Ms(); buzzer=1; } //************************************************************************/ //描述: 1602液晶写指令 //************************************************************************/ voidwrite_com(ucharcom)//1602液晶写指令 { rs=0;//写指令 lcden=0;//使能1602 P0=com;//写入指令com LCD_Delay_ms (1);//延时1ms lcden=1;//使能1602 LCD_Delay_ms (2);//延时2ms lcden=0;//使能1602 } //************************************************************************/ //描述: 1602液晶写数据 //************************************************************************/ voidwrite_date(uchardate)//1602液晶写数据 { rs=1;//写数据 lcden=0;//使能1602 P0=date;//写入数据date LCD_Delay_ms (1);//延时1ms lcden=1;//使能1602 LCD_Delay_ms (2);//延时2ms lcden=0;//使能1602 } //************************************************************************/ //描述: 指定x,y写入字符函数 //************************************************************************/ voidW_lcd(unsignedcharx,unsignedchary,unsignedcharData) { if(y==0){write_com(0x80+x);}//第一行 else{write_com(0xc0+x);}//第二行 write_date(Data);//写入数据 } //指定x,y写入字符串函数 voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s) { if(y==0){write_com(0x80+x);}//第一行 else{write_com(0xC0+x);}//第二行 while(*s)// {write_date(*s);s++;}//写入数据 } //************************************************************************/ //描述: 初始化液晶,及画面初始化 //************************************************************************/ voidinit_lcd(void)//初始化液晶,及画面初始化 { wela=0;//写液晶 lcden=0;//使能1602 write_com(0x38);//8位总线,双行显示,5X7的点阵字符 LCD_Delay_us(100);//延时100us write_com(0x0c);//开显示,无光标,光标不闪烁 write_com(0x06);//光标右移动 write_com(0x01);//清屏 write_com(0x80);//DDRAM地址归0 } //=====================按键检测并返回按键值=============================== unsignedcharkeynum(void)//键盘扫描函数,使用行列反转扫描法 { ucharcord_h,cord_l;//行列值中间变量 P1=0x0f;//行线输出全为0 cord_h=P1&0x0f;//读入列线值 if(cord_h! =0x0f)//先检测有无按键按下 { Delay5Ms(); Delay5Ms();//去抖 if(cord_h! =0x0f) { cord_h=P1&0x0f;//读入列线值 P1=cord_h|0xf0;//输出当前列线值 cord_l=P1&0xf0;//读入行线值 while((P1&0xf0)! =0xf0);//等待松手 OneBuzzer(); return(cord_h+cord_l);//键盘最后组合码值 } } return(0);//返回该值 } //************************************************************************/ //描述: 逐行键盘扫描 //************************************************************************/ shortkeycheckdown()/*反转法键盘扫描*/ { //shorttemp1,temp2,temp,a=0xff; //P2=0xf0;/*输入行值(或列值)*/ //LCD_Delay_ms(20);/*延时*/ //temp1=P2;/*读列值(或行值)*/ //P2=0xff; //LCD_Delay_ms(20);/*延时*/ //P2=0x0f;/*输入列值(或行值)*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 计算器 课程设计