定时计数程序c语言,MCS-51系列单片机C语言编程定时/计数器程序模板

/*********************************************************************************************

函数名:定时/计数器初始化函数

调  用: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延时)

//函数内容

}

/**********************************************************************************************/

/*********************************************************************************************

程序名:    定时计数器中断处理程序

硬件支持:  STC12C2052AD 12MHz

接口说明:  P1接口8个LED灯

/*********************************************************************************************

说明:本程序可使单片机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

-----------------------------------------------------------------------------

可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当中,然后根据情况写入具体内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值