单片机课程报告电子时钟.docx
《单片机课程报告电子时钟.docx》由会员分享,可在线阅读,更多相关《单片机课程报告电子时钟.docx(17页珍藏版)》请在冰豆网上搜索。
单片机课程报告电子时钟
电子时钟的设计
一、设计目的
1、增进对单片机的感性认识,加深对单片机理论方面的理解。
2、掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通讯等。
3、了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础
4、加深对本门课程所学理论知识的理解与应用,提高对所学理论知识的综合运用能力,对计算机控制系统有一个整体认识,掌握计算机控制系统的设计方法。
通过课程设计,还可以培养独立工作能力,为将来毕业设计打好基础。
二、设计要求
1.用80C51单片机及接口电路设计一个电子计时器。
①系统硬件设计:
根据任务要求,完成单片机最小系统及其组成功能完整的系统。
②系统软件设计:
根据数字电子计时器功能,完成控制软件的编写与调试,并对数码显示进行控制。
2.实现的功能:
①运行时,电子钟从00.00开始自动计时。
②设置校正按键,能对闹钟时、闹钟分、时、分进行调整。
③设置时间与当前闹钟值切换显示键,能对时间与当前闹钟切换显示。
④设置+1键,能对所要校正单元内容+1。
⑤设置确定/开关闹钟键
3.显示要求:
①在没有键的情况下,四个数码管显示正常走时时间且显示时的第二
个数码管小数点每秒内亮半秒、灭半秒,其余三个数码管小数均不
亮。
②当按下切换显示键时,数码管由显示时间变为显示当前闹钟值,这时小数点常亮。
在按下回到走时。
③按下校正键后,开始时为校闹钟时,再按一下校正键,跳至校闹钟分,再按一下则为校时,再按一下后为校分,再按一次就回到校月,依次循环,当校闹钟时,该校正单元内容在数码管上每秒内亮半秒、灭半秒,且第二个数码码小数点为常亮。
当为校时或校分时,该校正单元内容在数码管上每秒内亮半秒、灭半秒,第二个数码管小数点每秒内亮半秒、灭半秒。
④按下确定键后,不管前一种按键是哪一种均跳至显示正常走时状态。
⑤当时钟走到设定的闹钟值时,蜂鸣器会以30MS的周期响六秒(时间可以通过程序设定)
⑥确定键有开启/关闭蜂鸣器功能,并以P3.3口接LED灯(低电平亮)作指示,当P3.3为低电平时,闹钟开启,反之则为关闭)。
三、设计思路
利用MCS-51单片机内部的定时/计数器、中断系统、以及独立键盘和数码管等部件,设计一个单片机电子时钟。
设计的电子时钟通过数码管显示,并能通过按键实现设置时间、闹钟值以及两者切换显示等操控。
用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为0BDCH,形成1/16S定时时间。
中断服务程序中对1/16S定时中断次数计数,若到计到了16次,秒单元内容加1,否则执行判键,当秒单元内容加至60时,自动清0秒单元同时分单元内容加1,同理对时、闹钟时、闹钟分处理,分别用片内RAM分别存秒、分、时、闹钟分、闹钟时,然后根据按键信息选择要显示的单元。
显示时,当显示时间时,小数点每秒内亮半秒、灭半秒,因为2FH.3位0和1每半秒切换一次,故实现这个可以利用2FH.3来判断,当显示闹钟值时,这时小数点常亮。
对于校时或校分显示,当校正其中一个单元内容时,显示该单元内容每秒内亮半秒、灭半秒,且小数点也随之一起闪烁;当校闹钟时或闹钟分时,校正单元闪烁,但小数点为常亮。
以校正指针21H底2位:
00为校月,01为校日,10为校时,11为校分,若校正指针21H.0为1时,则为校闹钟分或校分,故使后两个数码闪烁,反之则前两个数码管闪烁,同时以20H.1来区分是校闹钟还是校时来确定小数点是常亮还是闪烁。
以此来区分当前校正的单元为哪个单元。
显示判断与判键思路:
1.时间/闹钟值显示标志位上电时标志位置1显示时间,切换时标志位为0显示闹钟值。
2.校正状态标志位(20H.1)标志位为0时正常走时,KEY3键无效。
3.标志位位1时KEY2、KEY3、KEY4有效,KEY1键无效。
四、按键分配
1:
k1键(P1.4):
时间/闹钟值切换显示键
2:
K2键(P1.5):
校正键
3:
K3键(P1.6):
+1键
4:
K4键(P1.7):
确定键以及开关闹钟蜂鸣器
(四个按键均以低电平有效,且不要同时按下多个键)
五、地址分配
1.闹钟时单元:
30H
2.闹钟分单元:
31H
3.时单元:
32H
4.分单元:
33H
5.秒单元:
34H
6.1/16秒计数单元:
2FH
7.校正指针:
21H低两位(00为校月、01日、10时、11分)
8.时间/闹钟状态标志:
20H.0(低电平为显示日期,反之为显示闹钟值)
9.校正/走时标志:
20H.1(低电平时为走时,反之为校正)
10.显示缓冲单元:
3BH,3AH
11.按键信息存放单元:
50H
六、程序原理与流程图
<1>原理图
<2>流程图
1主程序
2中断程序
N
Y
Y
N
Y
N
Y
N
Y
七、编写程序
ORG0000H
SJMPMAIN
ORG000BH
LJMPIT0P;T0中断入口
ORG0030H
MAIN:
MOV50H,#0FFH;按键信息存放单元(作用:
长按按键只当按一次)
MOV30H,#0;定时闹钟时单元
MOV31H,#1;定时闹钟分单元,开始默认为一分钟闹钟
MOV32H,#0;时单元
MOV33H,#0;分单元
MOV34H,#0;秒单元
MOV2FH,#16;1/16秒计数单元(定时器为1/16秒中断溢出)
CLR20H.1;20H.1为0走时,为1校正
SETB20H.0;20H.0为0显示当前闹钟值,为1显示走时
MOVTMOD,#01H;T0工作于定时,方式1
MOVTH0,#0BH;赋定时器T0初值,定时1/16S=62500US
MOVTL0,#0DCH
MOVIE,#82H;允许定时器T0中断
SETBTR0;启动定时器T0
//////////////////////////////////////;显示模块////////////////////////////////////////////////////
DISP:
MOVDPTR,#TAB;取笔型码表始地址
JB20H.1,DISP1;校正?
若是跳至校正显示
MOVA,3BH;不是校正,显示走时/闹钟值
ANLA,#0F0H;取时高位BCD码
SWAPA
MOVCA,@A+DPTR;读时高位BCD码笔型码并通过P0口输出
SETBP2.0;数据片选74LS573芯片使能输入有效
CLRP2.1;位选片选74LS573芯片工作于锁存方式
MOVP0,A;送时高位笔型码输出显示
SETBP2.1;片选573芯片工作
CLRP2.0;573锁存时高位
MOVP0,#0FEH;只允许第一个数码管亮
LCALLDELAY;延时,调节动态显示效果
MOVA,3BH
ANLA,#0FH;取时低位
MOVCA,@A+DPTR;读时低位笔型码
JNB20H.0,LOOP1;显示当前闹钟值?
若是,秒常亮
JB2FH.3,LOOP1;显示走时,秒闪;半秒到?
SJMPNEXT1;半秒到,秒灭
LOOP1:
ORLA,#80H;秒亮
NEXT1:
SETBP2.0
CLRP2.1
MOVP0,A;送时低位笔型码输出显示
SETBP2.1
CLRP2.0
MOVP0,#0FDH;只允许第二个数码管亮
LCALLDELAY;延时,调节动态显示效果
MOVA,3AH
ANLA,#0F0H;取分高位
SWAPA
MOVCA,@A+DPTR
SETBP2.0
CLRP2.1
MOVP0,A;输出显示分高位值
SETBP2.1
CLRP2.0
MOVP0,#0FBH;只允许第三个数码管亮
LCALLDELAY;延时,调节动态显示效果
MOVA,3AH
ANLA,#0FH;取分低位
MOVCA,@A+DPTR
SETBP2.0
CLRP2.1
MOVP0,A;输出显示分低位值
SETBP2.1
CLRP2.0
MOVP0,#0F7H;只允许第四个数码管亮
LCALLDELAY;延时,调节动态显示效果
LJMPEXT;显示闹钟模块
///////////////////////////////////;校闹钟时或校时显示代码////////////////////////////////////////
DISP1:
JB21H.0,LOOP2;校闹钟分或校分?
不是,跳至闹钟分或校分
MOVA,3BH;校闹钟时或校时
ANLA,#0F0H;显示时高位
SWAPA
MOVCA,@A+DPTR
JNB2FH.3,LP2;半秒到?
没,跳正常显示
MOVA,#0;半秒到,时高位灭
LP2:
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0FEH;只允许第一个数码管显示
LCALLDELAY
MOVA,3BH
ANLA,#0FH
MOVCA,@A+DPTR
JNB2FH.3,LP3;半秒到?
没,显示时低位
MOVA,#0;半秒到,时低位送灭码
LP3:
JNB21H.1,LOOP3;校闹钟时?
是,跳校闹钟时
JB2FH.3,NEXT2;校时,半秒到?
没,秒灭
ORLA,#80H;半秒到,秒亮
SJMPNEXT2
LOOP3:
ORLA,#80H;校闹钟时,秒亮(校闹时,秒常亮;校时,秒闪)
NEXT2:
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0FDH;只允许第二位数码管显示
LCALLDELAY
MOVA,3AH
ANLA,#0F0H;取分高位
SWAPA
MOVCA,@A+DPTR
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0FBH;只允许第三位数码管显示
LCALLDELAY
MOVA,3AH
ANLA,#0FH;取分低位
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H;只允许第四位数码管显示
LCALLDELAY
LJMPEXT;跳至闹钟模块
/////////////////////////////;校闹钟分或校分显示代码////////////////////////////////////
LOOP2:
MOVA,3BH;校闹分校分
ANLA,#0F0H;取时高位
SWAPA
MOVCA,@A+DPTR
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0FEH;只允许第一位数码管显示
LCALLDELAY
MOVA,3BH
ANLA,#0FH;取时低位
MOVCA,@A+DPTR
JNB21H.1,LOOP4;校闹钟分?
跳校闹分
JB2FH.3,NEXT3;校分,半秒到?
没,秒灭
LOOP4:
ORLA,#80H;校闹分,秒亮(校闹钟分,秒常亮;校分,秒闪)
NEXT3:
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0FDH;只允许第二位数码管显示
LCALLDELAY
MOVA,3AH
ANLA,#0F0H;取分高位
SWAPA
MOVCA,@A+DPTR
JNB2FH.3,LP4
CLRA
LP4:
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0FBH;只允许第三位数码管显示
LCALLDELAY
MOVA,3AH
ANLA,#0FH;取分低位
MOVCA,@A+DPTR
JNB2FH.3,LP5
CLRA
LP5:
SETBP2.0
CLRP2.1
MOVP0,A
SETBP2.1
CLRP2.0
MOVP0,#0F7H;只允许第四位数码管显示
LCALLDELAY
////////////////////////////////////////闹钟模块//////////////////////////////////////////
EXT:
JBP3.3,LOP;是否允许闹钟?
低电平允许
MOVA,32H;开
CJNEA,30H,LOP;判断是否到闹钟时间?
MOVA,33H
CJNEA,31H,LOP
MOVA,#6;到闹钟值,设定蜂鸣器开启时间(默认为6S)
SUBBA,34H;设定值-秒值,当C=0时,开启蜂鸣
JCLOP
LCALLBUZZER;调用蜂鸣器子程序
LOP:
LJMPDISP;反复执行显示模块与闹钟模块
/////////////////////////////////////////;中断服务程序///////////////////////////////////////////
IT0P:
MOVTH0,#0BH;T0重赋初值,定时1/16S=62500US
MOVTL0,#0DCH
DJNZ2FH,KEY;到了1秒?
没有跳至判键
MOV2FH,#16;1秒到,重赋1/16秒计数单元初值
MOVA,34H
ADDA,#1;秒+1
DAA;秒值十进制调整
MOV34H,A;送回秒单元
CJNEA,#60H,KEY;到了60秒?
没有跳至判键
MOV34H,#0;到了,秒清0
MOVA,33H
ADDA,#1;分+1
DAA
MOV33H,A
CJNEA,#60H,KEY;到了60分钟?
没有跳至判键
MOV33H,#0;到了,分清0
MOVA,32H
ADDA,#1;时+1
DAA
MOV32H,A
CJNEA,#24H,KEY;到了24小时?
没有跳至判键
MOV32H,#0;到了,时清0
///////////////////////////////////////////;判键及键处理//////////////////////////////////
KEY:
JNB20H.1,ZOUSHI;是否为走时?
若是,跳到走时
LJMPJIAOSHI;不是,跳到显示闹钟值
ZOUSHI:
MOVA,P1;读入按键信息
ORLA,#0EH;消除闹钟启动位影响
CJNEA,50H,KEY1;有键按下?
LJMPNONE1;无按下跳至走时显示
KEY1:
MOV50H,A;有按下,按键信息存至按键存储单元
JNBACC.4,SWITCH1;若时间/闹钟切换键按下,跳至切换显示代码
JNBACC.5,SET1;若校时键按下时,跳至校时代码
JNBACC.7,SURE
LJMPNONE1;按下的键无效,跳至执行走时显示
SWITCH1:
CPL20H.0;时间/闹钟显示切换键按下,状态标志切换
NONE1:
JNB20H.0,CLOCK1;时间/闹钟显示标志为0,跳转至显示闹钟
MOV3BH,32H;为1,显示时间
MOV3AH,33H
LJMPEXT1;显示
CLOCK1:
MOV3BH,30H;闹钟时传给显缓
MOV3AH,31H;闹钟分传给显缓
LJMPEXT1;显示
SET1:
SETB20H.1;校正键按下,走时标志切换至校时
MOV21H,#0;初始化校正指针
CLR20H.0;标志为显示闹钟时间
MOV3BH,30H;将闹钟值送至显缓
MOV3AH,31H
LJMPEXT1
JIAOSHI:
MOVA,P1;读入按键信息
ORLA,#0EH
CJNEA,50H,KEY2;有键按下?
LJMPNONE2;无键按下跳至走时显示
KEY2:
MOV50H,A;有按下,按键信息存至按键存储单元
JNBACC.5,SET2;校时键按下?
JNBACC.6,ADD2;若+1键按下?
JNBACC.7,SURE;若确定键按下?
LJMPNONE2;无效键处理
SET2:
INC21H;校时键按下,调整校正指针
ANL21H,#03H;屏弊高六位,取低两位作为校正指针
SJMPNONE2
ADD2:
MOVA,#30H;将闹钟时单元地址取出
ADDA,21H;根据校正指针确定校正单元
MOVR0,A
MOVA,@R0;取校正单元内容
ADDA,#1;校正单元内容+1
DAA;十进制调整
MOV@R0,A;经校正后传回
CJNER0,#30H,C_HOUR;校闹时?
CJNE@R0,#24H,NONE2;24小时未满,校正显示
MOV@R0,#0;时初始化
SJMPNONE2
C_HOUR:
CJNER0,#31H,C_MIN;校闹分?
CJNE@R0,#60H,NONE2;60分钟未满跳,校正显示
MOV@R0,#0;分初始化
SJMPNONE2
C_MIN:
CJNER0,#32H,MIN;校时?
CJNE@R0,#24H,NONE2;校时,24小时未满跳,校正显示
MOV@R0,#0;时初始化
SJMPNONE2;
MIN:
CJNE@R0,#60H,NONE2;校分,60分钟未满跳,校正显示
MOV@R0,#0;分初始化
SJMPNONE2
SURE:
CPLP3.3;开/关闹钟功能,低电平开
CLR20H.1;校正确定,显示时间
SJMPTIME2
NONE2:
JNB21H.1,CLOCK2;校闹钟?
跳至显示闹钟值
TIME2:
SETB20H.0;校时,显示走时
MOV3BH,32H;时传给显缓
MOV3AH,33H;分传给显缓
LJMPEXT1
CLOCK2:
CLR20H.0;显示闹钟值
MOV3BH,30H
MOV3AH,31H
EXT1:
RETI;中断退出
////////////////////////////////////延时子程序/////////////////////////////////////////
DELAY:
MOV40H,#10;3MS子程序
DL:
MOV41H,#82H
DJNZ41H,$
DJNZ40H,DL
RET
/////////////////////////////////////蜂鸣器子程序///////////////////////////////////
BUZZER:
CPLP1.0;闹钟子程序
MOV36H,#5;T=30ms方波
B_LP:
ACALLDELAY
DJNZ36H,B_LP
RET
TAB:
DB77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH;0~9笔型码
END
八、设计心得
本次课程设计是用80C51单片机、74LS64芯片及接口电路设计一个电子时钟,经过认真地编写程序以及调试程序,结果满足设计要求,验证无误。
从开始设计到仿真实现,再到课程设计报告的完成,每走一步对我来说都是新的尝试与挑战。
在此期间,我学到了很多知识也有很多感受,我开始了独立的学习和试验,查看相关的资料和书籍,让自己头脑中模糊的概念逐渐清晰,使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一次试验的成功都会让我兴奋好一段时间。
当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。
我相信其中的酸甜苦辣最终都会化为甜美的甘泉。
在设计过程中,通过针对性地查找资料,了解了些电子方面的资料,既增长了自己见识,又对80C51有了一个全面的认识,这些知识贯穿到一起,对电子专业有了一个更全面的认识!
总之这次课程设计让我把理论设计和工程实践相结合、巩固基础知识与培养创新意识相结合等方面全面的培养学生的全面素质。
这些在我今后的学习和工作当中都会有很大的帮助。