完整word版单片机电子时钟课程设计.docx
《完整word版单片机电子时钟课程设计.docx》由会员分享,可在线阅读,更多相关《完整word版单片机电子时钟课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
完整word版单片机电子时钟课程设计
一、设计目的
二、总体设计
系统硬件总框图
三、硬件单元设计
电路总设计图
NE55P模块
LED灯显示
数码管显示
DS1302模块
时钟控制
蜂鸣器键盘扫描
AT89C52
四、软件单元设计
程序清单
五、调试
软件调试、硬件调试
六、设计总结
七、参考文献
一、设计目的
1总体要求
(1)独立完成设计任务
(2)绘制系统硬件总框图
(3)绘制系统原理电路图
(4)制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释;
(5)制定编写调试方案,编写用户操作使用说明书
(6)写出设计工作小结。
对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后研修方向。
2具体要求
本次工程实践的校内部分主要以单片机为基础,进行单片机软件编程,目的是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬件部分已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的辨别和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进行仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因,并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。
软件编程是本次工程实践的重要环节。
在为期两周的工程实践中,将占据主要时间,学生要完成的软件编程任务主要包括以下几点:
1)、熟悉KeilC51编程平台及相关编程软件
2)、编写、调试蜂鸣器、继电器动作、方波程序并进行软硬件联调
3)、编写、调试LED流水灯(循环显示)程序并进行软硬件联调
4)、编写、调试键盘扫描子程序并进行软硬件联调
5)、编写、调试数码管动态扫描程序并进行软硬件联调
6)、电子钟设计(包括键盘、时钟、显示等)
7)、温度测量控制系统设计(包括键盘、显示、控制、报警等)
其中前五个内容是后两个内容的基础,主要是编制一些子程序,为后继的整个系统设计打下基础。
电子钟设计一个简单的单片机编程设计,要求电子钟软件程序必须具备键盘扫描、数码管显示、时钟以及日历、秒表和闹钟功能。
温度测量与控制系统设计是一种非常简单而又应用普遍的温度控制系统、他包括温度采集、信号转换、单片机处理以及控制、报警等部分。
要求学生采用声光报警方式。
二、总体设计
2.1系统硬件总框图
系统设计总框图
此次课程设计,AT89C52是一种带2K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
此次课程设计的电子钟就是由AT89C52单片机、时钟电路、报警电路,LED流水灯电路,动态数码管显示电路、音乐电路等组成。
运用汇编语言来控制单片机AT89C52来实现LED流水灯、报警器、动态数码显示、电子音乐等功能,并在此基础上综合运用上述功能,实现电子钟的设计(包括键盘、时钟、显示等),温度测量控制系统(包括键盘、显示、控制、报警等)。
且本设计中的AT89C52单片机是整个工作过程的核心,是整个设计灵魂,它控制了脉冲时序的产生,显示信号的发送控制显示LED的选择。
同时也考虑到AT89C52单片机来制作电子时钟其最大的好处就是可最大的调整时钟使其准确度更高。
三、硬件单元设计
3.1电路总设计图
电路总设计图
3.2NE555P模块
555定时器可构成多谐振荡器,是一种性能较好的时钟源。
调节电位器RW1,使在555输出端3获得频率为50—60Hz的矩形波信号,当基本RS触发器Q为1时,门5开启,此时脉冲信号通过门5作为计数脉冲加于计数器的计数输入端CP。
3.3LED灯显示
Led灯原理图
本次课程设计中,“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,单片机可工作。
要用外加电源和分压电阻来控制低电平驱动点亮,因为单片机不能直接高电平驱动LED灯。
如图D1-D8和R1、R2以及R6-R11连接到单片机IO口,当P1口某脚变低时相应LED发光。
实现LED灯的闪烁,只需利用编程方法依次从低位到高位逐个变为低电平,等待少许时刻再变高即可。
3.4数码管显示
为了能使电路简单我们采用数码管动态显示方式。
数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
数码管显示图
3.5DS1302模块
DS1302的RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
其管脚图如下:
DS1302管脚图
各引脚功能:
Vcc1为后备电源,VCC2为主电源,X1和X2是振荡源,
SCLK为输入端
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
3.6时钟控制
石英晶体振荡器是利用石英晶体的压电效应制成的一种谐振器件,它的基本构成大致是:
从一块石英晶体上按一定方位角切下薄片,在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器。
其产品一般用金属外壳封装,也有用玻璃壳、陶瓷或塑料封装的。
HMOS型MCS-51外部时钟源的接发:
在XTLA1和XTLA2两端跨接晶体或陶瓷振荡器,与内部反相器构成稳定的自激振荡器。
其发出的时钟脉冲直接送入片内定时控制部件,其中C电容对频率有微调作用。
时钟电路
3.7蜂鸣器
蜂鸣器原理图
蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的。
因此需要一定的电流才能驱动它,单片机IO口输出的电流较小,其TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
程序中通过改变单片机对应IO口输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。
另外,改变其占空比,也可以控制蜂鸣器的声音大小。
可以有两种驱动方式,即用PNP或NPN三极管电流放大电路驱动。
本电路通过一个PNP三极管9012来放大驱动蜂鸣器,当输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。
因此,我们可以通过程序控制IO口输出的电平来使蜂鸣器发出声音和关闭,从而实现各种可能音响的产生。
启动报警子程序如下:
停止报警子程序如下:
START:
SETBP1.0STOP:
CLRP1.0
RETRET
3.8键盘
键盘扫描流程图
在MCS-51系列单片机的指令系统中设有散转指令JMP@A+DPTR,可看成是专门配合键入程序是整个应用程序的核心部分。
键盘的操作,无论是按键或键盘都是利用机械触点的合、断作用。
一个电压信号通过机械触点的闭合、断开过程。
由于机械触点的弹性作用,在闭合及断开瞬间均有抖动过程,会出现一系列负脉冲。
抖动时间的长短,与开关的机械特性有关,一般为5—10ms。
一组按键或键盘都要通过I/O口线查询按键的开关状态。
且独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,在按键数量较多时,I/O口线浪费较大。
3.9AT89C52
AT89C52是此次课程设计的核心部分。
其管脚图如下:
AT89C52管脚图
AT89C52是低功耗、高性能的CMOS8位单片机。
片内带有8KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外,AT89C52的指令系统和引脚与80C52完全兼容。
AT89C52各管脚功能如下:
VCC:
供电电压;GND:
接地;P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
;P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流;P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流;P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入;P3口管脚功能:
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(外部数据存储器读选通);P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许输出电平用于锁存地址的地位字节。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
四、软件单元设计
程序清单
T_RBitP3.4;实时时钟复位线引脚
T_CBitP3.2;实时时钟时钟线引脚
T_IBitP3.3;实时时钟数据线引脚
SECEQU30H
MINEQU31H
HEQU32H
DEQU33H
MONEQU34H
WEQU35H
YEQU36H
ORG0000H
LJMPstart
ORG001bH
AJMPINTT1
ORG0030H
START:
LCALLKEY
AJMPSTART
;*******蜂鸣器*******
KEY0:
SETBP3.4
LCALLDELAY
LCALLDELAY
CLRP3.4
LCALLDELAY
LCALLDELAY
SETBP3.4
LCALLDELAY
LCALLDELAY
CLRP3.4
LCALLDELAY
LCALLDELAY
SETBP3.4
LCALLDELAY
LCALLDELAY
CLRP3.4
RET
;*******流水灯*******
KEY1:
MOVR2,#2
REB:
MOVR1,#8
MOVA,#0AFH
LOOPB:
MOVP2,A
RLA
LCALLDELAY
DJNZR1,LOOPB
DJNZR2,REB
RET
;*******日期*******
KEY2:
CLRT_R
CLRT_C
MOVSP,#60H;修改堆栈
MOVSEC,#00H;初始时间设为10:
00:
00
MOVMIN,#00H
MOVH,#10H
MOVD,#18h;初始日期设为08年1月18日第一周
MOVMON,#01H
MOVW,#01H
MOVY,#08H
LCALLSETDS1302
LCALLGET1302
LCALLDISPLAY
MOVR3,#25
MOVTMOD,#01H
MOVTH0,#70H;置定时器初值(定时40ms)
MOVTL0,#00H
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,#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;显示延时5ms子程序
DIS_DELAY:
PUSHPSW
MOVR7,#10
D1:
MOVR6,#248
D2:
DJNZR6,$
DJNZR7,D1
POPPSW
RET;设置DS1302初始时间,并启动计时
SETDS1302:
CLRT_R
NOP
CLRT_C
NOP
SETBT_R
NOP
MOVB,#8EH;写控制命令字
LCALLINPUTBYTE
MOVB,#00H;写保护关闭
LCALLINPUTBYTE
SETBT_C
NOP
CLRT_R
MOVR0,#SECOND;内存中的时间首地址
MOVR1,#80H;DS1302中的时间首地址
MOVR7,#7;字节数
SETLOOP:
CLRT_R
NOP
CLRT_C
NOP
SETBT_R
NOP
MOVB,R1;写命令字
LCALLINPUTBYTE
MOVA,@R0;设置时间
MOVB,A
LCALLINPUTBYTE
INCR0
INCR1
INCR1
SETBT_C
NOP
CLRT_R
NOP
DJNZR7,SETLOOP
CLRT_R
NOP
CLRT_C
NOP
SETBT_R
NOP
MOVB,#8EH
LCALLINPUTBYTE
MOVB,#80H;开写保护
LCALLINPUTBYTE
SETBT_C
NOP
CLRT_R
NOP
RET
;从DS1302读取时间
GET1302:
MOVR0,#SECOND
MOVR1,#81H;DS1302中读时间的首地址
MOVR7,#7
GETLOOP:
CLRT_R
NOP
CLRT_C
NOP
SETBT_R
NOP
MOVB,R1
LCALLINPUTBYTE;写命令字
LCALLOUTPUTBYTE;读时间
MOV@R0,A;将从DS1302中读取的时间从内存中保存
INCR0;修改地址指针
INCR1
INCR1
SETBT_C
NOP
CLRT_R
NOP
DJNZR7,GETLOOP
RET
;向DS1302写一个字节
INPUTBYTE:
MOVR4,#8
INPUTLOOP:
MOVA,B
RRCA
MOVB,A
MOVT_I,C
SETBT_C
NOP
NOP
NOP
CLRT_C
DJNZR4,INPUTLOOP
RET
;从DS1302读一个字节
OUTPUTBYTE:
CLRa
CLRc
MOVR4,#8
OUTPUTLOOP:
NOP
NOP
MOVC,T_I
RRCA
SETBT_C
NOP
NOP
NOP
CLRT_C
DJNZR4,OUTPUTLOOP
RET
KEY:
MOVP1,#0F0H
MOVA,P1
MOVB,A
ACALLDELAY
MOVA,P1
CJNEA,B,DO
CJNEA,#0E0H,K1
AJMPKEY0
K1:
CJNEA,#0D0H,K2
AJMPKEY1
K2:
CJNEA,#0B0H,K3
AJMPKEY2
K3:
CJNEA,#070H,DO
AJMPKEY3
DO:
RET
DELAY:
MOVR6,0ffh
DL1:
MOVR5,#250
DJNZR5,$
DJNZR6,DL1
RET
DEL1:
MOVR7,#02
DL2:
MOVR6,#0FFH
DJNZR6,$
DJNZR7,DL2
RET
DELAYY1:
MOVR7,#02
DELAY10:
MOVR4,#187
DELAY11:
MOVR3,#248
DJNZR3,$
DJNZR4,DELAY11
DJNZR7,DELAY10
DJNZR5,DELAYY1
RET
key3:
MOVSP,#60H
MOVTMOD,#10H
SETBET1
SETBEA
SETBTR1
START0:
clrp3.4
MOV30H,#00H
NEXTT:
MOVA,30H
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVR2,A
JZENDD
ANLA,#0FH
MOVR5,A
MOVA,R2
SWAPA
ANLA,#0FH
JNZSING
CLRTR1
AJMPDD1
SING:
DECA
MOV22H,A
RLA
MOVDPTR,#TABLE1
MOVCA,@A+DPTR
MOVTH1,A
MOV21H,A
MOVA,22H
RLA
INCA
MOVCA,@A+DPTR
MOVTL1,A
MOV20H,A
SETBTR1
DD1:
LCALLDELAYY
INC30H
AJMPNEXTT
ENDD:
CLRTR1
AJMPSTART0
INTT1:
PUSHPSW
PUSHACC
MOVTL1,20H
MOVTH1,21H
CPLp3.4
POPACC
POPPSW
RETI
DELAYY:
MOVR7,#02
DELAY0:
MOVR4,#187
DELAY1:
MOVR3,#248
DJNZR3,$
DJNZR4,DELAY1
DJNZR7,DELAY0
DJNZR5,DELAYY
RET
TABLE:
DB82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
DB82H,01H,81H,94H,84H,0B4H,0A4H,04H
DB82H,01H,81H,94H,84H,0C4H,0B4H,04H
DB82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
DB0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H
TABLE1:
DW64260,64400,64524,64580,64684,64777,64820,64898
DW64968,65030,65058,65110,65157,65178,65217
;字符显示码表
DIG_CODE:
DB14H,0d7H,4cH,45H,87H,25H,24H,57H,04H,44H
END
五、调试
(一)软件调试步骤
1、打开软件后,在Project菜单中选择NewProject命令,打开一个新项目。
保存此项目,输入工程文件名后,并保存工程文件的目录。
2、为项目文件选择一个目标器件,即选择8051的类型。
在Database列表框中选择“ATML89C52”,确定。
3、上述设置好后,创建源程序文件并输入程序代码。
输入好代码后点击“文件/保存”。
4、把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。
5、开始编译,对项目文件进行编译。
若没有错误后进行硬件调试
(二)硬件调试
按照此次课程设计的要求调试过程如下:
按键KEY0,KEY1,KEY2,KEY3分别对应LED流水灯,蜂鸣器,数码管,音乐四个功能。
1、LED流水灯测试
通过按按键KEY0,观察到LED流水灯显示,并循环2次;与相应的程序代码相比较,结果正确。
2、蜂鸣器测试
通过按按键KEY1,听到蜂鸣器发出“嘀”,“嘀”的响声;与相应的程序代码相比较,结果正确。
3、数码管测试
通过按按键KEY2,观察到数码管从“1000”开始计时,依次显示“1001”,“1002”,“1003”……;与相应的程序代码相比较,结果正确。
因为程序要求数码管显示的时间是小时和分钟,所以要观察到数码管的变化要等一分钟的时间。
4、音乐测试
通过按按键KEY3,听到蜂鸣器响起“生日快乐”的音乐;
六、设计总结
经过为期两周的忙碌,终于完成了单片机的课程设计,在此期间不仅将课堂上所学的东西进行了巩固,而且在实验的过程中有所提高,当然这里少不了老师的指导和小组之间的团队合作。
前几天我们在教室集中,并根据报告要求查找相关资料。
该课程设计中应用到了蜂鸣器、LED流水灯、数码管,并且要求在一个电路板上将各个功能集成在一起,也就是能实现LED灯流水工作,数码管计时以及蜂鸣器发生。
以前我们做试验都是一个功能一个功能的完成,从来没有一起实现过,这样问题就来了,比如三种程序放在一起相互冲突怎么办?
经过老师的讲解和分析,我们可以用键盘扫描的程序来解决,将各个功能设置在不同的模块作为子程序一一调用,这样就可以实现全部功能并互不干扰。
之后我们在实验室进行调试,结果出了一些问题,首先是LED流水灯只亮一个,不进行流水