打印

定时/计数器参考程序

[复制链接]
1677|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
定时计数器中断服务程序流程图;

C语言及讲解:
● 0号定时器设置子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名:  SetTimer0
// 功能说明: 配置定时计数器0
// 入口参数: 工作方式
//     定时计数模式
//     控制方式选择
//     第一初值
//     第二初值
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char SetTimer0(char mode, char tc,char ctrl,int value0,int value1)
{
switch(mode)   //工件方式设置
{
  case 0:    //工作方式0
   TMOD = (TMOD & 0xF0) | 0x00;
   TH0 = value0 >> 0x05;
   TL0 = value0 << 0x03;
   break;
  case 1:    //工作方式1
   TMOD = (TMOD & 0xF0) | 0x01;
   TH0 = value0 >> 0x08;
   TL0 = value0 ;
   break;
  case 2:    //工作方式2
   TMOD = (TMOD & 0xF0) | 0x02;
   TH0 = value0 ;
   TL0 = value0 ;
   break;
  case 3:    //工作方式3
   TMOD = (TMOD & 0xF0) | 0x03;
   TH0 = value0;
   TL0 = value1;
   break;
  default:
   return 0;
}
switch(tc)   //定时计数器模式
{
  case 0:   //定时器
   TMOD |= 0x00;
   break;
  case 1:   //计数器
   TMOD |= 0x04;
   break;
  default:
   return 0;
}
switch(ctrl)  //启动模式
{
  case 0:   //TR0控制启动
   TMOD |= 0x00;
   break;
  case 1:   //引脚/INT0控制启动
   TMOD |= 0x08;
   break;
  default:
   return 0;
}
return 1;
}
● 打开0号定时器子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名:  OpenTimer0
// 功能说明: 打开定时计数器0
// 入口参数: 工作方式
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char OpenTimer0(char mode)
{
switch(mode)   //工件方式设置
{
  case 0:    //工作方式0
   ET0 = 1;
   EA = 1;
   TR0 = 1;
   break;
  case 1:    //工作方式1
   ET0 = 1;
   EA = 1;
   TR0 = 1;
   break;
  case 2:    //工作方式2
   ET0 = 1;
   EA = 1;
   TR0 = 1;
   break;
  case 3:    //工作方式3
   ET0 = 1;
   ET1 = 1;
   EA = 1;
   TR0 = 1;
   TR1 = 1;
   break;
  default:
   return 0;
}
return 1;
}
● 1号定时器设置子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名:  SetTimer1
// 功能说明: 配置定时计数器1
// 入口参数: 工作方式
//     定时计数模式
//     控制方式选择
//     第一初值
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char SetTimer1(char mode, char tc,char ctrl,int value0)
{
switch(mode)   //工件方式设置
{
  case 0:    //工作方式0
   TMOD = (TMOD & 0x0F) | 0x00;
   TH0 = value0 >> 0x05;
   TL0 = value0 << 0x03;
   break;
  case 1:    //工作方式1
   TMOD = (TMOD & 0x0F) | 0x10;
   TH0 = value0 >> 0x08;
   TL0 = value0 ;
   break;
  case 2:    //工作方式2
   TMOD = (TMOD & 0x0F) | 0x20;
   TH0 = value0 ;
   TL0 = value0 ;
   break;
  default:
   return 0;
}
switch(tc)   //定时计数器模式
{
  case 0:   //定时器
   TMOD |= 0x00;
   break;
  case 1:   //计数器
   TMOD |= 0x40;
   break;
  default:
   return 0;
}
switch(ctrl)  //启动模式
{
  case 0:   //TR0控制启动
   TMOD |= 0x00;
   break;
  case 1:   //引脚/INT0控制启动
   TMOD |= 0x80;
   break;
  default:
   return 0;
}
return 1;
}
● 打开1号定时器子程序
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 函数名:  OpenTimer1
// 功能说明: 打开定时计数器1
// 入口参数: 工作方式
// 返回参数: 操作结果
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char OpenTimer1(char mode)
{
switch(mode)   //工件方式设置
{ case 0:    //工作方式0
   ET1 = 1;
   EA = 1;
   TR0 = 1;
   break;
  case 1:    //工作方式1
   ET1 = 1;
   EA = 1;
   TR0 = 1;
   break;
  case 2:    //工作方式2
   ET1 = 1;
   EA = 1;
   TR0 = 1;
   break;
  default:
   return 0;
}
return 1;
}

51单片机内部有两个16位定时/计数器,在作为定时器使用时,与软件定时相比,可以实现比较精确的定时时间,利用这一特点,51可以实现对低频信号的数据采集,脉宽调制以及其他多种功能。

相关帖子

沙发
jxmzzr| | 2012-4-2 14:57 | 只看该作者
LZ最好把方式0,1,2,3,都发上来学习学习,谢谢了:handshake

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4195

帖子

31

粉丝