51单片机 定时器初值

我写了个脉冲输出程序,改写定时器初值,用proteus仿真的,结果脉冲的周期没变化(示波器显示)是什么原因啊?请教高手,多谢帮帮忙啊!!!
附程序
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char count0 = 20000;// 定时器初值
sbit PWM1=P2^3;//PWM 通道 1
void Timer0_init(void);
void Timer0_int(void) interrupt 1 using 1//定时0中断处理
{
TR0 = 0;
TL0 = ( count0+9) % 256;
TH0 = ( count0+9) / 256 + (char)CY; //强制转换CY(进位标志)的类型为char类型
TR0 = 1;

PWM1=~PWM1;

}
void Timer0_init(void)//定时器0初始化
{
TMOD=0x01;
TH0=count0 / 256;
TL0=count0 % 256;
TR0=1;
ET0=1;
EA=1;
}
void main(void)//主函数
{
Timer0_init();

while(1)
{

}
}
就是直接改写count0的数值,看输出波形变化

也许是你的示波器设置有问题,我按了你的源程序我做了一下,如图片。另外,我觉得你的中断服务程序里的初值不用加9和cY。希望能过帮到你。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-08
在定时器模式下,计数器的计数脉冲来自于晶振脉冲的12分频信号,即对机器周期进行计数。若选择12M晶振,则定时器的计数频率为1MHZ。假设定时时间为T,机器周期为T1,即12/晶振频率。X为定时器初值。则 X=2^n-T/T1。方式0,n=13,方式1时,n=16,方式2和方式3,n=8
第2个回答  2011-01-01
你看看是否类型不对,因为char 最多到255。
将unsigned char count0 = 20000;// 定时器初值
改为unsigned int count0 = 20000;试试
“做而论道”在前,我在此班门弄斧了。本回答被提问者采纳
第3个回答  2011-01-01
void Timer0_init(void)
不要使用与中断函数的同名函数,初始化函数Timer0_init改成Timer0_start
第4个回答  2011-01-07
你换一个晶振就行了!正常的是11.0592
不过你可以换6MHz,12MHz,24MHz.........