|
單片機定時、計數(shù)器編程技術(shù)(下)源程序 2. 實時定時/計數(shù)器的編程 (4)實時定時器應(yīng)用范例 程序: ;中斷地址表 ORG 0000H AJMP MAIN ORG 000BH AJMP INT_T0 ;主程序 ORG 100H MAIN: MOV IE,#82H ;CPU、T0中斷開放 MOV TMOD,#01H ;T0定時功能,模式1,軟啟動 MOV TL0,#0F0H ;T0計數(shù)器賦初值 MOV TH0,#0D8H SETB TR0 ;T0啟動 …… ;T0定時10ms中斷程序 ORG 1000H INT_T0: MOV TL0,#0F0H ;T0計數(shù)器重賦初值 MOV TH0,#0D8H CPL P1.0 RETI (5)外部事件計數(shù)器應(yīng)用范例 程序: ;中斷地址表 ORG 0000H AJMP MAIN ORG 000BH AJMP INT_T0 ;主程序 ORG 100H MAIN: MOV IE,#82H ;CPU、T0中斷開放 MOV TMOD,#0EH ;T0計數(shù)功能,模式2,硬啟動方式 MOV TL0,#156 ;T0計數(shù)器賦初值 MOV TH0,#156 SETB TR0 ;T0軟啟動 …… ;T0 計數(shù)100次中斷程序 ORG 1000H INT_T0: CPL P1.0 RETI 由于模式2是初值自動重裝,所以不需要在中斷程序中重賦初值。 3.實時定時器的應(yīng)用實例 (1)1秒鐘實時定時器設(shè)計 源程序如下: ;中斷地址表 ORG 0000H AJMP MAIN ORG 000BH AJMP INT_T0 ;主程序 ORG 100H MAIN: MOV IE,#82H ;CPU、T0中斷開放 MOV TMOD,#01H ;T0定時功能,模式1,軟啟動方式 MOV TL0,#0B0H ;T0計數(shù)器賦初值 MOV R7,#20 ;R7為1秒軟件計數(shù)器,計數(shù)初值20 SETB TR0 ;T0啟動 …… ;T0定時50ms中斷子程序 ORG 1000H INT_T0: PUSH PSW ;保護現(xiàn)場, 1機器周期 MOV TL0,#0B5H ;T0計數(shù)器重賦初值,1機器周期 MOV TH0,#3CH DJNZ R7,QUT ;1秒未到,退出中斷 MOV R7,#14H ;1秒到,軟件計數(shù)器重賦初值 CPL P1.0 ;P1.0按要求取反 QUT: POP PSW RETI 完整的50ms精確誤差補償中斷程序如下: INT_T0: PUSH PSW ;保護現(xiàn)場, CLR EA ;關(guān)CPU中斷 CLR TR0 ;關(guān)閉定時器T0 MOV A,#0B7H ;低8位計數(shù)修正值=B0+7 1機器周期 ADD A,TL0 ;低8位初值補償 1機器周期 MOV TL0,A ;重裝低8位初值 1機器周期 T0定時器 MOV A,#3CH ;高8位修正值 1機器周期 關(guān)閉7個 ADDC A,TH0 ;高8位初值補償 1機器周期 機器周期 MOV TH0,A ;重裝高8位初值 1機器周期 SETB TR0 ;重新啟動定時器T0 1機器周期 SETB EA DJNZ R7,QUT ;1秒未到,退出中斷 MOV R7,#14H ;1秒到,軟件計數(shù)器重賦初值 CPL P1.0 ;P1.0按要求取反 QUT: POP PSW RETI (3)1分鐘實時定時器設(shè)計 源程序如下: ;中斷地址表 ORG 0000H AJMP MAIN ORG 000BH AJMP INT_T0 ;主程序 ORG 100H MAIN: MOV IE,#82H ;CPU、T0中斷開放 MOV TMOD,#01H ;T0定時功能,模式1,軟啟動方式 MOV TL0,#0B0H ;T0計數(shù)器賦初值 MOV TH0,#3CH ;T0計數(shù)器賦初值 SETB RS0 ;切換至工作寄存器組1 MOV R7,#20 ;R7為1秒軟件計數(shù)器,計數(shù)初值20 MOV R6,#60 SETB TR0 ;T0啟動 CLR RS0 ;工作寄存器組切換 …… ;T0定時50ms中斷子程序 ORG 1000H INT_T0: PUSH PSW ;保護現(xiàn)場, 1機器周期 SETB RS0 ;工作寄存器組切換 DJNZ R7,QUT ;1秒未到,退出中斷 MOV R7,#20 ;1秒到,軟件計數(shù)器重賦初值 DJNZ R6,OUT ;1分鐘未到,退出中斷 MOV R6,#60 ;1分鐘到,軟件計數(shù)器重賦初值 CPL P1.0 ;P1.0按要求取反 QUT: CLR EA ;關(guān)CPU中斷 CLR TR0 ;關(guān)閉定時器T0 MOV A,#0B7H ;低8位計數(shù)修正值=B0+7 ADD A,TL0 ;低8位初值補償 MOV TL0,A ;重裝低8位初值 MOV A,#3CH ;高8位修正值 精確時間補償 ADDC A,TH0 ;高8位初值補償 MOV TH0,A ;重裝高8位初值 SETB TR0 ;重新啟動定時器T0 SETB EA CLR RS0 ;工作寄存器組切換 POP PSW RETI …… 上述中斷程序中,對硬件定時器的初值采用精確誤差補償進行重賦。此時,精度補償程序應(yīng)當(dāng)在中斷程序的退出前才執(zhí)行,這樣才能夠達到精確誤差補償?shù)淖饔茫绻瑢⒕妊a償程序放在中斷程序的其他部分執(zhí)行,請讀者自己分析其誤差補償?shù)慕Y(jié)果。 (4)1小時實時定時器設(shè)計 源程序如下: ;中斷地址表 ORG 0000H AJMP MAIN ORG 000BH AJMP INT_T0 ;主程序 ORG 100H MAIN: MOV IE,#82H ;CPU、T0中斷開放 MOV TMOD,#01H ;T0定時功能,模式1,軟啟動方式 MOV TL0,#0B0H ;T0計數(shù)器賦初值 MOV TH0,#3CH ;T0計數(shù)器賦初值 SETB RS0 ;切換至工作寄存器組1 MOV R7,#20 ;R7為1秒軟件計數(shù)器,計數(shù)初值20 MOV R6,#60 SETB TR0 ;T0啟動 CLR RS0 ;工作寄存器組切換 …… ;T0定時50ms中斷子程序 ORG 1000H INT_T0: PUSH PSW ;保護現(xiàn)場, 1機器周期 SETB RS0 ;工作寄存器組切換 DJNZ R7,QUT ;1秒未到,退出中斷 MOV R7,#20 ;1秒到,軟件計數(shù)器重賦初值 DJNZ R6,OUT ;1分鐘未到,退出中斷 MOV R6,#60 ;1分鐘到,軟件計數(shù)器重賦初值 DJNZ R5,OUT ;1小時未到,退出中斷 MOV R5,#60 ;1小時到,軟件計數(shù)器重賦初值 CPL P1.0 ;P1.0按要求取反 QUT: CLR EA ;關(guān)CPU中斷 CLR TR0 ;關(guān)閉定時器T0 MOV A,#0B7H ;低8位計數(shù)修正值=B0+7 ADD A,TL0 ;低8位初值補償 MOV TL0,A ;重裝低8位初值 MOV A,#3CH ;高8位修正值 精確時間補償 ADDC A,TH0 ;高8位初值補償 MOV TH0,A ;重裝高8位初值 SETB TR0 ;重新啟動定時器T0 SETB EA CLR RS0 ;工作寄存器組切換 POP PSW RETI …… 讀者也可以根據(jù)上述編程模式,設(shè)計24小時或更長時間的實時定時器。 |