
STC15F2K60S2单片机的定时器计数器 例题.doc
16页154 第 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 = 78H1)查询方式实现: ORG 0000HMOVTMOD,#00H;设 T1 为方式 0 定时模式 MOVTH1,#0ECH;置 5mS 定时的初值 MOVTL1,#78H SETBTR1;启动 T1 Check_TF1:JBCTF1,Timer1_Overflow ;查询计数溢出SJMPCheck_TF1;未到 5mS 继续计数 Timer1_Overflow:CPL P1.0 ;对 P1.0 取反输出 SJMP Check_TF1;未到 1s 继续循环 END (2)中断方式实现:ORG0000HLJMPMAIN ;上电复位后,转 MAINORG001BHLJMPTimer1_ISR ;T1 中断响应后,转 Timer1_ISRORG0100H MAIN:MOV TMOD,#00H;设 T1 为方式 0 定时模式MOV TH1,#0ECH;置 5mS 定时的初值 MOV TL1,#78H SETB ET1155 SETB EA ;开放中断 SETB TR1;启动 T1 SJMP $ ;原地踏步,模拟主程序Timer1_ISR: CPL P1.0 ;对 P1.0 取反输出RETI ;中断返回,回到主程序执行 SJMP $ END156 例 8.2 用定时/计数器扩展外部中断。
解:当实际应用系统中有两个以上的外部中断源,而片内定时/计数器未使用时,可利 用定时/计数器来扩展外部中断源扩展方法是,将定时/计数器设置为计数器方式,计数 初值设定为满程,将待扩展的外部中断源接到定时/计数器的外部计数引脚从该引脚输入 一个下降沿信号,计数器加 1 后便产生定时/计数器溢出中断因此,可把定时/计数器的 外部计数引脚作为扩展中断源的中断输入端设采用 T1 实现,采用工作方 2,即 TH1、TL1 的初值均为 FFH,T1 中断开放,即 T1 引脚(P3.5)为扩展外部中断的中断请求信号输入端,触发方式为下降沿触发其初始化程 序(中断方式)如下:ORG0000HLJMPMAIN ;上电复位后,转 MAINORG001BHLJMPEX_ISR ;T1 中断响应后,转 EX_ISRORG0100H MAIN:MOV TMOD,#60H ;设 T1 为方式 1 计模式MOV TH1,#0FFH MOV TL1,#0FFHSETB ET1SETB EA ;开放中断SETB TR1 ;启动 T1… … ;主程序其它指令… … EX_ISR: … … ;扩展外部中断的中断服务程序… …RETIEND 思考:试将例 8.2 的功能用 T0 或 T1 的方式 0 实现。
157 例 8.3 使信号灯循环点亮,首先按从左至右轮流点亮,再按从右至左轮流点亮,每个 信号灯点亮的时间间隔为 1 秒要求用单片机定时/计数器定时实现解:硬件电路比较简单,采用 P1 口输出驱动电平,低电平有效电路如图 8.7 所示图 8.7 流水灯显示电路 系统采用 12M 晶振,分频系数为 12,即定时时钟周期为 1μS;采用定时器 T1 方式 0 定时 50mS,用 R3 做 50ms 计数单元,20 次 50mS 定时即为 1S,故 R3 的初始值为 20汇编语言参考程序如下:1)查询方式实现 ORG0000H 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: 158 MOV R3,#20 ;置 50ms 计数循环初值 MOV TMOD,#00H;设定时器 1 为方式 1MOV TH1,#3CH;置定时器初值 MOV TL1,#0B0H SETB TR1 ;启动 T1Check_TF1: JBC TF1,Timer1_Overflow ;查询计数溢出 SJMP Check_TF1;未到 50ms 继续计数 Timer1_Overflow:DJNZ R3,Check_TF1 ;未到 1s 继续循环CLR TR1 ;关闭 T1RET ;返回主程序END 2)中断方式实现 ORG0000HLJMPMAIN ORG001BH LJMPTimer1_ISR MAIN: MOV R3,#20 ;置 50ms 计数循环初值 MOV TMOD,#00H;设定时器 1 为方式 1MOV TH1,#3CH;置 50ms 定时器初值 MOV TL1,#0B0H MOV R2,#07H ;设置左移的次数MOV P1,#0FEH ;设置信号灯的显示(左移)的起始状态值MOV A,#0FEH ;设置信号灯的显示(左移)的起始状态值CLR 00H ;设置左、右移标志位,为 0 左移,为 1 右移 SETB ET1SETB EASETP TR1 ;启动 T1 定时器SJMP $ ;原地踏步,模拟主程序 Timer1_ISR:DJNZ R3,Exit_Timer1_ISR ;定时时间到,执行移位,否则中断结束MOV R3, #20JB 00H, Right_Shift ;判断左、右移控制RL A ;左移控制MOV P1, ADJNZ R2,Exit_Timer1_ISR ;判断左移流程是否结束,若结束,转入右移控制 SETB 00H ;置位左、右移控制标志159 MOV R2, #07H ;重新设置移位次数SJMP Exit_Timer1_ISR Right_Shift: RR A ;右移控制MOV P1, ADJNZ R2,Exit_Timer1_ISR ;判断左移流程是否结束,若结束,转入右移控制 CLR 00H ;清 0 左、右移控制标志MOV R2, #07H ;重新设置移位次数 Exit_Timer1_ISR:RETIENDC51 参考程序如下:1)查询方式实现#include //包含 52 标准文件头 #include //包含循环左移、右移子函数 #define uchar unsigned char #define uint unsigned int uchar LED = 0xfe; /*---------------------利用 T1 实现定时的子函数------------------*/ void DELAY(void) //延时函数 1S { uint i = 0; TMOD = 0x00;//T1 工作模式 1 TH1 = 0x3c; TL1 = 0xb0; TR1 = 1; while(i //包含 52 标准文件头 #include //包含循环左移、右移子函数 #define uchar unsigned char #define uint unsigned char /*---------------------定义全局变量------------------*/ uchar LED = 0xfe; uchar i = 0; uchar t = 0;161 /*---------------------T1 初始化子函数------------------*/ void Timer1_init(void) { TMOD = 0x00; //T1 工作模式 1 TH1 = 0x3c;TL1 = 0xb0; ET1 = 1; EA = 1; TR1 = 1; } /*---------------------LED 循环显示子函数------------------*/ void Shift(void) { P1 = LED; t++; if(t sbit led = P1^0; void timer_initial(void) { TMOD = 0x60;//设定定时器 1 模式 2,计数功能 TH1 = 0xfb; //5 个脉冲以后溢出 TL1 = 0xfb; TR1 = 1;//开始计数器} void main(void) { timer_initial(); while(1) { while(TF1==0); TF1 = 0; Led = ~led;//不断查询是否溢出,没有溢出,就等待溢出了;溢出了,//清空溢出标志,led 取反 } }2)中断方式实现 #include #define uchar unsigned char #define uint unsigned char164 sbit LED = P1^0; /*---------------------T1 初始化子函数------------------*/ void Timer1_init(void) { TMOD = 0x60;//1 设定定时器 1 模式 2,计数功能TH1 = 0xfb;//设置计数器初值(计满溢出值-5) TL1 = 0xfb; ET1 = 1; EA = 1; TR1 = 1;//启动计数 } /*---------------------T1 中断服务子函数------------------*/ void Timer1_int(void) in。
