f=50hz T=0.02s=20000us 每过10000us翻转一次
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit pwm=P0^0; //定义输出pwm口
/*******************************************************************************
定时器0初始化
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//配置tmod寄存器为定时器0方式1
TH0=(65536-10000)/256; //因为方式1是16位定时器 所以用(65536-10000)us取高8位
TL0=(65536-10000)%256;//同上取低八位
ET0=1;//使能定时器0中断
EA=1;//使能总中断
TR0=1;//开启定时器
}
void main()
{
Timer0Init(); //定时器初始化配置
while(1);//等待中断
}
void Timer0() interrupt 1
{
TH0=(65536-10000)/256; //重装计数值
TL0=(65536-10000)%256;
pwm=~pwm;//每进入一次中断就翻转一次
}
追问有工作方式2的吗
追答TMOD|=0X02;//配置tmod寄存器为定时器0方式1
TH0=256-1 ;//因为方式2是8位定时器 所以用256-1us
TL0=256-1;//计时时只有tl0在计时,然后tl0溢出时重新装在th0的值
//上面这段话代替timerinit里边的这三句 这样定时是1us
然后interrupt里边这样写
{
static u16 i=0;
i++;
if(i==10000)
{
pwm=~pwm;
i=0;
}
}
//加数那个逻辑我没仔细想 你自己好好看看 但基本定时时间没问题
方式二的话你只需要把tmod重新配置以及初值装载正确就行呀 上课要认真听啊
方式二是八位定时器,因为不能直接定时那么多,所以得在中断中累加得值。
如果你觉得这样也很麻烦的话,可以参考stc里边有自动配置,如果还是有问题私我。