LED数字倒计时器课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
淮阴师范学院物理与电子电气工程学院课程设计报告
学生姓名学号
班级
专业电子信息科学与技术
题目LED数字倒计时器
指导教师
2015 年11 月
一、设计任务与要求
近年来随着计算机在社会领域的渗透,单片机的应用正在不断深入人们的生活,同时带动传统控制检测日新月异。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面的知识是不够的,还应根据具体硬件结构,针对具体应用特点与软件结合。
本项目讨论了LED 数字倒计时器的设计与制作,此方案线路简单,成本低,应用前景广阔。
本次设计的任务与要求是,使基于AT89C51单片机的LED数字倒计时器主要具有如下功能:
(1)LED数码管显示倒计时时间。
(2)倒计时过程中能设置多个闹钟,当倒计时值倒计到设定值时会发出约2s 的报警声音。
(3)通过按键可以对倒计时设定初值。
倒计时初始值范围在24:00:00-00:00:60之间,用户可根据需要对其进行设置,设置成功后复位初始值为成功设定值。
二、硬件电路设计
设计电路采用模块化设计,主要由AT89C51单片机、复位电路、LED显示模块和控制模块组成(如图2.1)。
图2.1 基于AT89C51单片机的数字倒计时器系统框图
图2.2 基于AT89C51单片机的数字倒计时器电路原理图(元件清单见附录一)
(2)AT89C51单片机控制模块
图2.3 单片机控制模板
(3)复位电路
复位是单片机的初始化操作,只需给AT89S51的复位引脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就可得单片机复位,复位时,PC
初始化为0000H,使单片机从OUT单元开始执行程序。
除了进入系统的正常初始化之外由于程序运行出错或操作错误而使系统处于死锁状态,为摆脱死锁状态,也需按复位键使得RST脚为高电平,使单片机重新启动。
图2.4复位电路
(4)LED显示模块
图2.5 LED显示模块
(5)按键电路
按键电路的按键功能说明:
(1)K1用于设置时间的分钟。
(2)K2用于设置小时以及设置闹钟的开关。
(3)K3用于设置分钟和闹钟的分钟。
(4)K4用于设置完成退出。
图2.6 按键模块
三、软件设计
(1)程序流程图
图3.1 LED数字倒计时器程序流程图(2)程序清单(汇编语言)
K1 EQU p1.0
K2 EQU P1.1
K3 EQU p1.2
K4 EQU P1.3
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME
ORG 0100H
MAIN: MOV SP, #50H
MOV 20H, #3CH ;时间 BIN SECOND
MOV 21H, #3CH ; BIN MINUTE
MOV 22H, #18H ; BIN HOUR
MOV 23H, #01H ;闹铃 BIN MINUTE
MOV 24H, #01H ; BIN HOUR
MOV 25H, #00H ;定义一个标志位
MOV 30H, #00H ;时间 BCD SECOND MOV 31H, #00H
MOV 32H, #00H ; BCD MINUTE
MOV 33H, #00H
MOV 34H, #00H ; BCD HOUR
MOV 35H, #00H
MOV 36H, #01H ;闹铃 BCD MINUTE
MOV 37H, #00H
MOV 38H, #01H ; BCD HOUR
MOV 39H, #00H
MOV TMOD, #01H ;16位计数器T0,方式1
MOV THO, #03CH ;赋初值
MOV TLO, #0B0H
MOV IE, #10000111B;开中断TO,EA=1
SETB TRO ;T0启动计数
MOV R2, #14H ;计数器
MOV P2, #0FFH
LOOP:LCALL TIMEPRO ;调用现在时间与闹铃时间比较程序 LCALL DISPLAY1 ;调用现在时间显示子程序
JB K1,M1 ;判断按键是否按下
LCALL XIAOZHEN1 ;调用消抖程序
MOV C, 25H.0
JC A1
A1: CLR 25H.0
LCALL SETTIME ;调用设置现在时间子程序
LJMP LOOP
M1: JB K2, M2
LCALL XIAOZHEN2
MOV C, 25H.0
JC A2
A2: CLR 25H.0
LCALL SETTIME ;调用设置闹钟的程序
LJMP LOOP
M2: JB K4, M3
A3: LCALL XIAOZHEN3
MOV C, 25H.0
JC A4
A4: CLR 25H.0
M3: LJMP LOOP
SETTIME:
LO: LCALL DISPLAY1
JB K2, L1
LCALL XIAOZHEN4
MOV C, 25H.0
JC A5
A5: CLR 25H.0
DEC 22H
MOV A,22H
CJNE A,#18H,G012 MOV 22H, #00H
MOV 34H, #00H
MOV 35H, #00H
LJMP L0
L1: JB K3, L2
LCALL XIAOZHEN5 MOV C, 25H.0
JC A6
A6: CLR 25H.0
DEC 21H
MOV A,21H
CJNE A,#3CH,G011
MOV 21H, #00H
MOV 32H, #00H
MOV 33H, #00H LJMP L0
GO11: MOV B,#0AH
DIV AB
MOV 32H, B
MOV 33H, A
LJMP L0
GO12: MOV B,#0AH
DIV AB
MOV 34H, B
MOV 35H, A
LJMP L0
L2: JB K4, L0
LCALL XIAOZHEN3
MOV C, 25H.0
JC AX
AX: CLR 25H.0
RET
SETATIME: LCALL DISPLAY2 NO: LCALL DISPLAY2 JB K3, N1
LCALL XIAOZHEN6 MOV C, 25H.0
JC A7
A7: CLR 25H.0
DEC 24H
MOV A, 24H
CJNE A,#24,G022
MOV 24H, #00H
MOV 38H, #00H
MOV 39H, #00H
LJMP N0
N1: JB K1 N2
LCALL XIAOZHEN7
MOV C, 25H.0
JC A8
A8: CLR 25H.0
DEC 23H
MOV A, 23H
CJNE A,#60,G021
MOV 23H, #00H
MOV 36H, #00H
MOV 37H, #00H
LJMP N0
G021: MOV B, #0AH
DIV AB
MOV 36H, B
MOV 37H, A
LJMP N0
G022: MOV B, #0AH
DIV AB
MOV 38H, B
MOV 39H, A
LJMP N0
N2: JB K4 N0
LCALL XIAOZHEN3
MOV C, 25H.0
JC A9
A9: CLR 25H.0
RET
TIMEPRO: MOV A, 21H
MOV B, 23H
CJNE A, B, BK MOV A, 22H
MOV B, 24H
CJNE A, B, BK
SETB 25H.0
MOV C, 25H.0
JC XX
XX: LCALL TIMEOUT
BK: RET
TIMEOUT:
X1: LCALL BZ
LCALL DISPLAY2
CLR 25H.0
JB K4,X1
RET
BZ: CLR P3.7
MOV R7, #250
T2: MOV R6, #124
T3: DJNZ R6,T3
DJNZ R7,T2
JB K4,XY
LCALL XIAOZHEN3
MOV C, 25H.0
JC XY1
XY: RET
XY1: LJMP LOOP XIAOZHEN1: LCALL DISPLAY1
JB K1,XIAOZHEN1
MOV C, K1
LCALL JC XIAOZHEN1
LCALL DELAY
MOV C, K1
JC XIAOZHEN1
STOP1: MOV C, K1
JNC STOP1
LCALL DELAY
JNC STOP1
SETB 25H.0
RET
XIAOZHEN2: LCALL DISPLAY2 JB K2,XIAOZHEN2
MOV C, K2
JC XIAOZHEN2
STOP2: MOV C, K2
JNC STOP2
LCALL DELAY
MOV C, K2
JNC STOP2
SETB 25H.0
RET
XIAOZHEN3: LCALL DISPLAY1 JB K4,XIAOZHEN3
MOV C, K4
JC XIAOZHEN3
LCALL DELAY
MOV C, K4
JC XIAOZHEN3
STOP3: MOV C, K4
JNC STOP3
LCALL DELAY
JNC STOP3
SETB 25H.0
RET
XIAOZHEN4: LCALL DISPLAY1 JB K2,XIAOZHEN4
MOV C, K2
JC XIAOZHEN4
LCALL DELAY
MOV C, K2
JC XIAOZHEN4
STOP4: MOV C, K2
JNC STOP4
LCALL DELAY
MOV C, K2
JNC STOP4
SETB 25H.0
RET
XIAOZHEN5: LCALL DISPLAY1 JB K3,XIAOZHEN5
MOV C, K3
JC XIAOZHEN5
LCALL DELAY
MOV C, K3
JC XIAOZHEN5
STOP5: MOV C, K3
JNC STOP5
LCALL DELAY
MOV C, K3
JNC STOP5
SETB 25H.0
RET
XIAOZHEN6: LCALL DISPLAY2 JB K3, XIAOZHEN6 MOV C, K3
JC XIAOZHEN6
LCALL DELAY
MOV C, K3
JC XIAOZHEN6
STOP6: MOV C, K3
JNC STOP6
LCALL DELAY
MOV C, K3
JNC STOP6
SETB 25H.0
RET
XIAOZHEN7: LCALL DISPLAY2 JB K1, XIAOZHEN7 MOV C, K1
JC XIAOZHEN7
LCALL DELAY
MOV C, K1
JC XIAOZHEN7
STOP7: MOV C, K1
JNC STOP7
LCALL DELAY
MOV C, K1
JNC STOP7
SETB 25H.0
RET
DELAY: MOV R4, #14H
DL00: MOV R5, #OFFH
DL11: DJNZ R5, DL11
DJNZ R4, DL00
RET
TIME: PUSH ACC
PUSH PSW
MOVTH0, #03CH
MOV TL0, #0B0H
DJNZ R2, RET0
MOV R2, #14H
MOV A, 20H
CLR C
DEC A
CJNE A, #0, G01
MOV 20H, #3CH
MOV 30H, #0
MOV 31H, #0
MOV A, 21H
DEC A
CJNE A, #3CH, G02
MOV 21H, #0H
MOV 32H, # 0
MOV 33H, # 0
MOV A, 22H
DEC A
CJNE A, #18H,GO3 MOV 22H, # 00H
MOV 34H, # 0
MOV 35H, # 0
AJMP RETO
GO1: MOV 20H, A
MOV B, # 0AH
DIV AB
MOV 31H, A
MOV 30H, B
AJMP RETO
GO2: MOV 21H, A
MOV B, # 0AH
DIV AB
MOV 33H, AEEH
MOV 32H, B
AJMP RETO
GO3: MOV 22H, A
MOV B, # OAH
DIV AB
MOV 35H, A
MOV 34H, B
AJMP RETO
RETO: POP PSW
POP ACC
RETI
DISPLAY1: MOV R0, # 30H
MOV R3, # 0EEH
MOV A, R3
PLAY1: MOV P2, A
MOV A,@RO
MOV DPTR, # DSEG1 MOVC A,@A + DPTR MOV P0, A
LCALL DL1
MOV P2, # 0EEH
MOV A, R3
RL A
JNB ACC.6, LD1
INC R0
MOV R3, A
LJMP PLAY1
LD1: RET
DISPLAY2: PUSH ACC
PUSH PSW
MOV RO, # 36H
MOV A, R3
PLAY2: MOV P2, A
MOV A,@R0
MOV DPTR, # DSEG1 MOVC A,@A+DPTR
MOV P0, A
LCALL DLL
MOV P2, # 0FFH
MOV A, R3
RL A
JNB ACC.6, LD2
INC R0
MOV R3, A
LJMP PLAY2
LD2: POP PSW
POP ACC
RET
DL1: MOV R7, # 05H
DL: MOV R6, # 0FFH
DL6: DJNZ R6, $
DJNZ R7, DL
RET
DSEG1: DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
END
程序清单2(C语言)
#include<reg51.h>
sbit kh=P1^0;//定义kh为与P1.0相连接的按键B1
sbit km=P1^1;//定义km为与P1.1相连接的按键B2
sbit ks=P1^2;//定义ks为与P1.2相连接的按键B3
sbit st=P1^3;//定义st为与P1.3相连接的按键B4
sbit b=P3^7;//定义b为P3.7
unsigned
char
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c ,0x39,0x5e,0x79,0x71}; // LED数码管从0到F的显示
unsigned char i=0,hour=0,minute=0,second=0;
void delayms(unsigned int x)
{
unsigned char a=160;//定义无符号变量a的值为160,指延时时间为160个及其周期乘以x,160可以为180等,自己设置
while(x--)
{
while(a--);
a=160;
}
}//定义延时程序的延时时间为160个及其周期乘以x,避免按键抖动的影响
main()
{ TH0=(65536-50000)/256;//设置定时时间对高八位赋值,50000是50000个机器周期,0.05秒
TL0=(65536-50000)%256;//设置定时时间对低八位赋值,50000是50000个机器周期,0.05秒
TMOD=1;//定时器模式
TR0=0;//停止计时
ET0=1;//开定时器中断
EA=1;//开总中断
while(1)
{
P0=table[hour/10];//显示分钟的十位
P2=~32;//对数码管进行位选和段选,选中显示分钟的十位
delayms(1);//延时以便于显示
P2=0xff;//重新给P2口一个高电平,避免误操作
P0=table[hour%10];//显示分钟的个位
P2=~16;//对数码管进行位选和段选,选中显示分钟的个位
delayms(1);//延时以便于显示
P2=0xff;//重新给P2口一个高电平,避免误操作
P0=table[minute/10];//显示秒钟的十位
P2=~8;//对数码管进行位选和段选,选中显示秒钟的十位
delayms(1);//延时以便于显示
P2=0xff;//重新给P2口一个高电平,避免误操作
P0=table[minute/10];//显示秒钟的十位
P2=~4;//对数码管进行位选和段选,选中显示秒钟的十位
delayms(1);//延时以便于显示
P2=0xff;//重新给P2口一个高电平,避免误操作
P0=table[second%10];//对数码管进行位选和段选,选中显示秒钟的个位
P2=~1;//对数码管进行位选和段选,选中显示秒钟的个位
delayms(1);//延时以便于显示
P2=0xff;//重新给P2口一个高电平,避免误操作
if(!kh)//如果小时按键B1按下
{
delayms(200);//延时200乘以160个机器周期,避免按键抖动的影响
hour++;//定时时间的小时加一
if(hour>23)//因为是无符号的变量,减到0之后,再减就会变成ff,大于23
hour=23;
}
else if(!km)//如果分钟按键B2按
{
delayms(200);//延时200乘以160个机器周期,避免按键抖动的影响
minute++;
if(minute>59)//因为是无符号的变量,减到0之后,再减就会变成ff,大于59
minute=59;
}
else if(!ks)//如果秒按键按下B3
{
delayms(200);//延时200乘以160个机器周期,避免按键抖动的影响
second++;
if(second>59)//因为是无符号的变量,减到0之后,再减就会变成ff,大于59
second=59;
}
if(!st)//开始按加按
{
delayms(200);//延时200乘以160个机器周期,避免按键抖动的影响
TR0=1;//开始计
}
if(TR0==1&&hour==0&&minute==0&&second<3)//如果在最后2秒
b=!b;//开报警delayms(1);//延时以便于显示
}
}
void t0() interrupt 1 //定义中断服务程序
{
TH0=(65536-50000)/256;//设置定时时间对高八位赋值,50000是50000个机器周期,0.05秒
TL0=(65536-50000)%256;//设置定时时间对低八位赋值,50000是50000个机器周期,0.05秒
i++;//控制变量i自加
if(i>=20)//定时满20次是1秒,即50000个机器周期为一
{
i=0;
second--;//秒减一
if(second>59)//因为是无符号的变量,减到0之后,再减就会变成ff,大于59
{
second=59;//秒为59
minute--;//分钟减一
if(minute>59)//因为是无符号的变量,减到0之后,再减就会变成ff,大于59
{
minute=59;//因为是无符号的变量,减到0之后,再减就会变成ff,大于59
hour--;//小时减一
if(hour>23)//因为是无符号的变量,减到0之后,再减就会变成ff59,如果小时减过0说明计
{
hour=0;
minute=0;
second=0;
TR0=0;//停止计时
}
}
}
}
}
四、利用Proteus软件仿真
打开Proteus的ISIS 7 Professional编辑环境,并从元件库中选出所需的元件,放置元器件、电源和地、连线得到电路原理图(如图2.2)。
打开Keil uVision4编辑环境,单击Create a new file按钮新建一个空白文本,将汇编程序输入文本中后以.asm后缀保存汇编文件,点击菜单栏中Project 新建Project工程,建立一个工程文件,选择Atmel_AT89C51型号的CPU。
在树状文件目录中右击Source Group1加载.asm文件到工程中,右击Target1后选择Option for Group’Source Group1’设置频率为12MHz并选择创建HEX文件。
单击编译按钮未出现错误在电路原理图中单击单片机,加载HEX文件。
图4.1 程序代码文件加载图
点击开始按钮仿真开始。
第一次仿真
第二次仿真调节闹钟
按K4键完成设置
仿真完成
五.总结
单片机的应用正在不断深入人们的生活,同时带动传统控制检测日新月异。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
通过本次设计,使我们认识并了解了基本的设计开发过程,在这过程中,我的身边的同学们给了我很大的启示和帮助,而且我觉得对以前不了解的单片机只是有了一个更感更深的了解。
我相信我所学的东西在以后的工作学习中会起很大的作用。
在本次设计中得到了指导老师王老师和魏老师的大力支持还有小组成员的讨论与合作才能完成本次设计,在此表示感谢!
附录一。