(i=1~7)。有由于执行指令“MOV @DPTR,A”时,/WR=0, 因此,由图2.2可知74HC573有效,它将D0~D7信号保 持并输入ULN2803,信号经过放大后,作为位选信号驱 动8位数码管。
2.2.4 数码管段选择原理:
1.输出段选信号指令:
MOV A,#SELECT ;SELECT为段选信号对应的数值 MOV DPTR,#9000H MOV @DPTR,A 2.电路实现原理:
在指令“MOV DPTR,#9000H”中,9000H代表外部存储器的地址,
对应于A15=1,A12=1,Ai=0(i=0~11,13,14)。由图2.4可知,此时74138译码器有效,由 A=C=0,B=1,得:AJ01=0,AJ0i=1(i=0,2~7)。有 由于执行指令“MOV @DPTR,A”时,/WR=0,因此,由图2.2 可知74HC573有效,它将D0~D7信号保持并作为位选信号输入8位数码管。
2.2.5 4x4键盘控制原理:
由图2.3可知,AJ00=0时,可通过P00~P03向键盘发出扫描信号
或读取键盘信号。具体原理见后续代码。
3. 资源使用
3.1 RAM的使用情况
ALARM EQU 20H.0 ;闹钟设置标志
TIME_UP EQU 20H.1 ;倒计时时间到标志 SOUND_ON EQU 20H.2 ;声音开关标志 UART_EN EQU 20H.3 ;处于串口通信状态标志 IS_HOST EQU 20H.4 HOUR_TP
;是否作为串口通信的主机 标志
EQU 2AH
MIN_TP EQU 2BH SEC_TP EQU 2CH MUSIC_SELECT EQU 2DH
TIME_BUF EQU 2EH ;30~35H连续存放led显示数据 HOUR EQU 36H ;小时 MIN EQU 37H SEC EQU 38H
;分钟 ;秒
COUNT EQU 39H ;每0.05s 加 1 HOUR_ALARM EQU 3AH MIN_ALARM EQU 3BH SEC_ALARM EQU 4BH
SEC_OLD EQU 3CH ;存放旧的秒数 HOUR_DOWN EQU 3DH
MIN_DOWN EQU 3EH ;倒数时分钟数 SEC_DOWN EQU 3FH ;倒数时间秒钟数 VAR_HOUR EQU 40H VAR_MIN EQU 41H
VAR_SEC EQU 42H
MS EQU 43H ;作用同SEC_OLD YEAR0 EQU 44H YEAR1 EQU 45H MONTH EQU 46H DAY EQU 47H MUSIC1 EQU 48H MUSIC2 EQU 49H MUSIC3 EQU 4AH
DATE_BUF EQU 60H ;以下连续12字节为日期显示数据
3.2 系统堆栈使用情况
主程序将SP设置为50H,在50H到60H之间的16字节为堆栈区,由于此工程设计的函数调用层次最多不超过3层且参数主要通过内存变量传递,因此,不会出现堆栈溢出的情况。
此处,更好的方案应该是把DATE_BUF前移并把堆栈放在
DATE_BUF之后。但是,实际操作时发现如果堆栈区包含62H以后的区域,就会出现一个严重的bug,由于这个bug一直没法解释和解决,我只好采用了现在这个方案。
3.3 寄存器使用情况:
1. 累加器A
2. 寄存器B
3. 00区的R0~R7寄存器,01~03区的寄存器不曾使用。
3.4 定时器/计数器使用情况
整个工程用到了定时器T0和T1。
其中T0用于主时钟的计时,优先级最高,不可被软中断中断,
且不可被软中断屏蔽。
T1用于控制播放音乐时音调的频率和控制串口通信时 的波特 率。
4 程序原理与框图
4.1 主函数
4.1.1 主函数框图 T0中断服务: 4.1.2 主函数代码:
;*************************************主函数***********************************************; ;***作者:刘贤莺 ;***日期:2012/2/26 NAME MAIN_FUNC
EXTRN CODE (GET_KEY,BEEP,SET_DOWN_TIMER,CONVERT,DISP,SET_TIME,SET_ALARM_TIME) EXTRN
(COUNTER,DATE_ROLLER,MUSIC,INT_T1,UART_INT,UART_HOST,UART_SLAVE,SET_DATE) ALARM EQU 20H.0 ;闹钟设置标志 TIME_UP EQU 20H.1 ;倒计时时间到标志 SOUND_ON EQU 20H.2 ;声音开关标志 UART_EN EQU 20H.3 ;处于串口通信状态标志 IS_HOST EQU 20H.4 ;是否作为串口通信的主机 标志 HOUR_TP EQU 2AH MIN_TP EQU 2BH SEC_TP EQU 2CH MUSIC_SELECT EQU 2DH
TIME_BUF EQU 2EH ;30~35H连续存放led显示数据 HOUR EQU 36H ;小时 MIN EQU 37H ;分钟 SEC EQU 38H ;秒
COUNT EQU 39H ;每0.05s 加 1 HOUR_ALARM EQU 3AH
CODE
MIN_ALARM EQU 3BH SEC_ALARM EQU 4BH
SEC_OLD EQU 3CH ;存放旧的秒数 HOUR_DOWN EQU 3DH MIN_DOWN EQU 3EH SEC_DOWN EQU 3FH VAR_HOUR EQU 40H VAR_MIN EQU 41H VAR_SEC EQU 42H
MS EQU 43H ;作用同SEC_OLD YEAR0 EQU 44H YEAR1 EQU 45H MONTH EQU 46H DAY EQU 47H MUSIC1 EQU 48H MUSIC2 EQU 49H MUSIC3 EQU 4AH
DATE_BUF EQU 60H ;以下连续12字节为日期显示数据 ;蜂鸣器引脚定义 BUZZER EQU P1.6 PROG SEGMENT CODE CSEG AT 0 ORG 0H JMP MAIN ORG 0BH JMP INT_T0 ORG 001BH
JMP INT_T1 ;跳转至T1中断服务程序 ORG 23H JMP UART_INT CSEG AT 0050H RSEG PROG ;主程序; MAIN:
MOV SP,#50H
LCALL INIT ;初始化变量 LCALL INIT_TIMER ;设置定时器 LCALL INIT_SHOW
;倒数时分钟数 ;倒数时间秒钟数
;无穷循环 LOOP:
MOV VAR_HOUR,HOUR MOV VAR_MIN,MIN MOV VAR_SEC,SEC
LCALL CONVERT ;先传递参数再调用