电子钟的单片机设计.docx
- 文档编号:8768403
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:29
- 大小:275.15KB
电子钟的单片机设计.docx
《电子钟的单片机设计.docx》由会员分享,可在线阅读,更多相关《电子钟的单片机设计.docx(29页珍藏版)》请在冰豆网上搜索。
电子钟的单片机设计
课程设计
单片机原理
题目:
电子钟
专业及班级:
姓名:
学号:
课题描述
数字电子钟由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路等组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用555构成的振荡器或石英晶体振荡器加分频器来实现。
将标准秒脉冲信号送入“秒计数器”,该计数器采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计数器,可以实现一天24h的累计。
译码显示电路将“时、分、秒”计数器的输出状态经七段显示译码器译码,通过六位LED显示器显示出来。
校时电路是来对“时、分、秒”显示数字进行校对调整。
关键字:
计数器;译码器;显示器;校时电路。
一、课程设计目的
进一步熟悉I2C总线;掌握时钟芯片的使用;掌握使用液晶显示器显示时间。
二、实验内容
1、PCF8563:
(1)实时时钟芯片,可计时时间1900-2099年,不具有周调整功能。
(2)数据传输采用I2C总线,固定片选地址;闹铃中断功能,可编程频率输出。
三、功能简介
读写PCF8563中的时间数据;在12864J液晶显示器上显示时间、星期、日期
四、连线说明
1、主机连线说明:
E4区:
SDA
——
A3区:
P1.0
E4区:
SCL
——
A3区:
P1.1
A1区:
CS、RW、RS、CS1/2
——
A3区:
CS1、A0、A1、A2
2、初始化PCF8563,设置初始化时间(2005-07-01Fri12:
30:
00),读取时间数据;
3、调整读取的时间数据,转换为可以在图形液晶显示器上显示的数据,显示时间(年、月、日、星期、小时、分、秒)
五、实验原理图
六、程序流程图
设置时间子程序:
8253中断子程序:
七、实验程序
NAMEMAIN;演示主程序
EXTRNDATA(TIME)
EXTRNCODE(PCF8563_INIT,Write,Read,Read_Sequence,Time_Write,Time_Read,Alarm_Read,Alarm_Stop,Sec_Read)
EXTRNCODE(LCD_INIT,Disp_LineR)
MAIN_CODESEGMENTCODE
MAIN_DATASEGMENTDATA
STACKSEGMENTIDATA
RSEGMAIN_DATA
SEC:
DS1;保存秒数据,用于检测秒变化
buffer:
DS17;液晶使用的缓冲区
RSEGSTACK
DS20H;32BytesStack
CSEGAT0000H;定位0
LJMPSTART
RSEGMAIN_CODE;开始程序段
START:
MOVSP,#STACK-1
LCALLMainINIT;主程序初始化
MAIN:
LCALLSec_Change;检测秒变化,给出判断标志位CY,1-有变化
JNCMAIN
LCALLTime_Read;读取时间
MOVSEC,TIME;保存秒数据,用于检测秒变化
LCALLTime_Display;显示时间
JMPMAIN;循环进行实验内容介绍与PCF8563测试
;主程序初始化
MainINIT:
LCALLLCD_INIT;初始化液晶显示
LCALLPCF8563_INIT;PCF8563初始化
LCALLTime_Read;读取时间,读取的时间数据存放在TIME中
MOVSEC,TIME;保存秒数据,用于检测秒变化
LCALLTime_Display;显示时间
CLRF0;清秒变化标志
RET
Time_Display:
CALLDispTime1
CALLDispTime2
RET
;********************************
;时间显示
;********************************
;检测秒变化,给出判断标志F0,1-秒有变化;0-秒无变化
Sec_Change:
LCALLSec_Read;读取秒
CJNEA,SEC,Sec_Change_1;与前一次读取的秒比较,判断秒是否有变化
CLRC
RET
Sec_Change_1:
SETBC
RET
;********************************
;时间显示子程序
;********************************
BcdToAscii:
PUSHACC
SWAPA
ANLA,#0FH
ORLA,#30H
MOV@R0,A
INCR0
POPACC
ANLA,#0FH
ORLA,#30H
MOV@R0,A
INCR0
RET
;显示时间第一行
;时间显示,时间数据在TIME缓冲区中
DispTime1:
MOVR0,#buffer;写入时间缓存区
MOVA,TIME+6
LCALLBcdToAscii
MOVA,#0C4H;年C4EA
MOV@R0,A
INCR0
MOVA,#0EAH
MOV@R0,A
INCR0
MOVA,TIME+5
LCALLBcdToAscii;BCD转ASCII
MOVA,#0D4H;月D4C2
MOV@R0,A
INCR0
MOVA,#0C2H
MOV@R0,A
INCR0
MOVA,TIME+3
LCALLBcdToAscii
MOVA,#0C8H;日C8D5
MOV@R0,A
INCR0
MOVA,#0D5H
MOV@R0,A
INCR0
MOVA,#'';星期
MOV@R0,A
INCR0
MOVA,TIME+4
DECA
RLA
RLA
MOVDPTR,#DAYCHA;星期转换
ADDA,DPL
MOVDPL,A
JNCDispTime11
INCDPH
DispTime11:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
JNZDispTime11
MOVA,#88H
MOVR0,#buffer
CALLDisp_LineR
RET
DAYCHA:
DB'MON',00H,'TUE',00H,'WED',00H
DB'THU',00H,'FRI',00H,'SAT',00H
DB'SUN',00H
;显示时间第二行
;时间显示,时间数据在TIME缓冲区中
DispTime2:
MOVR0,#buffer
MOVA,TIME+2;小时
LCALLBcdToAscii
MOVA,#':
';显示“:
”
MOV@R0,A
INCR0
MOVA,TIME+1;分
LCALLBcdToAscii
MOVA,#':
'
MOV@R0,A
INCR0
MOVA,TIME;秒
LCALLBcdToAscii
CLRA
MOV@R0,A
MOVA,#92H
MOVR0,#buffer
CALLDisp_LineR
RET
END
PCF8563时钟芯片
;PCF8563:
1.实时时钟芯片,可计时时间1900-2099年
;2.数据传输采用IIC总线,固定片选地址
;3.闹铃中断,可编程频率输出
;*******************************************************
NAMEPCF8563
PUBLICTIME,Sec_Read
PUBLICPCF8563_INIT,Write,Read,Read_Sequence,Time_INIT,Time_Write,Time_Read,Alarm_Read,Alarm_Stop
SDABITP1.0;数据传输口
SCLBITP1.1;时钟
INTBITP3.2;闹钟/定时中断输出
PCF8563_DATASEGMENTDATA
RSEGPCF8563_DATA
Time:
DS7;数据缓冲区
;内部寄存器地址
CS1EQU00H;控制/状态寄存器1
CS2EQU01H;控制/状态寄存器2
SecondEQU02H;秒寄存器
MinuteEQU03H;分寄存器
HourEQU04H;时寄存器
DayEQU05H;天寄存器
WeekdayEQU06H;周寄存器
MouthEQU07H;月寄存器
YearEQU08H;年寄存器
MinuteAEQU09H;分闹铃寄存器
HourAEQU0AH;时闹铃寄存器
DayAEQU0BH;天闹铃寄存器
WeekdayAEQU0CH;周闹铃寄存器
COEQU0DH;时钟输出控制寄存器
TimerCtrlEQU0EH;定时控制寄存器
TimerEQU0FH;定时设置寄存器
;PCF8563的片选地址:
001H
PCF8563_WRITEEQU0A2H;写指令
PCF8563_READEQU0A3H;读指令
PCF8563_CODESEGMENTCODE
RSEGPCF8563_CODE
;初始化
PCF8563_INIT:
LCALLDelay8ms;IIC总线从通电到开始操作要求8ms延时
LCALLRegister_INIT;寄存器初始化
LCALLTime_INIT;时间初始化
INIT_1:
RET
;寄存器初始化
Register_INIT:
LCALLCS1_Set;设置控制/状态寄存器1
LCALLCS2_Set;设置控制/状态寄存器2
LCALLDayA_Set;设置天闹铃寄存器
LCALLWeekdayA_Set;设置周闹铃寄存器
LCALLCO_Set;设置时钟输出寄存器
RET
CS1_Set:
MOVA,#CS1;A-寄存器地址,B-寄存器设置值
MOVB,#00H;全设为正常模式
LCALLWrite;数据写入子程序
RET
CS2_Set:
MOVA,#CS2
MOVB,#02H;开闹铃中断,关定时器中断
LCALLWrite
RET
DayA_Set:
MOVA,#DayA
MOVB,#00H;关天闹铃
LCALLWrite
RET
WeekdayA_Set:
MOVA,#WeekdayA
MOVB,#00H;关周闹铃
LCALLWrite
RET
CO_Set:
MOVA,#CO
MOVB,#00H;关时钟输出
LCALLWrite
RET
;时间初始化,13年11月19日10:
10:
00,压缩BCD码格式(1个字节包含2个BCD码)
Time_INIT:
MOVA,#Year;A-寄存器地址;B-设置参数
MOVB,#13H
LCALLWrite;写入一个字节数据子程序
MOVA,#Mouth
MOVB,#11H;最高位表示世纪:
0-20XX,1-19XX
LCALLWrite
MOVA,#Weekday;周是不会自动调整的,需要自已核对
MOVB,#03H
LCALLWrite
MOVA,#Day
MOVB,#19H
LCALLWrite
MOVA,#Hour
MOVB,#12H
LCALLWrite
MOVA,#Minute
MOVB,#30H
LCALLWrite
MOVA,#Second
MOVB,#00H
LCALLWrite
RET
;读秒,返回A-秒数据
Sec_Read:
MOVA,#Second
LCALLRead
ANLA,#7FH
RET
;读取时间,TIME-时间数据缓冲区
Time_Read:
MOVA,#Second;起始读取地址,从秒开始
MOVR7,#7;连续读取数据个数:
秒,分,时,天,周,月,年
MOVR0,#TIME;时间数据缓冲区
LCALLRead_Sequence;连续读取子程序
LCALLTime_Adjust
RET
;时间写入,将秒,分,时,日,周,月,年写入;TIME-欲写入时间数据缓冲区
Time_Write:
MOVR0,#TIME;时间数据缓冲区首地址
MOVA,#Second;秒数据地址为起始写入地址
Time_Write_1:
PUSHACC
MOVB,@R0;B-时间数据
LCALLWrite
POPACC
INCA
INCR0
CJNER0,#TIME+7,Time_Write_1
RET
;闹钟时间读取,只开启了时,分闹铃
Alarm_Read:
MOVA,#MinuteA;起始读取地址,从分钟闹铃开始
MOVR7,#2;读取数据个数:
分,时
LCALLRead_Sequence;连续读取子程序
RET
;时间调整,去除不必要的位数据
Time_Adjust:
MOVR0,#TIME
MOVA,@R0
ANLA,#7FH;调整秒
XCHA,@R0
INCR0
MOVA,@R0
ANLA,#7FH;调整分钟
XCHA,@R0
INCR0
MOVA,@R0
ANLA,#3FH;调整小时
XCHA,@R0
INCR0
MOVA,@R0
ANLA,#3FH;调整日
XCHA,@R0
INCR0
MOVA,@R0
ANLA,#07H;调整周
XCHA,@R0
INCR0
MOVA,@R0
ANLA,#1FH;调整月,年不用调整
XCHA,@R0
RET
;停止闹铃
Alarm_Stop:
MOVA,#CS2;控制/状态2寄存器地址
LCALLRead;读出当前控制/状态2寄存器值,在A中
ANLA,#0F7H;清AF闹铃标志,AF在CS2第3位
MOVB,A;欲写入数据放B中
MOVA,#CS2
LCALLWrite
RET
;写入1个字节数据,A-寄存器地址,B-数据
Write:
PUSHACC;寄存器地址压栈
LCALLStart;开始信号
MOVA,#PCF8563_WRITE;写操作指令
LCALLWrite_8bits;写入8位数据
LCALLAcknowledge;查询接收端应答信号
POPACC;写入寄存器地址
LCALLWrite_8bits
LCALLAcknowledge
MOVA,B;写入设置值
LCALLWrite_8bits
LCALLAcknowledge
LCALLStop;停止信号
RET
;读取数据,分为两种模式:
字节读取和连续读取
;字节读取,一次读取一个字节的数据,A-读取地址及存放读出的数据
Read:
PUSHACC;寄存器地址压栈
LCALLStart;开始信号
MOVA,#PCF8563_WRITE;写操作指令
LCALLWrite_8bits;写入8位数据
LCALLAcknowledge;查询接收端应答信号
POPACC;写入寄存器地址
LCALLWrite_8bits
LCALLAcknowledge
LCALLStart
MOVA,#PCF8563_Read;读操作指令
LCALLWrite_8bits
LCALLAcknowledge
LCALLRead_8bits;读取数据
LCALLStop;停止信号
RET
;连续读取n个数据,n≤16;A-寄存器首地址,R7-读取数据个数,RO-读取数据存放首地址
Read_Sequence:
PUSHACC;寄存器地址压栈
LCALLStart;开始信号
MOVA,#PCF8563_WRITE;写操作指令
LCALLWrite_8bits;写入8位数据
LCALLAcknowledge;查询接收端应答信号
POPACC;写入寄存器地址
LCALLWrite_8bits
LCALLAcknowledge
LCALLStart
MOVA,#PCF8563_Read;读操作指令
LCALLWrite_8bits
LCALLAcknowledge
SJMPRead_Sequence_1
Read_Sequence_2:
LCALLMasterACK
Read_Sequence_1:
LCALLRead_8bits;读取数据
MOV@R0,A
INCR0
DJNZR7,Read_Sequence_2
LCALLStop
RET
Delay_tHD_DATMACRO
NOP
ENDM
Delay_tSU_DATMACRO
NOP
ENDM
Delay_tHIGHMACRO
NOP
NOP
ENDM
Delay_tLOWMACRO
NOP
ENDM
Delay_tHD_STAMACRO
NOP
ENDM
Delay_tSU_STOMACRO
NOP
ENDM
Delay_tBUFMACRO
NOP
NOP
ENDM
;写入8位数据
Write_8bits:
PUSH07H
MOVR7,#8
Write_8bits_1:
CLRSCL
Delay_tHD_DAT
RLCA
MOVSDA,C;数据在SCL为低时,将数据送上SDA
Delay_tSU_DAT
SETBSCL
Delay_tHIGH
DJNZR7,Write_8bits_1
CLRSCL
POP07H
RET
Read_8bits:
PUSH07H
MOVR7,#8
Read_8bits_1:
CLRSCL
Delay_tLOW
SETBSCL;SCL高电平时,读取SDA数据
Delay_tHIGH
MOVC,SDA
RLCA
DJNZR7,Read_8bits_1
CLRSCL
POP07H
RET
;开始信号
Start:
SETBSDA;IIC总线操作开始信号:
SCL为高时,SDA由高-->低
SETBSCL
Delay_tBUF
CLRSDA
Delay_tHD_STA
CLRSCL
RET
;结束信号
Stop:
Delay_tHD_DAT
CLRSDA;IIC总线操作结束信号:
SCL为高时,SDA由低-->高
SETBSCL
Delay_tSU_STO
SETBSDA;操作结束后,确保IIC总线处于释放状态
RET
;从机应答查询
Acknowledge:
Delay_tLOW
SETBSDA;查询接收端应答信号,要先释放总线
SETBSCL
Delay_tHIGH
JBSDA,$;接收端应答标志:
将SDA置低
CLRSCL
RET
;主机应答
MasterACK:
Delay_tHD_DAT
CLRSDA;数据线SDA置0应答
Delay_tSU_DAT
SETBSCL
Delay_tHIGH
CLRSCL
SETBSDA;置高数据,必须
RET
;延时8ms
Delay8ms:
PUSH07H
PUSH06H
MOVR7,#36
Delay8ms_1:
MOVR6,#100
DJNZR6,$
DJNZR7,Delay8ms_1
POP06H
POP07H
RET
END
NAMEY12864;液晶显示控制子程序
PUBLICDisp_LineR,Disp_LineDP,Clear_LCD,Close_Cursor,LCD_INIT,Set_Cursor
PUBLICWRDATE,WRCOM
PUBLICDraw_A_Picture,Draw_one_row,Draw_one_line,Draw_One_dot,Write_GDRAM_X_Y,Read_GDRAM_X_Y
PUBLICFill_Y12864,Set_GDRAM_Ad
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子钟 单片机 设计