定时器1工作方式2c语言,定时器工作模式2

1.工作模式2的使用

这里我们顺便讲解一下定时器0的工作模式2,也就是使用“小试管”的方式,TMOD的初始化就为“TMOD=0x02;”。

我们知道工作模式2的最长溢出时间仅为256*(12/11059200)=0.000277秒=277微秒。

我们想实现间隔51ms的流水灯实验该怎么做,首先我们定义一个变量cnt用来记录每次的溢出次数,然后我们的定时时间为51微秒(因为最大定时只有278微秒),cnt记录的值等于1000的时候,证明时间已经过去了51ms,于是再去执行流水灯的任务。

我们已经知道工作模式2是不需要在溢出之后再填充初始值的,比如我们定时的时间为51微秒,那么计算出“距离溢出的刻度”就为47(实际计算出的是47.0016,所以定时为51微秒误差就不大)。

所以给TL0赋初值为256-47=209=0xD1。那么TH0也是给初值为0xD1,这是保证每次TL0溢出之后新的初始值是等于TH0的值的,所以定时器工作模式2又叫做8位自动重装载模式。相关概念还需读者再去另外学习这些理论知识。

2.工作模式2的代码#include 

#include //详见第六章第8讲

void main()

{

u8 i;

u16 cnt;

LED_Init();   //初始化LED硬件模块

TMOD = 0x02;  //设置定时器0为工作模式2

TH0  = 0xD1;

TL0  = 0xD1;  //定时51us

TR0  = 1;     //启动定时器0

while(1)

{

if (TF0 == 1)    //每隔51us就可以进入一次这个if语句

{

TF0 = 0;     //定时器0溢出后,清零中断标志

cnt++;       //记录溢出次数

}

if(cnt>=1000)    //时间过去了51ms

{

cnt=0;

P0=~(0x01<

i++;

}

if(i>=8)i=0;

}

}

大家对照上一讲的工作模式1的代码会发现,工作模式2在while循环中不再出现TH0和TL0的身影,TL0每次溢出之后,初值又变为TH0初始时候的值了,所以定时时间在while循环之前就已经决定好了。

大家可以尝试着把“if(cnt>1000)”里的1000改为10000就是间隔510ms的流水灯了。

往后我们做的题目定时时间一般最少都是要定时1毫秒以上,所以用工作模式1的机会会很多,而工作模式2在我们前期教程里会很少运用,等学到串口通信相关知识时我们再重拾这个知识点。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用定时器1中断实现LED1呼吸灯显示,可以按照以下步骤进行: 1. 首先,需要将P1.2口初始化为输出模式,将LED1连接到P1.2口。 2. 然后,需要初始化定时器1,并设置定时器1的模式定时器模式,同时设置定时器的计数器初值和重载值。 3. 接着,在定时器1中断服务函数中,需要实现LED1呼吸灯的控制。可以使用PWM技术实现呼吸灯效果。在每次定时器1中断时,改变占空比,从而改变LED1的亮度。 下面是一份C语言的示例代码,可供参考: ```c #include "reg_cc2530.h" // 定义LED1口 #define LED1 P1_2 // 定义定时器1的初值和重载值 #define T1_INIT_VAL 0xFFFF #define T1_RELOAD_VAL 0xFFFF // 定义PWM的周期和占空比 #define PWM_PERIOD 100 #define PWM_DUTY_CYCLE 50 // 定义占空比的变化步长 #define PWM_STEP 1 // 定义当前占空比和方向 static uint8_t pwm_duty_cycle = 0; static bool pwm_direction = true; // 定义定时器1中断服务函数 #pragma vector=T1_VECTOR __interrupt void t1_isr(void) { // 清除定时器1中断标志 T1IF = 0; // 计算新的占空比 if (pwm_direction) { pwm_duty_cycle += PWM_STEP; if (pwm_duty_cycle >= PWM_DUTY_CYCLE) { pwm_duty_cycle = PWM_DUTY_CYCLE; pwm_direction = false; } } else { pwm_duty_cycle -= PWM_STEP; if (pwm_duty_cycle == 0) { pwm_duty_cycle = 0; pwm_direction = true; } } // 设置LED1的亮度 uint16_t cmp_val = (PWM_PERIOD * pwm_duty_cycle) / 100; T1CC0H = (cmp_val >> 8) & 0xFF; T1CC0L = cmp_val & 0xFF; } // 主函数 int main(void) { // 初始化LED1口为输出 LED1 = 0; P1SEL &= ~0x04; P1DIR |= 0x04; // 初始化定时器1 T1CTL = 0x00; // 关闭定时器1 T1CCTL0 = 0x2C; // 设置定时器1为PWM模式,输出高电平时计数,比较匹配时清零 T1CC0H = 0x00; // 设置比较值高字节 T1CC0L = 0x00; // 设置比较值低字节 T1IE = 1; // 使能定时器1中断 // 设置定时器1的初值和重载值 T1CNTH = T1_INIT_VAL >> 8; T1CNTL = T1_INIT_VAL & 0xFF; T1CC0H = T1_RELOAD_VAL >> 8; T1CC0L = T1_RELOAD_VAL & 0xFF; // 启动定时器1 T1CTL |= 0x0C; // 进入循环 while (1) { // 程序主循环 } return 0; } ``` 在上述代码中,可以通过改变`PWM_PERIOD`和`PWM_DUTY_CYCLE`的值来调整PWM的周期和占空比,从而改变LED1的呼吸灯效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值