基于51单片机简易计算器课程设计报告书.docx
《基于51单片机简易计算器课程设计报告书.docx》由会员分享,可在线阅读,更多相关《基于51单片机简易计算器课程设计报告书.docx(33页珍藏版)》请在冰豆网上搜索。
基于51单片机简易计算器课程设计报告书
电气与电子信息工程学院
单片机课程设计
设计题目:
简易电子计算器
专业班级:
12级电信
(1)班
学 号:
1
姓名:
峥
指导教师:
章磊艾青
设计时间:
2014/06/03~2014/06/13
设计地点:
K2—407
课程设计任务书
2013~2014学年第2学期
学生:
峥专业班级:
电子信息工程技术(专)2012
(1)班
指导教师:
艾青、章磊工作部门:
电气学院电信教研室
一、课程设计题目:
单片机课程设计
1.出租车计价器系统设计
2.医院住院病人呼叫器的设计
3.作息时间控制器
4.数字温度计的设计
5.火灾报警器的设计
6.电子密码锁
7.电子计算器
8.学生自选
二、课程设计容
1.以单片机为核心器件,构造系统;
2.熟悉、掌握各种外围接口电路芯片的工作原理和控制方法;
3.熟悉、掌握单片机汇编语言的软件设计方法;
4.熟悉、掌握印刷电路板的设计方法;
5.根据具体设计课题的技术指标和给定条件,能独立而正确地进行方案论证和电路设计,要求概念清楚、方案合理、方确、步骤完整;
6.学会查阅有关参考资料和手册,并能正确选择有关元器件和参数;
7.编写设计说明书,参考毕业设计论文格式撰写设计报告(5000字以上)。
三、进度安排
1.时间安排
序号
容
学时安排(天)
1
方案论证和总统设计
2
2
硬件设计
3
3
软件设计
3
4
撰写和打印设计报告
1
5
设计答辩
1
合计
10
设计指导答辩地点:
自控、DSP室
2.执行要求
智能电子产品设计制作共8个选题,每组不超过7人,为避免雷同,在设计中每个同学所采用的方案不能一样。
四、基本要求
(1)进行方案论证并根据要求确定系统设计方案;
(2)绘制系统框图和电气原理草图,程序流程图;
(3)对相关电路进行电路参数计算和元器件选择;
(4)进行软件汇编并调试;
(5)利用Proteus和KeiluVision2对系统进行联调;
(6)绘制系统原理总图,列出原器件明细表;
(7)画出软件框图,列出程序清单;
(8)写出使用说明书;
(9)对设计进行全面总结,写出课程设计报告。
五、课程设计考核办法与成绩评定
根据过程、报告、答辩等确定设计成绩,成绩分优、良、中、与格、不与格五等。
评定项目
基本涵
分值
课程设计考勤
考勤
20分
课程设计报告
完成课程设计任务、报告规性等情况
30分
实物
实物制作情况
30分
答辩
回答问题情况
20分
90~100分:
优;80~89分:
良;70~79分:
中;60~69分,与格;60分以下:
不与格
第1章方案的选择与概述
1.单片机概述
当今时代,是一个新技术层出不穷的时代。
在电子领域,尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校与企事业单位大规模地兴起。
过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战,如不能在较短时间学会单片机,势必会被时代所遗弃,只有勇敢地面对现实,挑战自我,加强学习,争取在较短的时间将单片机技术融会贯通,才能跟上时代的步伐。
它所给人带来的方便也是不可否定的,它在一块芯片集成了计算机的各种功能部件,构成一种单片式的微型计算机。
20世纪80年代以来,国际上单片机的发展迅速,其产品之多令人目不暇接,单片机应用不断深入,新技术层出不穷。
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
2.方案的设计
1.1方案一
根据功能和指标要求,本系统选用MCS-51系列单片机AT89C51为主控机。
通过扩展必要的外围接口电路,实现对计算器的设计。
计算器电路包括三个部分:
显示电路、4*4键扫描电路、单片机微控制电路。
用七段数码管作为显示电路,矩阵键盘作为输入电路。
模块图如图1.1所示。
图1.1方案一模块图
1.2方案二
根据计算器的功能要求,选择AT89C51为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。
外部主要由4*4矩阵键盘和一个液晶显示屏构成,部由一块AT89C51单片机构成。
计算器电路包括四个部分:
选用LCD作为显示部分,矩阵键盘作为输入部分,运算模块,单片机控制部分。
模块图如图1.2所示。
图1.2方案二模块图
1.3整体设计
根据简易计算器的功能和指标要求,本设计系统选用MCS-51系列单片机AT89C51为主控机。
通过扩展必要的外围接口电路,实现对简易计算器的设计。
计算器电路包括三个部分:
显示电路、4*4键扫描电路、单片机微控制电路。
具体设计如下:
(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用七段数码管显示数据和结果。
(2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16个按键即可。
(3)执行过程:
开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。
(4)错误提示:
当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:
当输入的数值或计算得到的结果大于计算器的表示围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在七段数码管上提示错误。
线路原理框图如图1.3所示。
第2章单元电路的硬件
2电路设计原理
2.1键盘接口电路
计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。
矩阵键盘采用四条I/O线作为行线,四条I/O线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为4×4个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
矩阵键盘的工作原理:
计算器的键盘布局如图2.1所示:
一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。
图2.1矩阵键盘布局图
电路中采用4*4键盘作为输入电路模块的话,电路连线会比较简单,而且这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
但是在硬件电路设计的过程中,实验室没有提供矩阵键盘,所以我们将4*4的矩阵键盘换成了16个独立按键。
采用独立按键的方式的话,会占用大量的I/O口资源,但是在这种情况下,编程会很简单。
矩阵键盘部电路图如图2.2所示(见下页)。
2.2显示模块
本设计采用LCD1602液晶显示屏来显示输出数据。
通过D0-D7引脚向LCD写指令字或写数据以使LCD实现不同的功能或显示相应数据。
LCD1602管脚图如图2.3所示。
图2.2矩阵键盘部电路图
图2.3LCD1602管脚图
2.3运算模块(单片机控制)
MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统与特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以与高可靠性!
因此我们采用单片机AT89C51作为计算器的主要功能部件,可以很快地实现运算功能。
图2.4AT89C51管脚图
管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写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口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
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:
来自反向振荡器的输出。
第3章仿真和调试
3.1KEILuVision与porteus仿真软件
3.1.2Porteus介绍
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为风标电子技术)。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机与外围器件。
它是目前最好的仿真单片机与外围器件的工具。
虽然目前国推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
其功能特点:
(1)原理布图
(2)PCB自动或人工布线
(3)SPICE电路仿真
KeiluVision3是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。
KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。
C51编译器的功能不断增强,使你可以更加贴近CPU本身,与其它的衍生产品。
C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:
编译器,汇编器,实时操作系统,项目管理器,调试器。
系统功能:
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间就能学会使用keilc51来开发您的单片机应用程序。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
3.2proteus7.1介绍
Proteus的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。
该软件的特点:
(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
(2)具有模拟电路仿真、数字电路仿真、单片机与其外围电路组成的系统的仿真、RS一232动态仿真、1C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
③目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以与各种外围芯片。
④支持大量的存储器和外围芯片。
总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大,可仿真51、AVR、PIC。
3.1.3测试结果截图
加法计算减法计算
图3.1加法计算结果图3.2减法计算结果
乘法计算除法计算
图3.3乘法计算结果图3.4除法计算结果
4.心得与体会
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。
因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。
我的题目是简易计算器,对于我们这些实践中的新手来说,这是一次考验。
怎么才能找到课堂所学与实际应用的最佳结合点?
怎样让自己的业余更接近专业?
怎样让自己的计划更具有序性,而不会忙无一用?
这都是我们所要考虑和努力的。
经过查找资料,编写程序,加深了对单片机的了解与认识,通过本次试验,最大的收获就是仿真容易,而做实物却会遇到各种各样的困难。
在电脑上仿真,只要程序写对,电器元件连接好就会得出结果。
而做实物,首先,焊接方面因为技术所限和焊枪的一些硬件上的不足,造成焊出来的效果特别差。
其次,各条线路要确保导通,这就要每条都拿万用表来测量,焊接时,也要注意各引脚的位置是否正确,正负极等等,完成之后还不一定会出现结果,还需要再次调试。
本次实验,让我收获很多,感老师的答疑,也感同学的帮助,不仅加深了知识方面,更加锻炼了动手能力,相信以后遇到这方面问题不再会不知所措,让我把知识和实践结合到一起,通过这次实践,我了解自己的不足,汇编语言掌握的不够,焊接方法的不足,使我更加了解以后该在哪个方面补充的自己的不足,总体来说本次课程设计是成功的,使我了解到更多课本上没有的知识,最后再次感所有帮助过我的老师和同学们。
附录
附录1:
源程序代码
#include //头文件
#defineuintunsignedint//
#defineucharunsignedchar
sbitlcden=P2^3;//定义引脚
sbitrs=P2^4;
sbitrw=P2^0;
sbitbusy=P0^7;
chari,j,temp,num,num_1;
longa,b,c; //a,第一个数b,第二个数c,得数
floata_c,b_c;
ucharflag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号
ucharcodetable[]={
7,8,9,0,
4,5,6,0,
1,2,3,0,
0,0,0,0};
ucharcodetable1[]={
7,8,9,0x2f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0,0x3d-0x30,0x2b-0x30};
voiddelay(ucharz)//延迟函数
{
uchary;
for(z;z>0;z--)
for(y=0;y<110;y++);
}
voidcheck()//判断忙或空闲
{
do{
P0=0xFF;
rs=0; //指令
rw=1; //读
lcden=0; //禁止读写
delay
(1);//等待,液晶显示器处理数据
lcden=1; //允许读写
}while(busy==1);//判断是否为空闲,1为忙,0为空闲
}
voidwrite_(uchar)//写指令函数
{
P0=; //com指令付给P0口
rs=0;
rw=0;
lcden=0;
check();
lcden=1;
}
voidwrite_date(uchardate)//写数据函数
{
P0=date;
rs=1;
rw=0;
lcden=0;
check();
lcden=1;
}
voidinit()//初始化
{
num=-1;
lcden=1;//使能信号为高电平
write_(0x38);//8位,2行
write_(0x0c);//显示开,光标关,不闪烁*/
write_(0x06);//增量方式不移位显竟獗暌贫柚?
write_(0x80);//检测忙信号
write_(0x01);//显示开,光标关,不闪烁
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag=0;//flag表示是否有符号键按下,
fuhao=0;//fuhao表征按下的是哪个符号
}
voidkeyscan()//键盘扫描程序
{
P3=0xfe;
if(P3!
=0xfe)
{
delay(20);延迟20ms
if(P3!
=0xfe)
{
temp=P3&0xf0;
switch(temp)
{
case0xe0:
num=0;
break;
case0xd0:
num=1;
break;
case0xb0:
num=2;
break;
case0x70:
num=3;
break;
}
}
while(P3!
=0xfe);
if(num==0||num==1||num==2)//如果按下的是'7','8'或'9
{
if(j!
=0)
{
write_(0x01);
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];
}
else//如果按过符号键
{
b=b*10+table[num];
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=4;//4表示除号已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfd;
if(P3!
=0xfd)
{
delay(5);
if(P3!
=0xfd)
{
temp=P3&0xf0;
switch(temp)
{
case0xe0:
num=4;
break;
case0xd0:
num=5;
break;
case0xb0:
num=6;
break;
case0x70:
num=7;
break;
}
}
while(P3!
=0xfd);
if(num==4||num==5||num==6&&num!
=7)//如果按下的是'4','5'或'6'
{
if(j!
=0)
{
write_(0x01);
j=0;
}
if(flag==0)//没有按过符号键
{
a=a*10+table[num];
}
else//如果按过符号键
{
b=b*10+table[num];
}
}
else//如果按下的是'/'
{
flag=1;
fuhao=3;//3表示乘号已按
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfb;
if(P3!
=0xfb)
{
d