单片机控制的多功能电子时钟设计Word格式.docx
《单片机控制的多功能电子时钟设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机控制的多功能电子时钟设计Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
CCP0/CCP1/CCP2/RxD/RxD2/T0/T1/T2管脚;
内部掉电唤醒专用定时器
●工作频率:
5~35MHz,相当于普通8051:
60~420MHz
●8/16/24/32/40/48/56/60/61K字节片内Flash程序存储器,擦写次数10万次以上
●大容量片内EEPROM(FLASH)功能,擦写次数10万次以上
●ISP/IAP(在系统可编程/在应用可编程),无需编程器/仿真器
●高速ADC,8通道10位,速度可达30万次/秒。
3路PWM还可当3路D/A使用
●3通道捕获/比较单元(CCP/PCA/PWM)
----也可用来再实现3路D/A3个定时器或3个外部中断(支持上升沿/下降沿中断)
●6个定时器,2个16位可重装载定时器T0和T1兼容普通8051的定时器,新增了一个16位的定时器T2,并可实现时钟输出,3路CCP/PCA可再实现3个定时器
●可编程时钟输出功能(对内部系统时钟或外部管脚的时钟输入进行时钟分频输出):
①T0在P3.5输出时钟;
②T1在P3.4输出时钟;
③T2在P3.0输出时钟,以上3个定时器/计数器输出时钟均可1~65536级分频输出;
④内部主时钟在P5.4/MCLKO对外输出时钟(STC15系列8-pin单片机的主时钟在P3.4/MCLKO对外输出时钟)
●硬件看门狗(WDT)
●SPI高速同步串行通信接口
●双串口/UART,两个完全独立的高速异步串行通信端口,分时切换可当5组串口使用
●先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令
●通用I/O口(42/38/30/26个),复位后为:
准双向口R弱上拉(8051传统I/O口)
可设置四种模式:
准双向口弱上拉、强推挽弱上拉、仅为输入/高阻和开漏
每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA
●如果I/O口不够用可以用3根普通I/O口线外接74HC595来扩展I/O口,并可多芯片级联扩展几十个I/O口,还可用A/D作按键扫描来节省I/O口
二、多功能电子时钟
2.1设计要求
1、实现时、分、秒、年、月、日的显示,而且还有闹钟的功能。
2、能够调整时钟的各个时钟单元的值,并且按键灵敏。
3、在调整时钟单元值的时候要求有闪烁功能。
2.2设计电路组成
本次课程设计采用宏晶公司最新STC15系列IAP15F2K61S2芯片
独立按键:
设计采用的是独立式按键:
当开关打到下面时由P0-P3构成了4个独立按键。
数码管:
设计采用的是8位共阴数码管显示
数码管驱动电路:
数码管驱动电路主要由2片74HC595组成,两片芯片之间级联。
一片驱动位选,一片驱动段选。
由单片机控制p0.3,p0.4,p0.5来控制两片芯片的输出。
程序下载芯片:
USB转串口芯片CH340G,可实现程序下载
2.3电路方案设计
1、电路主要由15F单片机、数码管、4个独立按键、74HC595,USB转串口芯片CH340G,8个LED灯。
2、单片机通过对按键的检测实现不同的功能,主要有以下几点:
(1)单片机通过对p0.3,p0.4,p0.5对两片74HC595写入数据来使8个数码管显示。
(2)当设置的闹钟时间匹配到当前时间时,单片机会点亮LED灯,检测合适的按键会使LED灯熄灭。
2.4系统资源分配
定时器T0:
用于时钟走时,对基本时间单位计数并对秒单元操作
定时器T1:
在功能键调整时对时钟单元时实现闪烁的的半秒计数
30H~38H是8个时钟数据单元,分别为秒、分、时、日、月、年、闹钟-秒、闹钟-分、闹钟-时单元
P0.3,P0.4,P0.5是74HC595控制单元,实现对数码管的显示
P2:
闹钟显示,闹钟匹配成功后点亮LED灯
R0:
功能键模式中指向修改单元的地址
R1:
时钟调整时所用的地址指针
R2:
写74HC595计数单元,写8位
R3、R4:
毫秒延时单元(用于数码管显示),R4还作为送数码管显示位选缓冲单元
R5:
基本的时钟单元计数,满100秒单元加一
R6:
半秒闪烁计数
P1.0,P1.1,P1.2,P1.3为四个独立按键位
20H.0,20H.1,20H.2为三个自定义按键标志位
40H:
对循环次数计数,满足条件时对指定单元加1(快速加数)
41H,42H:
对循环计数,满足条件时对指定单元清0
43H、44H、45H:
显示模块缓冲单元(写8个数码管)
47H:
数码管送显示缓冲单元
48H:
闪烁缓存单元,大小为0BBH,根据查表得到灯灭的段选码
2.5软件功能组成和模块化程序
整个程序主要有:
主程序、各个按键功能子程序、两个定时器中断程序、写74HC595芯片子程序还有其他模块子程序等等……
主程序模块:
在主程序中循环显示时钟与检测按键,若无按键则一直检测按键,
则一直进行此循环,知道检测到按键为止。
/***********************主程序**************************************/
START:
ACALLDISPLAY1
ACALLCLOCK;
闹钟检查
TEST_S1:
JBS1,TEST_S2
ACALLK1;
S1按下,调用年月日显示
TEST_S2:
JBP1.1,TEST_S3
ACALLK2;
S2按下,调用K2(功能模块)
TEST_S3:
JBS3,TEST_S4
ACALLCL_DISP;
显示闹钟
TEST_S4:
JBS4,TEST_EXT
MOVP2,#0FFH;
对闹钟状态清除
TEST_EXT:
SJMPSTART
闹钟检查模块:
实现闹钟匹配,并执行相关的响应,在响应执行30秒后可自动清除闹钟响应,实现代码模块如下:
/**********************闹钟检查*************************************/
CLOCK:
MOVA,SECOND_CL
CJNEA,SECOND,C_EXT;
匹配秒单元
MOVA,MINU_CL
CJNEA,MINU,C_EXT;
匹配分单元
MOVA,HOUR_CL
CJNEA,HOUR,C_EXT;
匹配时单元
CLRC
ADDCA,#30H
DAA
MOVB,A
MOVP2,#0FH
C_EXT:
MOVA,B
CJNEA,SECOND,CLOCK_EXT
MOVP2,#0FFH
CLOCK_EXT:
RET
年月日显示模块:
按下S1按键,可显示年月日的信息,实现代码模块如下:
/*************************S1按键显示*******************************/
K1:
ACALLDISPLAY2;
年月日显示
ACALLCLOCK
JBS1,K1_EXT
SJMPK1
K1_EXT:
RET
闹钟显示模块:
按下S3按键,可显示所定的闹钟时刻,实现代码模块如下:
/**********************闹钟显示************************************/
CL_DISP:
ACALLDISPLAY3
JNBS3,CL_DISP
时钟修改功能键:
在修改时钟时,会对显示时钟闪烁处理,然后根据按键的情况来进行相关的操作,如:
S1长按会使指定单元数据增加的速度变快;
S2按键会使指针指向下一个单元,准备对下一单元进行操作;
S3按下时指针指向的单元(即闪烁单元)加1;
S3长时间按下(如超过3秒),则对指定单元清0;
S4按键按下后,退出S2功能模块,返回主程序显示模块。
实现代码模块如下:
/********************S2按键功能子程序******************************/
K2:
MOVTL1,#0F0H;
S2按键调用
MOVTH1,#0D8H
MOVR6,#50
CLRTR0;
关闭走时定时器
SETBF2;
S2已按键标志
CLRF3;
S3未按键标志
SETBTR1;
开闪烁定时器
MOVSSDY,#0BBH;
数码管全灭代码(第11个段选码为00H,数码管灭)
MOVR0,#SECOND;
从第一个开始闪烁
MOV40H,#25
/*************************S3长按清“0”****************************/
K2_S3_2:
JBS3,S2_2_EXT
DJNZ41H,K2_S1
DJNZ42H,K2_S1;
检测S3按下后循环210*2次,对闪烁单元清“0”
CJNE@R0,#0BBH,S2_2
MOVSSDY,@R0
S2_2:
MOV@R0,#00H
S2_2_EXT:
MOV41H,#210
MOV42H,#2;
计数200*2次
/**********************S1长按快速加数******************************/
K2_S1:
JBS1,K2_SS
DJNZ40H,K2_SS
ACALLCHANGE
AJMPS3_1
/**************闪烁模块(定时器T10.5秒标志F1)********************/
K2_SS:
JNBF1,K2_S2;
判断闪烁标志
MOVA,SSDY
XCHA,@R0
MOVSSDY,A;
闪烁
CLRF1
/**************S2按键对下一个单元操作******************************/
K2_S2:
ACALLS2_IN;
指向下一个单位
/******************S3按键对指定单元加1*****************************/
K2_S3_1:
JBS3,S3_1_EXT;
S3是否按下
JBF3,DISP_CH;
S3按键已按下,查看上一个S3是否按下
SETBF3;
没按下,说明是第一次按下
ACALLCHANGE;
还原38H与闪烁单元的值
SJMPS3_1
S3_1_EXT:
CLRF3;
S3未按下,清除S3按键标志
SJMPDISP_CH
S3_1:
ACALLCREASE;
对闪烁的单元加1,十进制调整,上限设置
CLRF1;
按下键后可显示半秒
/******************对显示的单元进行选择*****************************/
DISP_CH:
ACALLCH_IN;
对显示的单元进行选择
/*********************S4按键退出功能设置***************************/
K2_S4:
JNBS4,K2_EXT;
S4按键按下则退出S2按键子程序,返回主程序CJNER0,#39H,K2_S3_2
K2_EXT:
MOVTL0,#0F0H
MOVTH0,#0D8H
MOVR5,#100
SETBTR0
CLRTR1;
打开T0,关闭T1
74HC595模块:
向595写一个字节的数据。
/***************************向595写一字节的数据*******************/
WRITE:
MOVR2,#8
WRT1:
RLCA
MOVDAT,C
NOP
SETBSH;
上升沿输入数据
NOP
CLRSH
DJNZR2,WRT1
定时器T0模块:
用于时钟走时,对时钟单元操作
/********************定时器T0(时钟走时)**************************/
TM00:
PUSHACC;
定时器T0
DJNZR5,EXTT0
MOVR5,#95
ACALLADJUST;
秒加1调整
EXTT0:
POPACC
RETI
定时器T1模块:
用于建立闪烁标志(F1),达到控制单元闪烁的目的。
/**********************定时器T0(单元闪烁)************************/
TM11:
定时器T1
DJNZR6,EXTT1
MOVR6,#47
SETBF1;
闪烁标志
EXTT1:
数码管显示模块:
用于显示时钟信息。
(其他显示模块类似)
/************************显示模块1:
时分秒*************************/
DISPLAY1:
CLRA
MOVA,SECOND
MOV43H,A
MOVA,MINU
MOV44H,A
MOVA,HOUR
MOV45H,A
ACALLDISPLAY0
RET
2.6算法流程思路
1、主程序中,主要执行显示模块,显示时分秒,每次循环显示时都会检测
按键,通过不同的按键调用不同的功能子程序。
(1)当主程序中检测到S1按键时,调用年月日显示模块,显示年月日信息。
(2)当主程序中检测到S2按键时,调用功能模块—时钟修改:
可设置各个时钟的值于闹钟的值。
(3)当主程序中检测到S3按键时,调用闹钟时间显示模块,查看闹钟时间。
(4)如果达到闹钟时间并且有闹钟响应,此时期如果S4键按下,会清除闹钟响应。
2、S2功能模块:
单片机部分时间用于显示时钟信息,在显示循环中依次对各个按键进行检测,同时定时器定时检测按键,检测到按键则会做出相应的操作或建立标志,循环显示中根据标志或者按键做出相关的操作,如:
对单元加1、对单元清0、对下一个单元操作、返回主程序等功能。
(1)当检测到S1按键长时间按下时,会以很快的速度增加指定单元的值。
(2)当检测到S2按键按下时,地址指针指向下一个单元,并对指定单元闪烁。
(3)当检测到S3按键短时间按下时,对指定单元作加1操作。
但检测到S3按键长时间按下时,对指定单元清0。
(4)当检测到S4按键按下时,对标志位F1置1,循环中检测到F1标志后就会跳出S2功能子程序,返回主程序,时钟开始走时。
小结
1、本次课程设计已初步达到了课程设计要求:
(1)、实现时钟走时,并显示出来。
(2)、能够对时钟的值进行调整;
调整指定的单元时,能够对指定单元闪烁提醒。
而且还增加了清0功能键与长按按键速加功能键。
(3)、能够设定闹钟,当闹钟与时钟匹配时,单片机会执行特定的提醒。
2、虽然本次课程设计实现了时钟的基本功能,但是还缺少很多人性化的功能
比如:
(1)、时钟初值是程序固定的,每次重启或复位单片机后,时钟都会回到固定的值。
(2)、本次课程设计使用的是定时器作为时钟基本计时单元,精度上与现有的时钟有不小的误差。
3、完成本次单片机课程设计,我有了很多的体会和感想
这次课程设计让我受益匪浅,无论从知识上还是其他的各个方面。
上课的时候的学习因为没有在单片机上实践过,只是从理论的角度去理解枯燥乏味,而且单片机实验课也不多,缺乏对单片机的了解。
这次课程设计由个人独立完成,单片机的外接电路也都由自己看原理图来分析、测试和使用,熟悉甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。
参考文献
[1]单片机原理与应用
朱兆优、陈坚、邓文娟
2012.7
[2]宏晶科技.STC15F2K60S2系列单片机器件资料,2012.
[3]电工电子实训教程.王怀平、管小明、冯林
2011.7
[4]
XX百科
附录程序:
ORG0000
LJMPMAIN
ORG000BH
LJMPTM00
ORG001BH
LJMPTM11
ORG0100H
MAIN:
MOVSP,#6FH
MOVR5,#100;
一秒定时计数100*10ms
MOVR6,#50;
半秒定时闪烁定时计数50*10ms
MOVTMOD,#00;
定时器工作方式0,16位自动重装
AUXRDATA8EH
MOVAUXR,#00H;
12分频
MOVTL0,#0F0H
MOVTH0,#0D8H
MOVTL1,#0F0H
MOVTH1,#0D8H;
定时10ms初值
SETBET0
SETBTR0
SETBEA;
开中断,开中断允许
SETBET1
CLRTR1;
开定时器0(走时计时),关闭定时器1(闪烁计时)
SHBITP0.3;
595移位线
STBITP0.4;
595锁存线
S1BITP1.0
S2BITP1.1
S3BITP1.2
S4BITP1.3;
4独立按键
F1BIT20H.0;
1个闪烁标志
F2BIT20H.1
F3BIT20H.2;
3个按键标志位
SECONDEQU30H;
秒单元
MINUEQU31H;
分单元
HOUREQU32H;
时单元
DAYEQU33H;
日单元
MONTHEQU34H;
月单元
YEAREQU35H;
年单元
SECOND_CLEQU36H;
闹钟-秒单元
MINU_CLEQU37H;
闹钟-分单元
HOUR_CLEQU38H;
闹钟-时单元
SSDYEQU48H;
闪烁缓存单元
SEND_DATEQU47H;
数码管送显示数据缓冲单元
DATBITP0.5;
数码管静态显示,595控制位
CLRSH
CLRST
MOVSECOND_CL,#5H
MOVMINU_CL,#15H
MOVHOUR_CL,#01H
MOVSECOND,#59H
MOVMINU,#14H
MOVHOUR,#01H
MOVDAY,#23H
MOVMONTH,#06H
MOVYEAR,#14H;
时钟初值
/************************主程序*************************************/