PIC16F877 定时器0实现频率为60HZpwm
时间: 2024-10-14 12:02:32 浏览: 28
使用PIC16F877单片机实现计算器仿真设计 包含源程序及仿真文件#资源达人分享计划#
5星 · 资源好评率100%
PIC16F877单片机是一款8位微控制器,它内置了多种定时器和计数器资源。要实现60Hz的PWM(脉宽调制),我们可以利用Timer0作为基本的定时器来生成周期性的占空比变化。
以下是基本步骤:
1. **初始化Timer0**:
- 首先,需要将TMR0(Timer 0 Register)清零,并设置工作模式。对于16F877,通常选择模式1,即13位定时器,以便产生较高的分辨率。使用`TRISBbits.TRB0 = 0;`关闭PB0引脚作为PWM输出,然后配置T0CON寄存器:`T0CON = _BV(T0CS) | _BV(T08BIT);`,设置外部时钟源(如晶振)并启用8位计数。
2. **设置周期**:
- 对于60Hz PWM,我们需要确定一个合适的定时值使得T0溢出大约60次每秒。60Hz意味着1秒有60个周期,如果采用50Hz作为参考,那么周期应该是1000ms / 50 ≈ 20毫秒。由于我们是13位计数,所以要找到一个能整除2^13的数接近这个值。
3. **设置初值计算**:
- 计算Timer0初始值,使其在溢出前达到预定的时间。例如,如果我们选择的内部时钟频率是4MHz,则1μs等于CPU时钟周期的1/4M,因此20ms约等于20 * 1000 * 4(us)。然后取该值对2^13取模,因为TMR0最高13位有效。
4. **定时器中断服务程序**:
- 当Timer0溢出时,会触发中断。在ISR(Interrupt Service Routine)中,你需要处理PWM的占空比更新。可以将当前TMR0的值与最大值(2^13 - 1)做比较,然后控制PB0的高电平时间。
```c
void Timer0_OVF ISR(void) {
TMR0L = (unsigned char)(TMR0H << 8) | TMR0L;
if (TMR0L > PWM_MAX_VALUE) { // 如果超过最大值,说明溢出了
// 更新占空比并反转状态
PWM_PIN = !PWM_PIN;
// 更新下一个周期的占空比
TMR0H = (PWM_MAX_VALUE >> 8);
TMR0L = PWM_MAX_VALUE & 0xFF;
}
}
```
记得在主程序中开启Timer0的中断:`INTCONbits.T0IE = 1;` 并安装ISR:`pragma interrupt Timer0_OVF Interrupt`。
阅读全文