单片机综合设计Word文档格式.docx
《单片机综合设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机综合设计Word文档格式.docx(34页珍藏版)》请在冰点文库上搜索。
实时时钟芯片,提供时、分、秒、年、月、日、星期。
ZLG7290B:
有键盘输入和数码管显示功能,通过按键修改时间,通过数码管显示时间和温度。
DS18B20:
采集温度功能,将温度数据读取到单片机内再通过数码管显示出来。
蜂鸣器:
用作整点报时和温度报警。
5主程序中主要变量定义
变量名称
RAM单元/寄存器
功能
WSLA_8563
0A2H
PCF8563T口地址(写)
RSLA_8563
0A3H
PCF8563T口地址(读)
WSLA_7290
70H
ZLG7290B口地址(写)
RSLA_7290
71H
ZLG7290B口地址(读)
WSLA
DS18B20口地址(写)
RSLA
DS18B20口地址(读)
TEMPER_L
36H
存放读出温度低位数据
TEMPER_H
35H
存放读出温度高位数据
TEMPER
34H
存放转换后的8位温度值
TEMPER_NUM
60H
缓冲单元
TEMPER3
37H
存放温度整数值百位部分
TEMPER2
38H
存放温度整数值十位部分
TEMPER1
39H
存放温度整数值个位部分
TEMPER0
3AH
存放温度整数值小数部分
TEM
54H
存放设置温度上限值
DATA_1
40H
小数部分首地址
6系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能描述
INT_RCT
PCF8563T的00H~0DH;
单片机38H~3FH
单片机10H~1DH,20H~26H;
ZLG7290B的10H~17H
时钟中断服务子程序。
每秒将8563中的当前时间读入单片机的10H~1DH中;
将8563的02H~08H读入单片机内部的20H~26H;
将单片机内部的38H~3FH写到7290的10H~17H;
整点报时
INT_7290
累加器A
修改时间和显示温度中断服务子程序。
通过功能键A、B、C、D、E进行时间修改、时间显示、温度显示
RDKEY
ZLG7290B的01H
读键值子程序
WR8563
RAM的10H~1DH
PCF8563T的00H~0DH
向日历芯片写入时间参数。
将RAM的10H~1DH中的时间参数(含控制字)写入芯片的00H~0DH单元
DISPLAY
PCF8563T02H~08H;
单片机20H~26H;
ZLG7290的10H~17H
显示当前时间子程序
LIGHT
ZLG7290的07H、08H
闪烁子程序
RING、RING1
—
蜂鸣器响程序
CHAIFEN
单片机20H~26H
单片机28H~2FH,38H~3FH
对20H~26H单元的参数拆分并在查表后送28H~2FH和38H~3FH
CF
R3、R4
将A中数据拆分为两独立的十六进制数并查表
ADJUST
20H~26H
屏蔽读出的7个字节参数无关位
DELAY
延时子程序延时256ms
DELAY2
延时子程序延时80us
SHOW
21H~24H
将小数部分的字型码转移到变量区
TEMPER_COV10
TEMPER3、TEMPER2、TEMPER1(25H~27H)
温度二进制转换为十进制显示
GET_TEMPER
35H、36H
从DS18B20中读出12位温度数据。
高位存于单片机的RAM的35H单元、低位存于36H单元
INIT_1820
FLAG1
初始化子程序(寻找DS18B20并建立标志)
TEMPER_COV
TEMPER_L、TEMPER_H
TEMPER_NUM、TEMPER
将读出的数据进行转换
WRITE_1820
向DS18B20中写入一个字节的数据
READ_18200
从DS18B20中读出两个字节的温度数据
7主程序程序流程图
开始
7290复位
设定T1、T0方式及定时初值
设定温度上限值
设定PCF8563T的时间和命令参数
将初值写入8563
开中断
等待中断
8程序清单
SDABITP1.0
SCLBITP1.1
WSLA_8563EQU0A2H
RSLA_8563EQU0A3H
WSLA_7290EQU70H
RSLA_7290EQU71H
WSLAEQU70H
RSLAEQU71H
TEMPER_LEQU36H;
TEMPER_HEQU35H;
TEMPEREQU34H;
TEMPER_NUMEQU60H;
FLAG1BIT00H;
20H单元中的bit位
DQBITP1.2;
一线总线控制端口
TEMPER3EQU37H;
TEMPER2EQU38H;
TEMPER1EQU39H;
TEMPER0EQU3AH;
TEMEQU54H;
DATA_1EQU40H
ORG8000H
LJMP8100H
ORG8013H;
INT1中断入口地址,每秒刷新一次时间
LJMPINT_RCT
ORG8003H
LJMPINT_7290;
INT0中断入口地址,修改时间
ORG8100H
START:
MOVSP,#60H;
CLRP1.7
LCALLDELAY
SETBP1.7
MOVTMOD,#11H;
T1方式1,T0方式1
MOVTL0,#33H;
设置定时0.5ms初值
MOVTH0,#0FEH
MOVTEM,#27
MOVDPTR,#LEDSEG
;
******************************
设定PCF8563T的时间和命令参数
MOV10H,#00H
MOV11H,#1FH
MOV12H,#20H;
秒
MOV13H,#22H;
分
MOV14H,#16H;
时
MOV15H,#16H;
日期
MOV16H,#03H;
星期
MOV17H,#04H;
月
MOV18H,#15H;
年
MOV19H,#00H
MOV1AH,#00H
MOV1BH,#00H
MOV1CH,#00H
MOV1DH,#83H
*****************************
MOVR7,#0EH
MOVR0,#10H
MOVR2,#00H
MOVR3,#WSLA_8563
LCALLWRNBYT
SETBEA
SETBEX0;
开INT0中断
SETBIT0;
触发极性为下降沿
SETBEX1;
开INT1中断
SETBIT1;
SJMP$
时钟中断服务子程序
INT_RCT:
;
每秒将8563中的当前时间读入单片机的10H~1DH中
MOVR0,#10H;
键值缓冲单元
MOVR7,#0EH;
取第一个数据(键值)
MOVR2,#00H;
指向内部数据键值寄存器地址
MOVR3,#WSLA_8563;
取器件地址(写)
MOVR4,#RSLA_8563;
取器件地址(读)
LCALLRDADD
将8563的02H~08H读入单片机内部的20H~26H
MOVR7,#07H
MOVR0,#20H
MOVR2,#02H
MOVR4,#RSLA_8563
LCALLRDADD
LCALLADJUST
LCALLCHAIFEN
将单片机内部的38H~3FH写到7290的10H~17H
MOVR7,#08H
MOVR2,#10H
MOVR3,#WSLA_7290
MOVR0,#38H
LCALLWRNBYT;
显示
JNBP3.2,$
PUSHACC
MOVA,21H;
取分参数
CJNEA,#59H,JUD;
判断是否59分,若不是,判断是否整点
MOVA,20H
CJNEA,#56H,J1;
判断是否56秒
LCALLRING
SJMPEXIT
J1:
CJNEA,#57H,J2;
判断是否57秒
J2:
CJNEA,#58H,J3;
判断是否58秒
J3:
CJNEA,#59H,EXIT;
判断是否59秒
JUD:
CJNEA,#00H,EXIT
CJNEA,#00H,EXIT
LCALLRING1
EXIT:
POPACC
RETI
********************************
修改时间和显示温度中断服务子程序
INT_7290:
PUSH00H
PUSH02H
PUSH03H
PUSH04H
PUSH07H
PUSHPSW
LCALLRDKEY
CJNEA,#0AH,CMP1;
是否按A键修改小时,不是的话判断是否是按B键修改分钟
AKEY1:
LCALLDISPLAY;
显示当前时间
PUSHACC;
闪烁
MOVA,#0C0H
LCALLLIGHT
POPACC
JBP3.2,$;
等待再次按键修改小时十位
LCALLRDKEY;
读取所按键值
SWAPA;
将键值数据处理成小时数据的十位
ANL14H,#0FH
ORL14H,A;
将处理好的小时十位送14H单元
LCALLWR8563;
将修改后的参数送PCF8563T
LCALLDISPLAY
JBP3.2,$;
等待再次按键修改小时个位
ANL14H,#0F0H;
将键值数据处理成小时的个位
ORL14H,A
LJMPDOWN
CMP1:
CJNEA,#0BH,CMP2;
是否按B键修改分钟,不是的话判断是否是按C键修改秒
AKEY2:
MOVA,#18H
POPACC
等待再次按键修改分钟十位
SWAPA;
将键值数据处理成分钟数据的十位
ANL13H,#0FH
ORL13H,A;
将处理好的分钟十位送13H单元
LCALLWR8563;
等待再次按键修改分钟个位
ANL13H,#0F0H;
将键值数据处理成分钟的个位
ORL13H,A
CMP2:
CJNEA,#0CH,CMP3;
是否按C键修改秒,不是的话判断是否按D键显示日期
AKEY3:
MOVA,#03H
等待再次按键修改秒十位
将键值数据处理成秒数据的十位
ANL12H,#0FH
ORL12H,A;
将处理好的秒十位送12H单元
LCALLDISPLAY
等待再次按键修改秒个位
ANL12H,#0F0H;
将键值数据处理成秒的个位
ORL12H,A
CMP3:
CJNEA,#0DH,CMP4;
是否按D键显示日期,不是的话判断是否按E键显示温度
MOVR0,#28H
JBP3.2,$
CMP4:
CJNEA,#0EH,BB;
是否按E键显示温度,不是的话退出
SJMPLP1
BB:
LP1:
LCALLGET_TEMPER;
从DS18B20读出温度数据
LCALLTEMPER_COV;
转换读出的温度数据并保存
LCALLTEMPER_COV10;
将温度转换成10进制
**************************************************************
小数部分
MOVA,TEMPER0
CJNEA,00H,X1;
小数部分为0000
MOVDATA_1,#00H
MOVDATA_1+1,#00H
MOVDATA_1+2,#00H
MOVDATA_1+3,#00H
LCALLSHOW
LJMPNEXT
X1:
CJNEA,#01H,X2;
小数部分为0001
MOVDATA_1,#05H
MOVDATA_1+1,#02H
MOVDATA_1+2,#06H
X2:
CJNEA,#02H,X3;
小数部分为0010
MOVDATA_1+1,#05H
MOVDATA_1+2,#02H
MOVDATA_1+3,#01H
X3:
CJNEA,#03H,X4;
小数部分为0011
MOVDATA_1+1,#07H
MOVDATA_1+2,#08H
LJMPNEXT
X4:
CJNEA,#04H,X5;
小数部分为0100
MOVDATA_1+2,#05H
MOVDATA_1+3,#02H
X5:
CJNEA,#05H,X6;
小数部分为0101
MOVDATA_1+2,#01H
MOVDATA_1+3,#03H
X6:
CJNEA,#06H,X7;
小数部分为0110
MOVDATA_1+2,#07H
X7:
CJNEA,#07H,X8;
小数部分为0111
MOVDATA_1+2,#03H
MOVDATA_1+3,#04H
X8:
CJNEA,#08H,X9;
小数部分为1000
MOVDATA_1+3,#05H
X9:
CJNEA,#09H,X10;
小数部分为1001
MOVDATA_1,#05H
X10:
CJNEA,#0AH,X11;
小数部分为1010
MOVDATA_1+3,#06H
X11:
CJNEA,#0BH,X12;
小数部分为1011
X12:
CJNEA,#0CH,X13;
小数部分为1100
MOVDATA_1+3,#07H
X13:
CJNEA,#0DH,X14;
小数部分为1101
MOVDATA_1+3,#08H
X14:
CJNEA,#0EH,X15;
小数部分为1110
X15:
MOVDATA_1,#05H;
小数部分为1111
MOVDATA_1+3,#09H
*****************************************************************
温度大于上限报警
NEXT:
MOVA,TEMPER
CJNEA,TEM,XX
XX:
JCNEXT1
LCALLRING
NEXT1:
MOV20H,#0FCH;
使得数码管显示最后一位为0
MOVR7,#08H;
8位数码管显示温度
MOVR2,#10H
MOVR0,#20H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY
JBP3.2,AA
SJMPDOWN
AA:
LJMPLP1
DOWN:
CLRIE1;
清标志
POPPSW
POP07H
POP04H
POP03H
POP02H
POP00H
RETI
RDKEY:
MOVR0,#1FH;
MOVR7,#01H;
MOVR2,#01H;
MOVR3,#WSLA_729