简易计算器的设计.docx
- 文档编号:11476971
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:35
- 大小:363.04KB
简易计算器的设计.docx
《简易计算器的设计.docx》由会员分享,可在线阅读,更多相关《简易计算器的设计.docx(35页珍藏版)》请在冰豆网上搜索。
简易计算器的设计
信息科学与技术学院
单片机
课程设计报告
题目名称:
简易计算器的设计
学生姓名:
学号:
**********
专业班级:
电子信息工程2010级
指导教师:
时间:
2013年7月2日
摘要:
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,但仅单片机方面的知识是不够的,还应根据具体硬件结构、软硬件结合,来加以完善。
计算机在人们的日常生活中是比较常见的电子产品之一。
可是它还在发展之中,以后必将出现功能更加强大的计算机,基于这样的理念,本次设计是用AT89C51单片机、LED显示器、控制按键为元件来设计的计算器。
利用此设计熟悉单片机微控制器及C语言编程,对其片资源及各个I/O端口的功能和基本用途的了解。
关键词:
51单片机;LED;控制按键
1方案选择………………………………………………………………………1
1.1题目要求………………………………………………………………………1
1.2设计方案………………………………………………………………………1
1.3方案原理……………………………………………………………………1
2硬件原理电路图的设计与分析…………………………………………………1
2.1各部分电路的设计思路…………………………………………………1
2.2各部分电路的功能特性……………………………………………5
2.3原理电路图………………………………………………………………6
3程序设计与分析………………………………………………………………6
3.1各模块程序的设计…………………………………………7
3.2完整的程序框图………………………………………………8
4系统仿真图………………………………………………………………………9
4.1计算机硬件连线图…………………………………………………………9
4.2仿真结果……………………………………………………………………9
4.3PCB图……………………………………………………………………11
5系统评价…………………………………………………………………………12
6心得体会…………………………………………………………………………12
参考文献……………………………………………………………………………12
附录………………………………………………………………13
1.方案选择
1.1题目要求
(1)通过小键盘实现数据的输入,并在LED数码管上显示
(2)实现+、-、*、/
(3)在LED数码管上显示结果
(4)并有清零,退出功能
1.2设计方案
(1)键盘部分要求实现+、-、*、/四种运算。
另外包括数字键(0~9)、清除键和等号键,共需要16个键,故采用16个按键即可。
(2)对于输入的数据可以选择在LCD上显示也可以选择在LED数码管显示。
由于要设计的是简单的计算器,可以进行简单的四则运算,对数字的大小范围要求不高,故我们采用可以进行六位数字的运算,选用6个LED数码管显示数据和结果。
(3)在LED上显示数据时,利用AT89C51的引脚来控制驱动电路从而实现位选。
(4)在选择主控机时本设计选用AT89C51。
由于AT89C51不但继承了MCS-51的原有功能,而且AT89C51单片机内的4KBFlash存储器可在线编程或使用编程器重复编程,且价钱较低,故选用AT89C51单片机作为主控机。
1.3方案原理
计算器一般由运算器、控制器、存储器、键盘、显示器、电源和一些可选外围设备及电子组成。
该系统通过AT89C51单片机控制,实现对4*4键盘扫描进行实时的按键检测,并把检测数据存储下来,并显示在LED数码管上。
键盘是计算器的输入部件,显示器是计算器的输出部件。
整个计算器系统的工作过程为:
首先存储单元初始化,显示初始值和键盘扫描,判断按键位置,查表得出按键值,单片机则对数据进行储存与相应处理转换,之后送入数码管显示。
2硬件原理电路图的设计与分析
2.1各部分电路的设计思路
2.1.1系统模块图:
2.1.2输入模块
键盘扫描计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式。
为此,我们引入了矩阵键盘的应用,采用四条I/O线作为行线,四条I/O线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
计算器的键盘布局如图2所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
图2、矩阵键盘布局图
图3、矩阵键盘内部电路图
2.1.2单片机模块
AT89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!
因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能。
2.1.3运算模块
用LED显示数据时分为位选和段选。
此模块用P1.0—P1.3四个P1口引脚来控制位选,用P0口来控制数码管的段选。
由于选用的是六位数的LED所以有六个位选,而在用P1引脚时只有4个引脚可供用,所以选用74HC138译码器来控制6个位选。
用74HC245锁存器来储存数据。
2.1.4显示模块
通常的数码显示器是由7段条形的LED组成,点亮适当的字段,就可显示出不同的数字。
我们采用8段数码管,其中位于显示器右下角的LED作小数点用。
LED显示器有两种不同的形式:
共阴极和共阳极。
本次设计采用共阳极接法。
数字0~9的共阳极字形代码如下表:
显示字型
g
f
e
d
c
b
a
段码
0
0
1
1
1
1
1
1
0c0h
1
0
0
0
0
1
1
0
0f9h
2
1
0
1
1
0
1
1
0a4h
3
1
0
0
1
1
1
1
0b0h
4
1
1
0
0
1
1
0
99h
5
1
1
0
1
1
0
1
92h
6
1
1
1
1
1
0
1
82h
7
0
0
0
0
1
1
1
0f8h
8
1
1
1
1
1
1
1
80h
9
1
1
0
1
1
1
1
90h
2.2各部分电路的功能特性
2.2.1输入模块功能
本设计采用P2口控制键盘。
当无按键闭合时,P2.0~P2.3与P2.4~P2.7之间开路。
当有键闭合时,与闭合键相连的两条I/O口线之间短路。
确定按键编号的方法:
第一步,置列线P2.4~P2.7为输入状态,从行线P2.0~P2.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。
第二步,行线轮流输出低电平,从列线P2.4~P2.7读入数据,若有某一列为低电平,则对应行线上有键按下。
综合一二两步的结果,可确定按键编号。
判断有无按键按下的方法是:
当有键按下时蜂鸣器会发出声音,没有按下时则不会有声音。
但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
2.2.2单片机模块功能
AT89C51是整个设计的核心模块。
利用AT89C51的P0口控制数码管的段选,从而实现数字0—9的显示,P2口控制按键,用P1口的前三个引脚与74HC138译码器相连,从而实现对数码管位选的控制。
2.2.3运算模块的功能
选用74HC138译码器来控制位选。
这样可以节约P1口,在写程序时不至于发生混乱,简单明了。
2.2.4显示模块的功能
LED显示发光二极管LED是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。
因而作为典型的外围器件,LED显示单元是反映系统输出和操作输入的有效器件。
LED具备数字接口可以方便的和系统连接;它的优点是价格低,寿命长,对电压电流的要求低及容易实现多路等。
2.3原理电路图
3程序设计与分析
在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。
设计的中心思想是把一个复杂应用程序按整体功能划分成若干相对独立的程序模块,各模块可以单独设计、编程和调试,然后组合起来。
这种方法便于设计和调试,容易实现多个程序共存,但各个模块之间的连接有一定的难度。
根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计。
3.1各模块程序的设计
3.1.1按键扫描
在C语言的基础上,采用P2口控制键盘。
当无按键闭合时,P2.0~P2.3与P2.4~P2.7之间开路。
当有键闭合时,与闭合键相连的两条I/O口线之间短路。
确定按键编号的方法:
第一步,置列线P2.4~P2.7为输入状态,从行线P2.0~P2.3输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。
第二步,行线轮流输出低电平,从列线P2.4~P2.7读入数据,若有某一列为低电平,则对应行线上有键按下。
综合一二两步的结果,可确定按键编号。
3.1.2验证数据的有效性
由于选用的是六位的数码管,可达到的最大数据为99999,当输入的数据或计算出的数据结果大于99999时,会出错。
具体用如下语句来实现:
bitcheck_num(floatf_num)
{
if(f_num>=100000)
return1;
return0;
}
3.1.3数码管显示
数码管有段选和位选,不同的数据控制不同的位,因此采用C语言中的选择语句来实现对数码管显示的程序控制。
3.1.4计算程序
简单的计算器有加、减、乘、除四种运算。
此部分程序框图如下:
YY
NN
3.2完整的程序框图
Y
NY
N
Y
N
N
Y
4系统仿真图
4.1系统仿真连线图
4.2仿真结果
4.2.1加法
4.2.2减法
4.2.3乘法
4.2.4除法
4.3PCB图
5系统评价
本设计实现了简单计算器的数据输入以及加、减、乘、除、清零等功能。
对于简单的数据可以进行运算,比较方便简洁。
在硬件设计方面所用到的器件相对较少,但主控元件引脚较多,想要完全掌握有点困难,而且在选择端口的时候有点复杂。
在软件方面,实现了设计的要求,程序语句简单,但是代码比较多,容易记错。
由于是简单的计算器所以最大值能达到99999,适合做简单数字较小的运算,精确读可达到0.0001,对要求严格的数字精确度不是太高。
针对以上问题,在熟悉更多器件的情况下,可以利用更换元器件来改进。
6心得体会
通过该计算器的设计我深入学习数码管扫描和键盘控制,提高了对51系列单片机的实际应用能力。
同时也掌握应用程序控制51系列单片机进行简单的数学运算。
提高了对51系列单片机的编程能力。
这门课是最能理论联系实际的课,我们的目的是做出东西,为了这我们需要学关于这方面的各种知识,从被动性的接受知识变成了主动性的寻找知识。
在此制作过程中使我们在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
同时,也深刻认识到要做出来一个东西真的不是一件容易的事,它需要将各个方面的知识都记起来再加以运用,因此这就需要我们有很好的知识基础。
参考文献
[1]张毅刚,彭喜元等.单片机原理及应用(第2版).北京.高等教育出版社,2010
[2]孙育才等.MCS-51系列单片微型计算机及其应用(第4版).上海.东南大学出版社,2004
[3]单片机应用技术(C语言).北京.中国劳动社会保障出版社,2006
[4]武庆生,仇梅等著.单片机原理与应用.北京.电子科技大学出版,1998
[5]朱定华著.单片机原理与接口技术.西安.电子工业出版社,2001
[6]龚运新著.单片机C语言开发技术.北京.北京清华大学出版社,2006
[7]周立功.单片机实验与实践.北京.北京航空航天大学出版社,2004
附录:
程序代码:
#include
typedefunsignedcharuint8;
typedefunsignedintuint16;
typedefunsignedlonguint32;
typedefcharint8;
typedefintint16;
typedeflongint32;
sbitKeyIn1=P2^4;
//P2.4引脚控制KeyIn1;
sbitKeyIn2=P2^5;
//用P2.5引脚控制KeyIn2
sbitKeyIn3=P2^6;
//用P2.6引脚控制KeyIn3
sbitKeyIn4=P2^7;
//用P2.7引脚控制KeyIn4
sbitKeyOut1=P2^3;
//用P2.3引脚控制KeyOut1
sbitKeyOut2=P2^2;
//用P2.2引脚控制KeyOut2
sbitKeyOut3=P2^1;
//用P2.1引脚控制KeyOut3
sbitKeyOut4=P2^0;
//用P2.0引脚控制KeyOut4
sbitADDR0=P1^0;//P1.0引脚控制74HC138译码器的A引脚
sbitADDR1=P1^1;//P1.1引脚控制74HC138译码器的B引脚
sbitADDR2=P1^2;//P1.2引脚控制74HC138译码器的C引脚
sbitADDR3=P1^3;//P1.3引脚控制74HC138译码器的E1引脚
sbitENLED=P1^4;
//P1.4引脚控制74HC138译码器的E2E3引脚
sbitBUZZ=P1^6;
//用P1.6引脚控制蜂鸣器;
#defineFADD10//给FADD赋值为10
#defineFSUB11//给FSUB赋值为11
#defineFMUL12//给FMUL赋值为12
#defineFDIV13//给FDIV赋值为13
#defineFRES14//给FRES赋值为14
#defineFEQU15//给FEQU赋值为15
#defineKEY_DELAY300
//按键延时赋值300
#defineBUZ_DELAY80
//蜂鸣器延时赋值80
codeuint8Ledcode[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};
//数字0~9以及-,E的共阳极字形代码
uint8Led_n=0;
uint8Led_buf[6];
floatTmp1=0,Tmp2=0;//给Tmp1、Tmp2赋初值为0
int8C_flag=0;
/*延时*/
voiddelay(uint16n)
{
while(n--);
}
/*蜂鸣器发声*/
voidbuzzer_sound(void)
{
uint16i;
for(i=0;i { BUZZ=~BUZZ; delay(100);//延时100 } BUZZ=1; } /*按键扫描*/ int8scan_key(void) { int8val=-1; KeyOut1=0;//按键第一列闭合 KeyOut2=1; KeyOut3=1; KeyOut4=1; if(KeyIn1==0) //第一列第一行为数字1 { delay(KEY_DELAY); if(KeyIn1==0) val=1; } if(KeyIn2==0) //第一列第二行为数字2 { { delay(KEY_DELAY); if(KeyIn2==0) val=2; } if(KeyIn3==0) //第一列第三行为数字3 { delay(KEY_DELAY); if(KeyIn3==0) val=3; } if(KeyIn4==0) //第一列第四行为加号键 { delay(KEY_DELAY); if(KeyIn4==0) val=FADD; } while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0)); KeyOut1=1;//第二列闭合 KeyOut2=0; KeyOut3=1; KeyOut4=1; if(KeyIn1==0) //第二列第一行为数字4 { delay(KEY_DELAY); if(KeyIn1==0) val=4; } if(KeyIn2==0) //第二列第二行为数字5 { delay(KEY_DELAY); if(KeyIn2==0) val=5; } if(KeyIn3==0) //第二列第三行为数字6 { delay(KEY_DELAY); if(KeyIn3==0) val=6; } if(KeyIn4==0) //第二列第四行为减号键 { delay(KEY_DELAY); if(KeyIn4==0) val=FSUB; } while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0)); KeyOut1=1; KeyOut2=1; KeyOut3=0; KeyOut4=1; if(KeyIn1==0) { delay(KEY_DELAY); if(KeyIn1==0) val=7; } if(KeyIn2==0) { delay(KEY_DELAY); if(KeyIn2==0) val=8; } if(KeyIn3==0) { delay(KEY_DELAY); if(KeyIn3==0) val=9; } if(KeyIn4==0) { delay(KEY_DELAY); if(KeyIn4==0) val=FMUL; } while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0)); KeyOut1=1; KeyOut2=1; KeyOut3=1; KeyOut4=0; if(KeyIn1==0) { delay(KEY_DELAY); if(KeyIn1==0) val=FRES; } if(KeyIn2==0) { delay(KEY_DELAY); if(KeyIn2==0) val=0; } if(KeyIn3==0) { delay(KEY_DELAY); if(KeyIn3==0) val=FEQU; } if(KeyIn4==0) { delay(KEY_DELAY); if(KeyIn4==0) val=FDIV; } while((KeyIn1==0)||(KeyIn2==0)||(KeyIn3==0)||(KeyIn4==0)); if(val>0) buzzer_sound(); returnval; } /*验证数据有效性*/ bitcheck_num(floatf_num)//最大输入数为99999 { if(f_num>=100000) return1; return0; } /*制作数码管错误标志*/ voidmake_led_error(void) { int8i; for(i=0;i<5;i++) Led_buf[i]=Ledcode[10]; //不显示任何数字 Led_buf[5]=Ledcode[12]; //错误标志E送到显示缓冲 } /*制作数码管整数数据*/ voidmake_led_inumber(int32i_num) { bits_flag=0;//定义负数标志位 int16sit; int8i; if(i_num<0)//如果数值为负 { s_flag=1;//负数标志位有效 i_num=-i_num;//转为正数显示 } ET0=0; for(i=4,sit=10000;i>=1;i--,sit/=10) { if(i_num>=sit) break; Led_buf[i]=Ledcode[10]; i_num-=i_num/sit*sit; } for(;i>=1;i--,sit/=10) { Led_buf[i]=Ledcode[i_num/sit]; i_num-=i_num/sit*sit; } Led_buf[0]=Ledcode[i_num]&0x7F; //最后一位显示小数点 if(s_flag) Led_buf[5]=Ledcode[11]; else Led_buf[5]=Ledcode[10]; ET0=1;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 计算器 设计