杜洋工作室 DoYoung Studio
- MCS-51系列单片机C语言编程定时/计数器程序模板
- 适用于MCS-51内核的单片机产品(以STC系列单片机为例)
- 以STC12C2052AD单片机P1接口8个LED灯实验电路为例
- 使用Keil C51 编译器软件(以Keil uVision2为例)
/********************************************************************************************* 函数名:定时/计数器初始化函数 调 用:T_C_init(); 参 数:无 返回值:无 结 果:设置SFR中T/C1和(或)T/C0相关参数 备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽 /**********************************************************************************************/ void T_C_init (void){ TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ] EA = 1; //中断总开关 TH1 = 0xFF; //16位计数寄存器T1高8位(写入初值) TL1 = 0xFF; //16位计数寄存器T1低8位 ET1 = 1; //T/C1中断开关 TR1 = 1; //T/C1启动开关 //TH0 = 0x3C; //16位计数寄存器T0高8位 //TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时) //ET0 = 1; //T/C0中断开关 //TR0 = 1; //T/C0启动开关 } /**********************************************************************************************/ /********************************************************************************************* 函数名:定时/计数器1中断处理函数 调 用:[T/C1溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /**********************************************************************************************/ void T_C1 (void) interrupt 3 using 3{ //切换寄存器组到3 TH1 = 0x3C; //16位计数寄存器T1高8位(重新写入初值) TL1 = 0xB0; //16位计数寄存器T1低8位(0x3CB0 = 50mS延时) //函数内容 } /**********************************************************************************************/ /********************************************************************************************* 函数名:定时/计数器0中断处理函数 调 用:[T/C0溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /**********************************************************************************************/ void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1 TH0 = 0x3C; //16位计数寄存器T0高8位(重新写入初值) TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时) //函数内容 } /**********************************************************************************************/
- 程序模块
/********************************************************************************************* 程序名: 定时计数器中断处理程序 编写人: 杜洋 编写时间: 2009年9月23日 硬件支持: STC12C2052AD 12MHz 接口说明: P1接口8个LED灯 修改日志: NO.1- /********************************************************************************************* 说明:本程序可使单片机P1.0、P1.1接口上的LED灯分别以定时器T0和T1的各自周期闪烁。 P1.0 由 T0 控制 P1.1 由 T1 控制 /*********************************************************************************************/ #include
//通用89C51头文件 sbit LED1 = P1 ^ 0; //定义闪烁LED sbit LED2 = P1 ^ 1; //定义闪烁LED /********************************************************************************************* 函数名:定时/计数器初始化函数 调 用:T_C_init(); 参 数:无 返回值:无 结 果:设置SFR中T/C1和(或)T/C0相关参数 备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽 /**********************************************************************************************/ void T_C_init (void){ TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ] EA = 1; //中断总开关 TH1 = 0xFE; //16位计数寄存器T1高8位(写入初值) TL1 = 0xFE; //16位计数寄存器T1低8位 ET1 = 1; //T/C1中断开关 TR1 = 1; //T/C1启动开关 TH0 = 0x13; //16位计数寄存器T0高8位 TL0 = 0x13; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时) ET0 = 1; //T/C0中断开关 TR0 = 1; //T/C0启动开关 } /**********************************************************************************************/ /********************************************************************************************* 函数名:定时/计数器1中断处理函数 调 用:[T/C1溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /**********************************************************************************************/ void T_C1 (void) interrupt 3 using 3{ //切换寄存器组到3 TH1 = 0xFE; //16位计数寄存器T1高8位(重新写入初值) TL1 = 0xFE; //16位计数寄存器T1低8位 LED2 = ~LED2; //取LED相反状态 } /**********************************************************************************************/ /********************************************************************************************* 函数名:定时/计数器0中断处理函数 调 用:[T/C0溢出后中断处理] 参 数:无 返回值:无 结 果:重新写入16位计数寄存器初始值,处理用户程序 备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致 /**********************************************************************************************/ void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1 TH0 = 0x13; //16位计数寄存器T0高8位(重新写入初值) TL0 = 0x13; //16位计数寄存器T0低8位 LED1 = ~LED1; //取LED相反状态 } /**********************************************************************************************/ /*********************************************************************************************/ void main (void){ //主程序 T_C_init(); //初始化 while(1){ } } /*********************************************************************************************/
- 应用实例
1. 定时/计数器程序应考虑系统时钟频率,本实验以12.000MHz晶体为例。 2. 定时/计数器程序需要考虑机械周期,STC系列1T单片机在默认设置时与12T单片机性能兼容。 3. 定时/计数器程序在中断处理时将不暂时关闭其他中断。 [SFR中与定时/计数器工作方式有关的设计] ----------------------------------------------------------------------------- M1 M0 方式 说明 0 0 0 13位T/C,由TL低5位和TH的8位组成13位计数器 0 1 1 16位T/C,TL和TH共16位计数器 1 0 2 8位T/C,TL用于计数,当TL溢出时将TH中的值自动写入TL 1 1 3 两组8位T/C ----------------------------------------------------------------------------- 可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。
- 使用说明
- SFR数据表
- 单片机数据手册上的定时/计数器设置项(详见官方数据手册)
- 51定时器初值计算工具
下载 Download
-
实验电路原理图下载 SCH
链接 Links
-
STC系列单片机官方数据手册
更多 More
-
杜洋工作室首页
-
论坛服务
-
联系方式