自动报时设计VHDL.docx
《自动报时设计VHDL.docx》由会员分享,可在线阅读,更多相关《自动报时设计VHDL.docx(25页珍藏版)》请在冰豆网上搜索。
![自动报时设计VHDL.docx](https://file1.bdocx.com/fileroot1/2023-1/23/6834af5f-3f48-4ca0-9104-4c11b2254805/6834af5f-3f48-4ca0-9104-4c11b22548051.gif)
自动报时设计VHDL
题目:
自动报时系统设计
1设计要求
(1)使用PCF8563T实时时钟芯片与ZLG7290B显示电路结合起来,构成一时钟系统。
(2)由8位数码管显示当前时间,并通过一按钮开关,不按下时显示“时、分、秒”,按下时显示“年、月、日”。
(3)实现整点报时(共五声-前四声为低音,最后一声对应整点为高音)。
(4)可以通过键盘来设定当前时间(时、分、秒)
2设计分析及系统方案设计
(1)由PCF8563T实时时钟芯片提供时间数据,由ZLG7290B显示电路控制8位数码管显示当前时间,二者通过I2C总线结构与AT89C51单片机相连,SDA和SCK分别接P1.0和P1.1。
(2)该系统采用双中断结构,时钟输出CLKOUT接INT0,为低优先级,每一秒触发一次中断;键盘中断输出信号INT接INT1,为高优先级,每当有按键时触发中断。
(3)算法说明:
●10H-1DH:
向PCF8563T输入的相关参数的数据块;
●20H-26H:
从PCF8563T中读出的时间参数(秒、分、小时、日、星期、月、年)。
通过CHAIFEN子程序将20H-26H中获取时间参数拆分查表后送入下列缓冲区:
●28H-2FH:
年(4单元)、月(2单元)、日(2单元);
●38H-3FH:
小时、分钟、秒(各占单元)。
键盘修改时间子程序中先将键值读入A,经判断转换后送入缓冲区20H-22H。
主程序功能:
Ø将10H-1DH中特定时间和控制命令送入PCF8563T对应寄存器中,等待中断。
Ø由于PCF8563T的CLKOUT设定输出频率为1HZ,将其与INT0相连,每秒引发一次中断。
在时钟中断服务程序中读取时间参数,调整各参数后进入整点报时子程序,判断是否报时。
然后将时间参数经拆分查表等操作,将年、月、日送28H-2FH缓冲区,将小时、分、秒送38H-3FH缓冲区,最后根据P1.2电平决定哪个缓冲区内容送ZLG7290B进行显示。
ØZLG7290B的键盘中断输出信号INT与INT1相连,每当有按键是触发中断,先读入键值至A中,判断是A、B或C,分别对应修改时、分、秒,进入对应子程序然后在等待两次输入,经转换设置成十位和个位,存入入12H-14H对应单元,再送入PCF8563T对应寄存器。
3系统电路
4外围接口模块硬件电路功能描述
(1)ZLG7290B:
数码管动态显示驱动、键盘扫描管理芯片,可驱动8位共阴极结构LED数码管,同时可管理64个按键扫描识别,接口采用I2C结构。
(2)PCF8563T:
由Philips公司设计的低功耗CMOS实时时钟日历芯片,具有1.0-5.5V的电压工作范围、一个可编程时钟输出和掉电检测电路,接口采用I2C结构,每次读写操作内部地址寄存器自动产生增量。
(3)交流驱动蜂鸣器:
一种发声元件,体积小,使用PNP驱动,需要一交变信号驱动才能发出相应频率的声音。
5主程序中主要变量定义
RAM单元或工作寄存器定义、功能等。
变量名称
RAM单元/寄存器
功能
PCF8563T时间和控制命令参数
10H-1DH
设定PCF8563T时间和
命令参数的缓冲区
时间参数
20H-26H
从PCF8563T中读出的时间参数(秒、分、小时、日、星期、月、年)缓冲区
年月日
28H-2FH
拆分查表所得年月日缓冲区以待显示
时分秒
38H-3FH
拆分查表所得时分秒缓冲区以待显示
键值
1FH
读入的键值存储单元
6系统软件中各个子程序的功能描述
子程序的名称、功能,以及入口、出口参数。
子程序名称
入口参数
出口参数
功能描述
INT_RCT
无
无
时钟中断服务子程序
PANDUAN
20-21H
无
判断并进行整点报时
CHAIFEN
20-26H
28-2FH、38-3FH
将时间参数拆分查表
CF
A
R4、R3
将A中数据拆违两独立的十六进制数并查表得到对应字型码
ADJUST
20-25H
20-25H
屏蔽各时间参数无关位
INT_7290
无
无
键盘修改时间中断服务子程序
RDKEY
无
A
读键值子程序
WR8563
R7、R0、R2、R3
无
向日历芯片写时间参数
WRNBYT
R7、R0、R2、R3
无
带有内部单元地址的多字节写操作子程序
RDADD
R7、R0、R2、R3、R4
无
带有内部单元地址的多字节读操作子程序
7主程序程序流程图
N
Y
N
YN
NWAIT1
N
Y
Y
WAIT2
N
Y
8程序清单
SDABITP1.0
SCLBITP1.1
WSLA_8563EQU0A2H
RSLA_8563EQU0A3H
WSLA_7290EQU70H
RSLA_7290EQU71H
ORG8000H
LJMP8100H
ORG8003H
LJMPINT_RCT
ORG8013H
LJMPINT_7290
ORG8100H
START:
MOVSP,#60H
CLRP1.7
LCALLDELAY
SETBP1.7
;******************************
;设定PCF8563T的时间和命令参数
;******************************
MOV10H,#00H
MOV11H,#1FH
MOV12H,#50H;秒
MOV13H,#59H;分
MOV14H,#01H;时
MOV15H,#09H;日期
MOV16H,#04H;星期
MOV17H,#06H;月
MOV18H,#11H;年
MOV19H,#00H
MOV1AH,#00H
MOV1BH,#00H
MOV1CH,#00H
MOV1DH,#83H
;*****************************
MOVR7,#0EH
MOVR0,#10H
MOVR2,#00H
MOVR3,#WSLA_8563
LCALLWRNBYT
MOVIP,02H
SETBEA
SETBEX0
SETBEX1
SETBIT0
SETBIT1
SJMP$
;******************************
;时钟中断服务子程序
;******************************
INT_RCT:
MOVR7,#07H
MOVR0,#20H
MOVR2,#02H
MOVR3,#WSLA_8563
MOVR4,#RSLA_8563
LCALLRDADD
LCALLADJUST
LCALLPANDUAN
LCALLCHAIFEN
MOVR7,#08H
MOVR2,#10H
MOVR3,#WSLA_7290
JNBP1.2,YEARS
MOVR0,#38H
SJMPDISP
YEARS:
MOVR0,#28H
DISP:
LCALLWRNBYT
JNBP3.2,$
RETI
;******************************
;整点报时子程序
;******************************
PANDUAN:
MOVA,21H
CJNEA,#59H,PDFEN
MOVA,20H
CJNEA,#56H,PD57
LCALLBAOSHI1
AJMPEXIT
PD57:
CJNEA,#57H,PD58
LCALLBAOSHI1
AJMPEXIT
PD58:
CJNEA,#58H,PD59
LCALLBAOSHI1
AJMPEXIT
PD59:
CJNEA,#59H,EXIT
LCALLBAOSHI1
AJMPEXIT
PDFEN:
CJNEA,#00H,EXIT
MOVA,20H
CJNEA,#00H,EXIT
LCALLBAOSHI2
EXIT:
RET
;*******************************
;低音1S报时
BAOSHI1:
PUSHPSW
PUSH00H
MOVR0,#0FFH
MOVTMOD,#10H
MOVTL1,#00H
MOVTH1,#0FEH
SETBTR1
WORK1:
JNBTF1,$
CLRTF1
MOVTL1,#00H
MOVTH1,#0FEH
CPLP1.4
DJNZR0,WORK1
POP00H
POPPSW
RET
;*****************************
;高音1S报时
BAOSHI2:
PUSHPSW
PUSH00H
PUSH01H
MOVR0,#04H
WORK2:
MOVR1,#00H
MOVTMOD,#10H
MOVTL1,#00H
MOVTH1,#0FFH
SETBTR1
WORK3:
JNBTF1,$
CLRTF1
MOVTL1,#00H
MOVTH1,#0FFH
CPLP1.4
DJNZR1,WORK3
DJNZR0,WORK2
POP01H
POP00H
POPPSW
RET
;******************************
;各子程序
;*****************************
ORG8300H
CHAIFEN:
PUSHPSW
PUSHACC
PUSH03H
PUSH04H
MOVA,20H;取秒参数
LCALLCF
MOV38H,R3
MOV39H,R4
MOV3AH,#02H
MOVA,21H
MOVA,21H;取分参数
LCALLCF
MOV3BH,R3
MOV3CH,R4
MOV3DH,#02H
MOVA,22H;取小时参数
LCALLCF
MOV3EH,R3
MOV3FH,R4
MOVA,23H;取日期参数
LCALLCF
MOVA,R3
MOVR3,A
MOV28H,R3
MOV29H,R4
MOVA,25H;取月参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV2AH,R3
MOV2BH,R4
MOVA,26H;取年参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV2CH,R3
MOV2DH,R4
MOV2EH,#0FCH
MOV2FH,#0DAH
POP04H
POP03H
POPACC
POPPSW
RET
;**************************
;将A中数据拆分为两独立的十六进制数并查表
CF:
PUSH02H
PUSHDPH
PUSHDPL
MOVDPTR,#LEDSEG
MOVR2,A
ANLA,#0FH
MOVCA,@A+DPTR
MOVR3,A
MOVA,R2
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVR4,A
POPDPL
POPDPH
POP02H
RET
;*******************************
LEDSEG:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H
DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
;*******************************
;屏蔽读出的7个字节参数无关位
ADJUST:
PUSHACC
MOVA,20H
ANLA,#7FH
MOV20H,A
MOVA,21H
ANLA,#7FH
MOV21H,A
MOVA,22H
ANLA,#3FH
MOV22H,A
MOVA,23H
ANLA,#3FH
MOV23H,A
MOVA,24H
ANLA,#07H
MOV24H,A
MOVA,25H
ANLA,#1FH
MOV25H,A
POPACC
RET
;**************************
;延时子程序
;***************************
DELAY:
PUSH00H
PUSH01H
MOVR0,#00H
DELAY1:
MOVR1,#00H
DJNZR1,$
DJNZR0,DELAY1
POP01H
POP00H
RET
;******************************
;键盘修改时间中断服务子程序
;*******************************
INT_7290:
PUSH00H
PUSH02H
PUSH03H
PUSH04H
PUSH07H
PUSHACC
PUSHPSW
LCALLRDKEY
;*************************
;修改小时
AKEY:
CJNEA,#0AH,BKEY
JBP3.3,$
LCALLRDKEY
SWAPA
ANL14H,#0FH
ORL14H,A
JBP3.3,$
LCALLRDKEY
ANL14H,#0F0H
ORL14H,A
MOVR7,#01H
MOVR0,#14H
MOVR2,#04H
MOVR3,#WSLA_8563
LCALLWRNBYT
LCALLDELAY
LCALLFLASH
LJMPDOWN
;**********************
;修改分
BKEY:
CJNEA,#0BH,CKEY
JBP3.3,$
LCALLRDKEY
SWAPA
ANL13H,#0FH
ORL13H,A
JBP3.3,$
LCALLRDKEY
ANL13H,#0F0H
ORL13H,A
MOVR7,#01H
MOVR0,#13H
MOVR2,#03H
MOVR3,#WSLA_8563
LCALLWRNBYT
LJMPDOWN
;**********************
;修改秒
CKEY:
CJNEA,#0CH,DOWN
JBP3.3,$
LCALLRDKEY
SWAPA
ANL12H,#0FH
ORL12H,A
JBP3.3,$
LCALLRDKEY
ANL12H,#0F0H
ORL12H,A
MOVR7,#01H
MOVR0,#12H
MOVR2,#02H
MOVR3,#WSLA_8563
LCALLWRNBYT
LJMPDOWN
;*******************
;中断返回退出
DOWN:
CLRIE0
POPPSW
POPACC
POP07H
POP04H
POP03H
POP02H
POP00H
RETI
;*************************
;读键值子程序
RDKEY:
MOVR0,#1FH
MOVR7,#01H
MOVR2,#01H
MOVR3,#WSLA_7290
MOVR4,#RSLA_7290
LCALLRDADD
MOVA,1FH
DECA
RET
;*************************
;向日历芯片中写入时间参数子程序
WR8536:
MOVR7,#07H
MOVR0,#12H
MOVR2,#02H
MOVR3,#WSLA_8563
LCALLWRNBYT
RET
;************************
;相关I2C子程序
;************************
;带有内部单元地址的多字节写操作子程序WRNBYT
;通用的I2C通讯子程序(多字节写操作)
;入口参数R7字节数,R0:
源数据块首地址
;R0原数据块首地址;R2从器件内部子地址;R3:
外围器件地址(写)
;相关子程序WRBYT、STOP、CACK、STA
WRNBYT:
PUSHPSW
PUSHACC
WRADD:
MOVA,R3;取外围器件地地址(包含r/w=0)
LCALLSTA;发送起始信号S
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应
MOVA,R2
LCALLWRBYT;发送内部寄存器首地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
WRDA:
MOVA,@R0
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
INCR0
DJNZR7,WRDA
LCALLSTOP
POPACC
POPPSW
RET
;***********************************
;带有内部单元地址的多字节读操作子程序RDADD
;入口参数R7字节数;
;R0目标数据块首地址;R2从器件内部子地址;
;R3器件地址(写);R4器件地址(读)
;相关子程序WRBYT、STOP、CACK、STA、MACK、MNACK
RDADD:
PUSHPSW;从PCF8563的02H单元读入7个参数
PUSHACC;存放于20H-26H单元
RDADD1:
LCALLSTA
MOVA,R3;取器件地址(写)
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
MOVA,R2;取内部地址
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
LCALLSTA
MOVA,R4;取器件地址(读)
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,RDADD1;如果应答不正确返回重来
RDN:
LCALLRDBYT
MOV@R0,A
DJNZR7,ACK
LCALLMNACK
LCALLSTOP
POPACC
POPPSW
RET
ACK:
LCALLMACK
INCR0
SJMPRDN
;*******************************
;启动信号子程序S
STA:
SETBSDA;启动信号S
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSDA
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
RET
;**************************************
;停止信号子程序P
STOP:
CLRSDA;停止信号P
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
SETBSDA
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
CLRSDA
RET
;**********************************
;应答信号子程序MACK
MACK:
CLRSDA;发送应答信号ACK
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
SETBSDA
RET
;**************************************
;非应答法信号子程序MNACK
MNACK:
SETBSDA;发送非应答信号NACK
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
CLRSDA
RET
;***************************************
;应答检测子程序CACK
CACK:
SETBSDA;应答位检测子程序
SETBSCL
CLRF0
MOVC,SDA;采样SDA
JNCCEND;应答正确时转CEND
SETBF0;应答错误时F0置一
CEND:
CLRSCL
RET
;***************************************
;发送一个字节子程序WRBYT
WRBYT:
PUSH06H
MOVR6,#08H;发送一个字节子程序
WLP:
RLCA;(入口参数A)
MOVSDA,C
SETBSCL
NOP;产生4.7US延时
NOP
NOP
NOP
NOP
CLRSCL
DJNZR6,WLP
POP06H
RET
;****************************************
;接收一个字节子程序RDBYT
RDBYT:
PUSH06H
MOVR6,#08H;接收一个字节子程序
RLP:
SETBSDA
SETBSCL
NOP;产生大于15微秒的延时!
NOP;注意这是专门为ZLG7290
NOP;添加的20微秒延时部分
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOVC,SDA
MOVA,R2
RLCA
MOVR2,A
CLRSCL
DJNZR6,RLP;(出口参数R2)
POP06H