第8章STC15F2K60S2单片机的定时/计数器
例题
例8.1 用T1方式0实现定时,在P1.0引脚输出周期为10mS的方波。 解: 根据题意,采用T1方式0进行定时,因此,(TMOD)=00H。
因为方波周期是10mS,因此T1的定时时间应为5mS,每5mS时间到就对P1.0取反,就可实现在P1.0引脚输出周期为10mS的方波。系统采用12M晶振,分频系数为12,即定时脉钟周期为1μS,则T1的初值为:
X = M ?计数值= 65536 ? 5000 = = 60536 =EC78H
即:TH1 = ECH,TL1 = 78H。 (1)查询方式实现:
ORG 0000H
MOV TMOD,#00H ;设T1为方式0定时模式
MOV TH1,#0ECH ;置5mS定时的初值 MOV TL1,#78H SETB TR1 ;启动T1 Check_TF1: JBC TF1,Timer1_Overflow ;查询计数溢出
SJMP Check_TF1 ;未到5mS继续计数 Timer1_Overflow:
CPL P1.0 ;对P1.0取反输出 SJMP Check_TF1 ;未到1s继续循环 END (2)中断方式实现: ORG 0000H
LJMP MAIN ;上电复位后,转MAIN ORG 001BH
LJMP Timer1_ISR ;T1中断响应后,转 Timer1_ISR ORG 0100H MAIN:
MOV TMOD,#00H ;设T1为方式0定时模式 MOV TH1,#0ECH ;置5mS定时的初值
MOV TL1,#78H SETB ET1 154
SETB EA ;开放中断 SETB TR1 ;启动T1 SJMP $ ;原地踏步,模拟主程序 Timer1_ISR:
CPL P1.0 ;对P1.0取反输出 RETI ;中断返回,回到主程序执行 SJMP $ END
155
例8.2 用定时/计数器扩展外部中断。
解:当实际应用系统中有两个以上的外部中断源,而片内定时/计数器未使用时,可利用定时/计数器来扩展外部中断源。扩展方法是,将定时/计数器设置为计数器方式,计数初值设定为满程,将待扩展的外部中断源接到定时/计数器的外部计数引脚。从该引脚输入一个下降沿信号,计数器加1后便产生定时/计数器溢出中断。因此,可把定时/计数器的外部计数引脚作为扩展中断源的中断输入端。
设采用T1实现,采用工作方2,即TH1、TL1的初值均为FFH,T1中断开放,即T1引脚(P3.5)为扩展外部中断的中断请求信号输入端,触发方式为下降沿触发。其初始化程序(中断方式)如下:
ORG 0000H
LJMP MAIN ;上电复位后,转MAIN ORG 001BH
LJMP EX_ISR ;T1中断响应后,转 EX_ISR ORG 0100H MAIN:
MOV TMOD,#60H ;设T1为方式1计模式
MOV TH1,#0FFH MOV TL1,#0FFH SETB ET1 SETB EA ;开放中断 SETB TR1 ;启动T1
… … ;主程序其它指令 … … EX_ISR:
… … ;扩展外部中断的中断服务程序
… … RETI END
思考:试将例8.2的功能用T0或T1的方式0实现。
156
例8.3 使信号灯循环点亮,首先按从左至右轮流点亮,再按从右至左轮流点亮,每个信号灯点亮的时间间隔为1秒。要求用单片机定时/计数器定时实现。
解:硬件电路比较简单,采用P1口输出驱动电平,低电平有效。电路如图8.7所示。
图8.7 流水灯显示电路
系统采用12M晶振,分频系数为12,即定时时钟周期为1μS;采用定时器T1方式0定时50mS,用R3做50ms计数单元,20次50mS定时即为1S,故R3的初始值为20。 汇编语言参考程序如下: 1)查询方式实现
ORG 0000H
LOOP:
MOV R2,#07H ;设置左移的次数
MOV A,#0FEH ;设置信号灯的显示(左移)的起始状态值 Left_Shift:
MOV P1,A ;送显示控制信号
LCALL DELAY ;利用软件与定时器,实现1s定时 RL A ; 改变信号灯显示状态,左移 DJNZ R2,Left_Shift ;判断左移流程是否结束,若结束,转入右移控制 MOV A,#7FH ;设置信号灯的显示(右移)的起始状态值,可省略 MOV R2,#07H ;设置右移的次数 Right_Shift:
MO P1,A ;送显示控制信号
RR A ; 改变信号灯显示状态,右移 LCALL DELAY ;利用软件与定时器,实现1s定时 DJNZ R2,Right_Shift ;判断左移流程是否结束,若结束,又重新开始 SJMP LOOP DELAY:
157
MOV R3,#20 ;置50ms计数循环初值
MOV TMOD,#00H ;设定时器1为方式1 MOV TH1,#3CH ;置定时器初值 MOV TL1,#0B0H SETB TR1 ;启动T1 Check_TF1:
JBC TF1,Timer1_Overflow ;查询计数溢出 SJMP Check_TF1 ;未到50ms继续计数 Timer1_Overflow:
DJNZ R3,Check_TF1 ;未到1s继续循环 CLR TR1 ;关闭T1 RET ;返回主程序 END
2)中断方式实现
ORG 0000H LJMP MAIN
ORG 001BH
LJMP Timer1_ISR
MAIN:
MOV R3,#20 ;置50ms计数循环初值 MOV TMOD,#00H ;设定时器1为方式1 MOV TH1,#3CH ;置50ms定时器初值 MOV TL1,#0B0H
MOV R2,#07H ;设置左移的次数
MOV P1,#0FEH ;设置信号灯的显示(左移)的起始状态值 MOV A,#0FEH ;设置信号灯的显示(左移)的起始状态值
CLR 00H ;设置左、右移标志位,为0左移,为1右移 SETB ET1 SETB EA
SETP TR1 ;启动T1定时器
SJMP $ ;原地踏步,模拟主程序 Timer1_ISR:
DJNZ R3,Exit_Timer1_ISR ;定时时间到,执行移位,否则中断结束
MOV R3, #20
JB 00H, Right_Shift ;判断左、右移控制 RL A ;左移控制 MOV P1, A
DJNZ R2,Exit_Timer1_ISR ;判断左移流程是否结束,若结束,转入右移控制
SETB 00H ;置位左、右移控制标志 158