main.c
/*
定时器生成PWM信号的使用
*/
#include <REGX52.H>
#include "Time0Init.h"
//TL0 = 0x66; TH0 = 0xFC; 定时器中断为 1ms 所以pwm的 周期为 pwm_total * 1ms = 10ms
unsigned int Time0_Count = 0; //定时器中断计数
unsigned int pwm_low = 3; // pwm波 低电平 计数次数(定时器中断次数) 单位
// 高电平计数单位 = pwm_total - pwm_low pwm_low = 5的时候 就是50% 占空比
// pwm_low = 8 pwm波低电平占8 高电平占2 就是20% 占空比
unsigned int pwm_total = 10; // pwm 总电平(周期) 计数次数 单位
void main()
{
//定时器初始化
Time0_Init();
while(1){
if(Time0_Count == pwm_low){
P3_2 = 1; //pwm高电平的时间
}
if(Time0_Count == pwm_total){
P3_2 = 0; //pwm低电平的时间
Time0_Count = 0;
}
}
}
void Time0_Routine() interrupt 1
{
Time0_Count++;
//设定初值 保证下次计数从这个初值在当前频率下累加到65535的时间为1ms
TL0 = 0x66;
TH0 = 0xFC;
}
Time0Init.c
#include <REGX52.H>
//定时器0初始化函数 1毫秒@11.0592MHz 定时器时钟12T模式
void Time0_Init()
{
//设定定时器0为16位自动重装方式 (方式1) 1111(前4位设定定时器1工作方式)
// 0000 (后4位设定定时器0工作方式)此寄存器不可以位寻址
//下面两条语句不改变定时器1的工作方式 只改变定时器0的工作方式
TMOD &= 0xF0;//&赋值不会改变高4位的数据 将低四位数据清零
TMOD |= 0x01;//不改变高4位数据 只改变置1的位
//中断溢出标志位 0 不触发中断 硬件置1 触发中断
TF0 = 0;
//开启定时器0
TR0 = 1;
//赋初值 由STC-ISP软件计算获取 定时器模式16位 定时器时钟12T FC66相当于十进制64614 在当前设定的晶振频率下从64614计数到65535 为1ms
TL0 = 0x66; //设定定时初值 中断时间为1ms
TH0 = 0xFC; //设定定时初值 中断时间为1ms
//开启定时器1中断
ET0 = 1;
//开启总中断
EA = 1;
//设置定时器1的中断优先级为低
PT0 = 0;
}
Time0Init.h
#ifndef __Time0Init_H__
#define __Time0Init_H__
void Time0_Init();
#endif