单片机课程设计说明书Word文档下载推荐.docx
- 文档编号:16979785
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:30
- 大小:299.52KB
单片机课程设计说明书Word文档下载推荐.docx
《单片机课程设计说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计说明书Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
2、进一步熟悉LED显示电路和键盘扫描电路的工作原理和编程方法。
3、了解数据计算的基本方法。
工
作
量
软件编程与硬件调试相结合,绘制设计流程图,并编程进行硬件实现。
划
第一天:
明确课程设计的任务,绘制硬件电路,软件流程图;
第二天:
根据功能要求编写程序;
第三天:
熟悉伟福单片机编程环境,读程序修改软件参数和硬件地址,调试程序;
第四天:
进一步修改程序,查找错误,进行硬件调试;
第五天:
撰写课程设计报告,完成答辩。
考
资
料
1)《单片机原理及应用技术》张淑清编国防工业出版社
2)《过程控制系统及仪表》邵裕森巴筱云编
3)《单片机及应用》李大友编高等教育出版社
4)《机械量测量》机械工业出版社
指导教师签字
张淑清
基层教学单位主任签字
谢平
说明:
此表一式四份,学生、指导教师、基层教学单位、系部各一份。
2012年6月29日
摘要
单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制技术的核心,如今,它已广泛地应用到我们生活的各个领域,如电子、科技、通信、汽车、工业等。
计算器在人们的日常中是比较的常见的电子产品之一,可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次课程设计的任务是利用单片机设计一个计算器,能够进行多位简单的整数加、减、乘、除的运算及具有清零的功能,同时还对其功能进行了扩展,增加了一些特殊运算及错误报警功能。
它主要由MCS51单片机、A8255、数码管显示、键盘、蜂鸣器等模块组成。
本计算器是将键盘输入信息经处理通过缓存输入数码管显示出来,键盘采用行列扫描式,数码管采用动态扫描方式,计算功能通过软件实现,用C语言对单片机可编程芯片进行编程,实现对计算器的设计。
关键字:
单片机、计算器、数码管、键盘
第一章设计目标与设计方案
1.1设计目标与实现方法
1)设计目标:
利用实验仪上提供的显示电路和键盘电路,做一个简单的计算器。
2)实现方法:
为了满足设计的基本要求,可以实现基本的运算(加减乘除),数据清零的功能。
另外,还对计算器的功能进行了扩展,添加了一些特殊运算和错误报警的功能。
我们采用基于MCS51单片机设计计算器,并用LED数码管显示数据,4*6的矩阵键盘实现数据输入,设计仿真和调试要用到WAVE软件及实验箱等。
1.2方案设计
根据功能要求和指标要求,本系统选用MCS51单片机为主控机,通过扩展必要的外围接口电路,实现对计算器的设计。
具体设计方案如下:
①首先实现计算器的基本功能,即可以进行四则运算,对数字的大小范围要求不高,故采用可以进行三位数字的运算,选用4*6的键盘实现数据输入,用6个LED数码管显示数据。
②键盘包括数字键(0~9)、符号键(+、-、×
、÷
)、清除键和等号键,用A、B、C、D、E、F键分别代表“+”、“-”、“*”、“/”、“=”、“清零”的功能。
③扩展功能:
用剩余八个键分别实现求方、取余、排列、比较、组合、平均数、开方、平方的功能,用8255扩展芯片及蜂鸣器实现错误报警的功能。
根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各子程序,层层细化,逐步求精,最终完成一个复杂程序的设计。
程序流程图如下:
第2章硬件模块介绍
2.1运算模块
MCS-51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O等一台计算机所需要的基本功能部件。
如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM/EPROM)、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器(SFR)。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,通过使用单片机编写的程序可以实现高智能,高效率,以及高可靠性!
因此我们采用单片机作为计算器的主要功能部件,可以进行很快地实现运算功能,如图2-1所示:
MCS—51引脚配置图T
2.2输入模块
计算器的数据输入由键盘来实现。
键盘是由若干个按键组成的开关矩阵,它是最简单的单片机输入设备,通过键盘可输入数据和命令,实现简单的人机对话。
键盘根据其结构不同可分为编码式键盘和非编码式键盘两种。
非编码式键盘靠软件识别,节省硬件,通常采用这种键盘。
根据键盘与单片机接法不同,非编码键盘又分为独立式和矩阵式两种。
当系统操作较简单所需按键较少时,可采用独立式非编码键盘,而当系统操作较复杂,需要按键较多时,可采用矩阵式非编码键盘。
如果采用独立按键的方式,会占用大量的I/O口资源,故我们采用矩阵式键盘输入。
采用四条I/O线作为行线,六条I/O线作为列线组成键盘。
在行线和列线的每个交叉点上设置一个按键,这样键盘上按键的个数就为4×
6个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率,如图2—1所示:
图2-1矩阵式键盘
2.2.1键盘的原理
如图2—2所示,采用列扫描法来识别按键。
每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么?
还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;
另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
当无按键闭合时,P10~P13与P14~P17之间开路;
当有键闭合时,与闭合键相连的两条I/O口线之间短路。
判断有无按键按下的方法是:
第一步,置列线P14~P17为输入状态,从行线P10~P13输出低电平,读入列线数据,若某一列线为低电平,则该列线上有键闭合。
第二步,行线轮流输出低电平,从列线P14~P17读入数据,若有某一列为低电平,则对应行线上有键按下。
综合一二两步的结果,可确定按键编号。
但是键闭合一次只能进行一次键功能操作,因此须等到按键释放后,再进行键功能操作,否则按一次键,有可能会连续多次进行同样的键操作。
图2—2键盘结构
2.3显示模块
发光二极管LED是单片机应用系统中的一宗简单而常用的输出设备,其在系统中的主要作用是显示单片机的输出数据、状态等。
因而作为典型的外围器件,LED显示单元是反映系统输出和操作输入的有效器件。
LED具备数字接口可以方便的和大年纪系统连接;
它的优点是工作电压低,响应速度快,价格低,寿命长等,因而在单片机应用系统中获得了广泛的应用,所以在此设计中我首先选用了LED作为显示器件。
2.3.1LED的显示原理
LED显示器的结构及其段名如图2—3所示,连同小数点在内,共有8个LED灯,点亮合适的字段,即能显示0—9的数字和某些字符、符号。
这种显示器有两种形式:
一种是发光二极管的阴极连在一起的共阴极显示器,另一种是阳极连在一起的共阳极显示器。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
图2—3LED段码
为了显示数字或符号,要为LED显示器提供代码,即字形代码。
七段发光二极管,再加上一个小数点位,共计8段,因此提供的字形代码的长度正好是一个字节。
简易计算器用到的数字0~9的共阴极字形代码如下表2—1所示:
显示字形
g
f
d
c
b
a
段码
1
3fh
06h
2
5bh
3
4fh
4
66h
5
6dh
6
7dh
7
07h
8
7fh
9
67h
A
77h
B
7ch
C
39h
D
5eh
E
79h
F
71h
表2-10—9七段数码管共阴极字形代码
2.3.2动态显示的工作原理
点亮显示器的方法有静态和动态两种,这里显示位数较多,采用动态显示较合适,如图2—4所示,所谓动态显示,就是用扫描的方法一位一位轮流点亮显示器的各位,该方法只需一个8位段输出口和一个8位扫描输出口,后者的作用是依次接通各位LED。
对于显示器的每一位来说,每隔一段时间点亮一次,利用人眼的视觉暂留效应可以看到整个动态显示,但必须保证扫描速度足够快,字符才不闪烁。
图2—4数码管的动态显示
2.4音频控制模块
如图2—5所示为音频放大滤波电路,端口输入的方波经放大滤波后,驱动扬声器发声。
声音的频率由端口输入时延时控制,不同频率的脉冲控制喇叭发出不同的音调。
图2—5音频放大滤波电路
第3章软件设计
3.1基本功能设计
1、实验现象:
可以实现基本的运算——加减乘除以及数据清零的功能,用A、B、C、D、E、F键分别代表“+”、“-”、“*”、“/”、“=”、“清零”。
2、程序流程图
数据送显示缓冲子程序框图如下:
是
数据送显示缓冲子程序框图
运算主程序框图如下:
运算主程序流程图
3、基本功能实现程序:
#defineLEDLen6//设置LED显示位数为六位
#definePB12
#definePB01
xdataunsignedcharOUTBIT_at_0x9002;
//位控制口
xdataunsignedcharOUTSEG_at_0x9004;
//段控制口
xdataunsignedcharIN_at_0x9001;
//键盘行码读回口
unsignedcharLEDBuf[LEDLen];
unsignedcharLEDMAP[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//共阴极数码管字形代码
voidDelay(unsignedcharCNT)//延时子程序
{
unsignedchari;
while(CNT--!
=0)
for(i=100;
i!
=0;
i--);
}
voidDisplayLED()//逐位显示数码管
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;
for(i=0;
i<
LEDLen;
i++){
OUTBIT=0;
//trunoffallLED
LED=LEDBuf[i];
OUTSEG=LED;
//段选
OUTBIT=Pos;
//trunononeLED位选
Delay
(1);
Pos>
>
=1;
}
unsignedcharKeyTable[]={
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
//键盘各键代码
unsignedcharTestKey()//检查键盘是否有键按下
return(~IN&
0x0f);
unsignedcharGetKey()//得到按下键的数值
{unsignedcharPos;
unsignedchark;
i=6;
do{
OUTBIT=~Pos;
k=~IN&
0x0f;
}while((--i!
=0)&
&
(k==0));
if(k!
=0){
i*=4;
if(k&
2)
i+=1;
elseif(k&
4)
i+=2;
8)
i+=3;
doDelay(10);
while(TestKey());
return(KeyTable[i]);
//将被按下键的代码返回给主程序
}elsereturn(0xff);
//如果没有键按下,返回清零代码0xff
#defineADD0x0a//宏定义,各运算对应相应键的代码
#defineSUB0x0b
#defineMUL0x0c
#defineDIV0x0d
#defineEQU0x0e
#defineCLR0x0f
voidDisplayResult(signedintResult)//计算结果逐位送入显示缓冲区中
if(Result>
=0){//数值大于0
//不显示符号位
LEDBuf[0]=0;
}else{
//在符号位显示‘-’
LEDBuf[0]=0x40;
Result=-Result;
LEDBuf[1]=0;
LEDBuf[2]=0;
LEDBuf[3]=0;
LEDBuf[4]=0;
//数值对10取模,所得结果为最低位
LEDBuf[5]=LEDMAP[Result%10];
Result=Result/10;
i=4;
//如果数值除以10后不等于0,继续向高位显示
while(Result!
LEDBuf[i--]=LEDMAP[Result%10];
voidmain()
{signedintLast,Result;
//定义整型变量Last,Result分别存放第一个运算数,第二个运算数和结果
unsignedcharOP;
unsignedcharKey;
//定义字符型变量OP,Key分别存放上一运算符、当前输入键
Last=0;
//给变量赋初值
Result=0;
OP=ADD;
DisplayResult(Result);
//将0送到显示缓冲区
while
(1){
while(!
TestKey())DisplayLED();
//用于显示按下的数及结果
//读取键码
Key=GetKey();
//得到按下键的代码
if((Key>
(Key<
=9)){//是数字键
Result=Result*10+Key;
//输入数值
//数值送显示缓冲
}elseif(Key==CLR){//是清零键
Last=0;
//状态清零
DisplayResult(Result);
}elseif((Key==ADD)||(Key==SUB)||(Key==MUL)||(Key==DIV)||(Key=EQU)){//是功能键
switch(OP){//上一按键是?
caseADD:
Result=Last+Result;
break;
caseSUB:
Result=Last-Result;
caseMUL:
Result=Last*Result;
caseDIV:
Result=Last/Result;
//根据上一键进行相应的运算,计算最后结果
if(Key==EQU){//功能键是‘=’
//重新赋初值
}else{//是其它功能键
//保存结果,保存按键功能
Last=Result;
OP=Key;
//将结果送显示缓冲
Result=0;
//等待下一个数值输入.
3.2扩展功能设计
除了可以进行加减乘除的基本运算外,还可进行求方、取余、排列、比较、组合、平均数、开方、平方运算;
当输入、输出超过显示范围时,蜂鸣器会发声报警,起到提示作用。
2、程序流程图:
扩展后程序流程图
3、扩展后的程序:
#include<
reg51.h>
math.h>
#definemode0x82;
#defineLEDLen6//设置LED显示位数为六位
xdataunsignedcharControl_at_0x8003;
xdataunsignedcharSpeaker_at_0x8000;
#defineqf0xff
#defineqy0x14
#
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 说明书