tc蜂鸣器流水灯数码管显示作息时间控制单片机课程设计2.docx
《tc蜂鸣器流水灯数码管显示作息时间控制单片机课程设计2.docx》由会员分享,可在线阅读,更多相关《tc蜂鸣器流水灯数码管显示作息时间控制单片机课程设计2.docx(28页珍藏版)》请在冰豆网上搜索。
tc蜂鸣器流水灯数码管显示作息时间控制单片机课程设计2
1绪论
1.1课程设计目的
《单片机原理及应用》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。
在课程设计过程中,在教师指导下,运用工程的方法,通过一个简单课题的设计练习,可使学生初步体验单片机应用系统的设计过程、设计要求、完成工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。
通过课程设计,应能加强学生如下能力的培训:
1、独立工作能力和创造力;
2、查阅图书资料,产品手册和各种工具书的能力;
3、工程绘图的能力;
4、编写技术报告和编制技术资料的能力;
5、综合运用专业及基础知识,解决实际工程技术问题的能力。
1.2设计要求
1.2.1总体要求
(1)独立完成设计任务
(2)绘制系统硬件总框图
(3)绘制系统原理电路图
(4)制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释;
(5)制定编写调试方案,编写用户操作使用说明书
(6)写出设计工作小结。
对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后研修方向。
1.2.2具体要求
本次工程实践的校内部分主要以单片机为基础,进行单片机软件编程,目的是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬件部分已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的辨别和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进行仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因,并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。
软件编程是本次工程实践的重要环节。
在为期两周的工程实践中,将占据主要时间,学生要完成的软件编程任务主要包括以下几点:
(1)熟悉KeilC51编程平台及相关编程软件
(2)编写、调试蜂鸣器、继电器动作、方波程序并进行软硬件联调
(3)编写、调试LED流水灯(循环显示)程序并进行软硬件联调
(4)编写、调试键盘扫描子程序并进行软硬件联调
(5)编写、调试数码管动态扫描程序并进行软硬件联调
(6)电子钟设计(包括键盘、时钟、显示等)
(7)作息时间控制系统设计(包括键盘、显示、时钟、报警等)
(8)智能交通灯控制系统设计
(9)车速里程测量、显示设计
1.3设计内容及方法
单片机原理及其应用课程设计通常选择一般常见、常用的简单应用装置或对象进行微机控制。
所涉及的系统可以实际制作,也可以实验室模拟,具体步骤和内容如下
1.3.1设计准备
认真研究设计任务书,明确设计要求、条件、内容、和步骤;通过阅读有关资料,了解设计对象;复习课程有关内容,熟悉有关单元电路的设计方法和设计步骤;搜集、分析、消化相关资料、软件等,掌握微型计算机应用系统软件的设计方法;准备好设计需要的图书、资料和工具;拟定设计计划等。
1.3.2功能设计及系统总体设计
要求学生有创新精神和创新意识,分析所掌握的资料,了解设计对象的功能。
在充分考虑功能设计后,进行总体设计,以功能、结构为标,制定总体方案,规划硬、软件功能分配等;初步确定关键元器件地选择。
2硬件电路总体设计
2.1硬件总框图
硬件总框图如下图2.1所示
主控电路
按键控制扫描模块
DS1302实时时钟模块
数码管显示模块
LED显示模块
扬声器模块
图2.1硬件总框图
原理说明:
本电路以单片机AT89C52为主控电路,分别连接按键控制扫描模块、时钟模块、数码显示模块、LED显示模块、扬声器模块。
首先,按键扫描模块的四个按键分别用来控制数码显示、LED显示和扬声器工作,P0口用来控制其段选以显示相应的数值。
P1口控制数码管的位选,以显示相应的数值。
在其位选控制部分,采用了9012型的三极管,要求当P1口输出低电平时,位选成功,使得该位选的数码管亮,数码管显示时分通过按键1控制。
P2口作为输出口,用来控制LED的亮灭,要使其亮只需要让P2.0-P2.7口保持低电平就可以使8个灯亮起来。
同时通过P3.4端控制蜂鸣器发生,当P3.4输出低电平时候使蜂鸣器发出声音,按下按键3时使蜂鸣器发声。
最后通过按按键4实现作息时间控制的功能。
2.1.1主控电路
本次课程设计中主要是设计一个以作息时间控制为主的多功能控制系统。
该设计中我们主控电路部分采用了单片机AT89C52芯片来实现这些功能,AT89C52是一个低电压,高性能CMOS的8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器和256B的随机存取数据存储器(RAM)。
其引脚如下2.2图所示:
图2.2.AT89C52引脚图
VCC:
供电电压。
GND:
接地。
P0口(P0.0-P0.7):
P0口来控制数码管的段选,以显示相应的数值。
P1口(P1.0-P1.7):
P1口用来控制数码管的位选,以达到动态显示的效果。
P2口(P2.0-P2.7):
P2口来控制LED的亮灭。
P3口(P3.0-P3.7):
P3.0为RXD(串行输入口),P3.1为TXD(串行输出口),P3.2为/INT0(外部中断0),P3.3为/INT1(外部中断1),P3.4为T0(记时器0外部输入),
P3.5为T1(记时器1外部输入),P3.6为/WR(外部数据存储器写选通),P3.7为/RD(外部数据存储器读选通)。
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义。
2.1.2按键控制扫描模块
按键用于控制数码显示、LED显示、扬声器等模块的工作。
通过扫描按键是否按下,来设定各模块的工作情况,使各模块可以在按键的控制下,有序地进行
工作设计中使用单个按键实现单个功能,属于较为简单的控制方式.如图2.3所示
图2.3按键输入电路
在多功能系统设计的实验中中我们使用四个按键分别与单片机的P1.4、P1.5、P1.6、P1.7相连,按键1控制数码管显示、按键2控制LED流水灯、按键3控制蜂鸣器发声,按键4控制作息时间。
通过按下相应的按键来处理相应的程序。
2.1.3DS1302实时时钟模块
如图DS1302模块
图2.4DS1302模块电路图
如上图2.4所示DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
DS1302与CPU的连接:
实际上,在调试程序时可以不加电容器,只加一个32.768kHz的晶振即可。
只是选择晶振时,不同的晶振,误差也较大。
如下图2.5所示
图2.5Ds1302引脚图
其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),SCLK始终是输入端。
如图2所示DS1302控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。
同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,利用单片机的外部中断来处理中断系统通过数码管显示出时间。
2.1.4数码管显示模块
设计中采用四位共阳极数码管,共阳极是指其公共端接正极,通过单片机AT89C52的P1口控制其位选,以达到动态显示的效果,再通过P0口,控制其段选以显示相应的数值。
在其位选控制部分,采用了一个9012型三极管,要求当P1口输出低电平时,位选成功。
如下图2.6所示
图2.6数码管显示电路
硬件电路中,数码管显示的小时和分.小时通过按键2控制,分通过按键3控制。
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
①静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:
),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
②动态显示驱动:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
2.1.5LED显示模块
LED(LightEmittingDiode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。
LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。
半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。
但这两种半导体连接起来的时候,它们之间就形成一个“P-N结”。
当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。
而光的波长也就是光的颜色,是由形成P-N结的材料决定的。
如下图2.7所示
图2.7LED显示电路
本次设计中通过按键2来控制其流水显示,打开电源后按下按键2流水灯模块有效。
由于电路中LED为共阳极,故控制流水灯显示的P2口应为低电平时才有效。
从原理图中可以看出,如果要让接在P2.0口的LED1亮起来,那么只要把P2.0口的电平变为低电平就可以了;相反,如果要接在P2.0口的LED1熄灭,就要把P2.0口的电平变为高电平;同理,接在P2.1~P2.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
2.1.6扬声器模块
扬声器模块通过按键3来实现。
要求扬声器能够发出连续,断续的声音及音
乐,我们可以选择一个蜂鸣器来实现这些功能。
如下图2.8所示
图2.8扬声器电路
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
下面我们以电磁式蜂鸣器为例来说明它的工作原理:
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声,当输出高电平时,三极管截止,蜂鸣器的两引脚间的直流电压接近于0V,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,使蜂鸣器的两个引脚间获得将接近+5V的直流电压,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制IO口输出的电平来控制蜂鸣器是否发出声音,实现各种可能音响的产生。
在这个设计中是通P3.4口控制其发声的。
由于P3.4与ds1302是连在一起的,当P3.4口输出低电平时蜂鸣器发出声响。
故只要ds1302工作,就可以设定使扬声器发出声音。
2.2硬件原理图
图2.9硬件原理图
3软件流程框图
3.1流程框图
3.1.1主程序流程图
图3.1主流程图
3.1.2蜂鸣器流程图
图3.2蜂鸣器流程图
3.1.3流水灯程序流程图
Y
Y
开始
循环初始化
表头首指送地址指针
将寄存器A清零
N
N
返回主程序
表中花样送A
显示并延时
花样是否结束?
到花样结束标志?
图3.3流水灯程序流程图
3.1.4时间显示流程图
图3.4时间显示流程图
3.1.5作息时间控制流程图
Y
开始
扬声器预响时间设置
DS1302实时时间读取
两时间是否
相同?
扬声器发声
N
延时关闭扬声器
图3.5作息时间控制流程图
作息时间控制的设计是比较简单的,其基本思路是我们设置扬声器的预响时间,然后通过DS1302实时时间的读取与预响时间做比较,如果两者相同那么扬声器发声,如果两者不相同那么返回DS1302实时时间继续读取,直到与扬声器预响时间相同扬声器发声,然后通过延时关闭扬声器。
3.2完整的程序清单及注释
主程序清单:
ORG0000H
AJMPMAIN
ORG0100H
MAIN:
MOVSP,#60H
JNBP1.4,K1CHECK
JNBP1.5,K2CHECK
JNBP1.6,K3CHECK
JNBP1.7,K4CHECK
SJMPMAIN
K1CHECK:
;去抖动,按下KEYA,跳转到KEYA子程序
JBP1.0,KEYA
SJMPKEYA
KEYA:
MOVSP,#70H;给堆栈指针赋初值
MOVR2,#08H;蜂鸣器响声计数
START0:
SETBP3.4;P3.4口置高电平
LCALLDELAY;调用延时子程序
CLRP3.4;P3.4口取反
LCALLDELAY
DJNZR2,START0;判断计数是否结束,否跳到START0处
SJMPMAIN;返回主程序
DELAY:
;延时子程序
MOVR7,#02
DELAY0:
MOVR6,#200
DELAY1:
MOVR5,#248
DJNZR5,$
DJNZR6,DELAY1
DJNZR7,DELAY0
RET
K3CHECK:
JBP1.6,KEYC
SJMPKEYC
K4CHECK:
JBP1.7,KEYD
SJMPKEYD
END
K3CHECK:
;去抖动,按下KEYA,跳转到KEYA子程序
JBP1.4,KEYA
SJMPKEYA
KEYA:
MOVSP,#70H;给堆栈指针赋初值
MOVR2,#0FFFFH;蜂鸣器响声计数
START0:
SETBP3.4;P3.4口置高电平
LCALLDELAY;调用延时子程序
CLRP3.4;P3.4口取反
LCALLDELAY
DJNZR2,START0;判断计数是否结束,否跳到START0处
SJMPMAIN;返回主程序
DELAY:
;延时子程序
MOVR7,#02
DELAY0:
MOVR6,#12
DELAY1:
MOVR5,#75
DJNZR5,$
DJNZR6,DELAY1
DJNZR7,DELAY0
RET
K2CHECK:
;去抖动,按下KEYB,跳转到KEYB子程序
JBP1.5,KEYB
SJMPKEYB
KEYB:
MOVSP,#80H
MOVR2,#18H;LED循环闪亮三次
MOVA,#0FEH;A中赋初始值
LOOP:
MOVP2,A;流水灯闪亮
LCALLDELAY3
RLA;A中初值左移
DJNZR2,LOOP
MOVA,#0FFH;三次结束后,熄灭所以LED灯
MOVP2,A
SJMPMAIN;返回主程序
DELAY3:
;延时子程序
MOVR7,#20
DELAY4:
MOVR6,#125
DELAY5:
MOVR5,#255
DJNZR5,$
DJNZR6,DELAY5
DJNZR7,DELAY4
RET
数码显示子程序
DISPLAY:
MOVDPTR,#DIG_CODE;显示分钟
MOVP1,#11110111b
MOVA,MIN
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
MOVP1,#11111011b
MOVA,MIN
SWAPA
ANLA,#07H
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY;显示小时
MOVP1,#11111101b
MOVA,H
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
MOVP1,#11111110b
MOVA,H
SWAPA
ANLA,#03H
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
RET
MOVSP,#60H
MOVTMOD,#10H;初始化定时器及中断
SETBET1;开定时器1中断
SETBEA
SETBTR1;启动定时器1
T1INT:
JNBTF1,T1INT
SJMPK
LJMPSTART0
LCALLSETDS1302
LCALLGET1302
LCALLDISPLAY
MOVR3,#25
MOVTMOD,#01H
MOVTH0,#70H;置定时器初值(7000H=28672)
MOVTL0,#00H;定时(216-28672)*12/11.0592=40000us=40ms
SETBTR0;启动定时器0
LP1:
JBCTF0,LP2;查询计数溢出
SJMPLP1;未到40ms继续计数
LP2:
MOVTH0,#0B8H;重新置定时器初值
MOVTL0,#00H
LCALLDISPLAY;显示
DJNZR3,LP1;未到1S继续循环
LCALLGET1302;每过1s从DS1302读取一次时间
Movr3,#25
SJMPlp1;数码显示子程序
DISPLAY:
MOVDPTR,#DIG_CODE;显示小时
MOVP1,#11111101b
MOVA,H
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
MOVP1,#11111110b
MOVA,H
SWAPA
ANLA,#03H
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
RET;显示分
MOVP1,#11111101b
MOVA,minute
ANLA,#0FH
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
MOVP1,#11111110b
MOVA,minute
SWAPA
ANLA,#03H
MOVCA,@A+DPTR
MOVP0,A
LCALLDIS_DELAY
RET
4调试情况及小结
4.1硬件调试
硬件调试分为静态调试和动态调试,对于硬件调试而言,只要认真焊接,硬件一般不会出现什么问题的。
没有出现什么问题。
用所给的调试程序,调试结果很好,各模块都能正常工作。
静态调试一般采用的工具是万用表,其是在用户系统未工作时的一种硬件检测。
动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。
调试步骤是:
首先把电路分成若干模块,调式过程中与该模块无关的元件可以不加考虑,这样可把故障限定在一定的范围内;故障清除后,把各个模块合在一起进行联调,即可完成整个硬件调试工作。
4.2软件调试
软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。
4.3软硬件调试
软硬件联调是指把调试无误的软件程序烧制进单片机芯片内部,通上电源后,检查硬件工作是否有预期的效果,如果没有则需检测软件是否在实现功能上有欠缺。
若有错误,通过改写软件来调试,直至达到预期效果,则设计圆满成功。
4.4Proteus软件简介
Proteus软件是来自英国Labcenterelectronics公司的EDA工具软Proteus软件有近20年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理