;------------------------------------------------------------------------------- ; 体育百米计时器源程序 ; 总架构:欧福强 ; 74HC595传输子程序:韦国权 ; LED段码:谢名全 ;------------------------------------------------------------------------------- SCK EQU P1.1 ;移位时钟 RCK EQU P1.2 ;更新显示脉冲 SI EQU P1.3 ;串行数据 ;------------------------------------------------------------------------------- ; 30H,31H,32H,33H ;板载LED段码缓冲区 ; 34H,35H ;延时子程序使用 ; R1 ;串行LED发送循环计数 ; R2,R3,R4,R5, ;|计时十进制数字缓冲区| ; .01 .1 1 10 ;|对应位 | ; 40H,41H,41H,43H ;串行LED段码缓冲区 ;------------------------------------------------------------------------------- ORG 0000H SJMP INIT ;系统初始化 ORG 000BH LJMP TIMER_0_IRQ ;定时器0中断 ORG 001BH LJMP TIMER_1_IRQ ;定时器1中断 ;------------------------------------------------------------------------------- ORG 0040H ;系统初始化区 INIT: MOV TMOD,#11H ;都工作在方式1--16位定时器 MOV SP,#71H ;堆栈区设置 SETB PT0 ;10ms定时器中断优先 ;-------------------------------- MOV TH0,#0D8H ;置初值(10MS/12MHz) MOV TL0,#0F4H ;TO ;-------------------------------- MOV TH1,#03CH ;置初值(50MS/12MHz) MOV TL1,#0B0H ;T1 ;-------------------------------- SETB TR1 ;启动(50ms)定时器 MOV IE,#8AH ;打开总中断使能以及定时器中断 ;-------------------------------- MOV R2,#0 ;用户初始化区 MOV R3,#0 MOV R4,#0 MOV R5,#0 ;------------------------------------------------------------------------------- MAIN: LCALL OnbordDisp ;用户程序区,扫描板载LED LCALL KEYSCAN_DEAL ;扫描键盘并处理 SJMP MAIN ;------------------------------------------------------------------------------- TIMER_0_IRQ: MOV TH0,#0D8H ;定时器0中断服务程序(10ms) MOV TL0,#0F4H ;恢复(10ms)定时初值 ;-------------------------------- LCALL TimeCount ;10ms节拍程序区,时间计数 T0_DRE_EXIT: RETI ;------------------------------------------------------------------------------- TIMER_1_IRQ: MOV TH1,#03CH ;定时器1中断服务程序(50ms) MOV TL1,#0B0H ;恢复(50ms)定时初值 ;-------------------------------- LCALL ValToCode ;50ms节拍程序区,转换板载段码 LCALL S_LedValToCode ;转换串行LED数值成段码 LCALL SenDataToLed ;发送到串行LED并显示 T1_DRE_EX: RETI ;------------------------------------------------------------------------------- DELAY: DJNZ 34H,$ ;精确0.1S延时子程序 DJNZ 35H,DELAY MOV 35H,#194 MOV 34H,#78 DJNZ 34H,$ RET ;------------------------------------------------------------------------------- OnbordCodeTab: DB 88H,0BEH,0C4H,94H,0B2H,91H,81H,0BCH ;板载LED段码 DB 80H,90H,0A0H,83H,0C9H,86H,0C1H,0E1H SeriaLedTab: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H ;串行LED段码 DB 0FEH,0F6H ;------------------------------------------------------------------------------- ValToCode: MOV A,R2 ;数值转段码子程序(板载) MOV DPTR,#OnbordCodeTab ;指针指向板载段码表 MOVC A,@A+DPTR MOV 30H,A MOV A,R3 MOVC A,@A+DPTR MOV 31H,A MOV A,R4 MOVC A,@A+DPTR ANL A,#7FH ;秒个位加上小数点 MOV 32H,A MOV A,R5 MOVC A,@A+DPTR MOV 33H,A RET ;------------------------------------------------------------------------------- TimeCount: INC R2 ;计时累加程序 CJNE R2,#0AH,TC_DRE_Exit ;百分秒增值判断 MOV R2,#00H INC R3 CJNE R3,#0AH,TC_DRE_Exit ;十分秒增值判断 MOV R3,#00H INC R4 ;-------------------------------- CPL P1.0 ;秒节拍程序区 ;-------------------------------- CJNE R4,#0AH,TC_DRE_Exit ;秒增值判断 MOV R4,#00H INC R5 ;-------------------------------- NOP ;十秒节拍程序区 ;-------------------------------- CJNE R5,#0AH,TC_DRE_Exit ;十位秒增值判断 MOV R5,#00H TC_DRE_Exit: RET ;------------------------------------------------------------------------------- OnbordDisp: MOV P2,#0FFH ;板载LED扫描子程序 MOV P0,30H MOV P2,#0EFH DJNZ 70H,$ MOV P2,#0FFH MOV P0,31H MOV P2,#0DFH DJNZ 70H,$ MOV P2,#0FFH MOV P0,32H MOV P2,#0BFH DJNZ 70H,$ MOV P2,#0FFH MOV P0,33H MOV P2,#7FH DJNZ 70H,$ MOV P2,#0FFH RET ;------------------------------------------------------------------------------- SenDataToLed: CLR SCK ;更新串行LED显示数据 CLR RCK CLR SI MOV R1,#8 ;循环值清零 ;-------------------------------- MOV A,40H ;读入段码 LO1: RRC A MOV SI,C CLR SCK SETB SCK DJNZ R1,LO1 MOV R1,#8 ;-------------------------------- MOV A,41H LO2: RRC A MOV SI,C CLR SCK SETB SCK DJNZ R1,LO2 MOV R1,#8 ;-------------------------------- MOV A,42H LO3: RRC A MOV SI,C CLR SCK SETB SCK DJNZ R1,LO3 MOV R1,#8 ;-------------------------------- MOV A,43H LO4: RRC A MOV SI,C CLR SCK SETB SCK DJNZ R1,LO4 ;-------------------------------- SETB RCK ;更新串行LED显示 CLR RCK ;停止更新 RET ;------------------------------------------------------------------------------- S_LedValToCode: MOV DPTR,#SeriaLedTab ;串行LED段码转换子程序 MOV A,R2 MOVC A,@A+DPTR MOV 40H,A ;-------------------------------- MOV A,R3 MOVC A,@A+DPTR MOV 41H,A ;-------------------------------- MOV A,R4 MOVC A,@A+DPTR ORL a,#1 ;秒个位加上小数点 MOV 42H,A ;-------------------------------- MOV A,R5 JZ S_ZERO_EXIT MOVC A,@A+DPTR MOV 43H,A RET S_ZERO_EXIT: MOV 43H,#0 ;无效零消隐 RET ;------------------------------------------------------------------------------- KEYSCAN_DEAL: JB P2.0,NEXT1KEY ;键盘扫描处理子程序,P2.0:复位 CLR TR0 ;停止计时 MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV R5,#0 ;时间计数区清零 RET ;复位键返回 ;-------------------------------- NEXT1KEY: JB P2.2,NEXT2KEY ;P2.1:停止键 CLR TR0 ;停止计时 RET ;停止键返回 ;-------------------------------- NEXT2KEY: JB P2.1,KEY_DEAL_END ;P2.2,计时启动键 SETB TR0 ;启动计时 JNB P2.1,$ ;等待按键释放 KEY_DEAL_END: RET ;启动键返回 ;------------------------------------------------------------------------------- END
相关链接:https://bbs.21ic.com/upfiles/img/200712/2007127231137989.rar |