基于C8051F340单片机的定时器2 工作在两个独立8位定时器的C程序

一、前言

C8051F340单片的定时器2有3种工作方式,其中用于定时的有两种:
1、16 位自动重装载方式
2、8 位自动重装载定时器方式(双8位定时器)
定时器 2 是一个 16 位的计数器/定时器,由两个 8 位的 SFR 组成:TMR2L(低字节)和TMR2H(高字节)。定时器 2 可以工作在 16 位自动重装载方式、8 位自动重装载方式(两个 8位定时器)、USB 帧起始(SOF)捕捉方式或低频振荡器(LFO)下降沿捕捉方式。T2SPLIT
位(TMR2CN.3)、T2CE 位(TMR2CN.4)和 T2CSS 位TMR2CN.1)定义定时器 2 的工作方式。定时器 2 的时钟源可以是系统时钟、系统时钟/12 或外部振荡源时钟/8。
文本介绍两个8位自动重装载方式的定时程序。
当 T2SPLIT =‘1’且 T2SOF =‘0’时,定时器 2 工作双 8 位定时器方式。两个 8 位定时器 TMR2H 和 TMR2L 都工作在自动重装载方式。TMR2RLL 保持 TMR2L 的重载值,而 TMR2RLH 保持 TMR2H 的重载值。TMR2CN 中的 TR2 是 TMR2H 的运行控制位。当定时器 2 被配置为 8 位方式时,TMR2L 总是处于运行状态。
每个 8 位定时器都可以被配置为使用 SYSCLK、SYSCLK/12 或外部振荡器时钟/8 作为其时钟源。

二、程序展示

1、程序简介

通过定时器2计时,控制两个LED灯的闪烁,LED1 100ms闪烁一次,LED2 30ms闪烁一次。使用单片机内部的12M晶振,进行硬件12分频,并进行软件8分频。
X*12 * 8/12000000=0.001(1ms) X=125,也就是计数器需要计125次数,定时器2在8位方式,总共可以计2的8次方次数,也就是256次,因为是从0开始计,最多计导255次,现需要计125次,则定时器的初始值应该为255-125=130。

2、头文件部分

#include <C8051F340.h>
#define SYSCLK 12000000/8  //软件进行8分频
#define TIMER0_PRESCALE 12  //通过寄存器设置的分频数
#define LED1_CHG_RATE 100 //设置LED灯的闪烁频率,100代表100ms
#define LED2_CHG_RATE 30 //设置LED灯的闪烁频率,30代表30ms
#define TIMER0_TICK_PER_MS  SYSCLK/TIMER0_PRESCALE/1000
#define REG1 TIMER0_TICK_PER_MS
#define REG2 0xFF-REG1
#define RELOAD_HIGH  REG2  // 高位重载值
#define RELOAD_LOW   REG2  // 低位重载值
sbit LED1 = P2^2;  //通过P2.2输出驱动LED灯闪烁
sbit LED2 = P2^3;  //通过P2.3输出驱动LED灯闪烁
void Port_Init (void);  //端口初始化
void Timer0_Init (void);    //定时器0初始化

3、主程序部分

main ()
{
   PCA0MD &= ~0x40;    // 关闭看门狗
   Timer2_Init ();     // 定时器0初始化
   Port_Init ();       // 端口初始化
   EA = 1;             // 允许中断

   while (1);       
}

4、端口初始化程序

void Port_Init (void)
{
   XBR1 = 0x40;
   P2MDOUT = 0x0C;     //设置P2.2、P2.3推挽输出
}

5、定时器2初始化程序

void Timer2_Init(void)
{
   CKCON &= ~0x60;       // 设置系统时钟12分频
   TMR2CN &= ~0x01;

   TMR2RLH = RELOAD_HIGH;  // 高位重载值
   TMR2RLL = RELOAD_LOW;  // 低位重载值

   TMR2H = TIMER2_RELOAD_HIGH;  //初始化高位寄存器
   TMR2L = TIMER2_RELOAD_LOW;   // 初始化低位寄存器

   TMR2CN = 0x2C;          // 使能定时器2工作在双8位定时器
   ET2 = 1;                // 定时器2中断允许
}

6、定时器2中断程序

void Timer2_ISR (void) interrupt 5
{
   static unsigned int low_counter=0;  
   static unsigned int high_counter=0;

   if(TF2L == 1)
   {
      if((low_counter++) == LED1_CHG_RATE)
      {
         low_counter = 0;              // 低位中断计数
         LED1 = ~LED1;                 // LED1闪烁
      }
      TF2L = 0;
   }
   if(TF2H == 1)
   {
      if((high_counter++) == LED2_TOGGLE_RATE)
      {
         high_counter = 0;             //高位中断计数
         LED2 = ~LED2;                 //LED2闪烁
      }
      TF2H = 0;
   }
}
  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xll_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值