求助:STC15F104W T0定时器TH0 TL0寄存器无法读取问题
本帖最后由 一岁玩DOTA 于 2024-3-8 14:23 编辑以上代码可以准确的生成1ms 的高电平脉冲。
改成以下就只能产生65ms的脉冲。所以怀疑定时器读取值异常问题。求助。
void Delay1000us() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void main(void)
{
// int j = 0 ;
// int i = 0 ;
unsigned char Tstart = 1;
Ctr_IOInit_P32();
PWM_IN_Init();
high_duty_time = 1;
while(1)
{
Delay1000us();
//while(!P33);
TL0 = 1000; //T1MS
TH0 = 1000 >> 8;
TF0=0; //计数器0溢出标志置0
//TR0 = 1; //定时器0开启
//while(P33);
high_duty_time= TH0<<8+TL0;//取出计数器寄存器中的值,用于计算高电平的时间
TR0 = 0; //定时器0关闭
high_duty_time =65536 - high_duty_time;
TL0 = high_duty_time; //初始化计时值
TH0 = high_duty_time >> 8;
P32 = 1;
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
while(!TF0);
P32 = 0;
TR0 = 0; //定时器0关闭
ET0 = 0;
TF0 = 0;
}
}
sbit led_valid = P3 ^ 2;
void Ctr_IOInit_P32(void)
{
// P3M1&=~0x04;
// P3M0|=0x04;
led_valid = 0;//设置为双向IO
}
void Timer_0_initial()
{
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TMOD |= 0x01; //设置定时器模式
// TL0 = 0; //设置定时初值
// TH0 = 0; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 0; //定时器0关闭
AUXR &= 0x7f; //定时器0为12T模式
TMOD = 0x00; //设置定时器为模式0(16位自动重装载)
TL0 = 0; //初始化计时值
TH0 = 0;
TR0 = 0; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
}
void PWM_PortInit()
{
P3M1|=0x08; //设置P3.3为高阻输入
P3M0&=~0x08;//设置P3.3为高阻输入
//IT1 = 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
// EX1 = 1; //使能INT1中断
//EA = 1;
}
void PWM_IN_Init()
{
Timer_0_initial();
PWM_PortInit();
}
有没有人帮忙解决一下吗。
TH0先存到16位的变量里,在移位,在加上TL0 如果是用定时器做PWM输出的话,可以参考这个例子
乘风飞扬 发表于 2024-3-8 10:53
如果是用定时器做PWM输出的话,可以参考这个例子
是做测量脉宽。目前测不准,用这个方法来检查TH0 TL0 寄存器读取的值。 一岁玩DOTA 发表于 2024-3-8 11:36
是做测量脉宽。目前测不准,用这个方法来检查TH0 TL0 寄存器读取的值。
如果是做输入捕获的东西可以看看PCA 或者PWM 我记得STC15的单片机 是有PCA来做输入捕获的 挺准的 _奶咖君_ 发表于 2024-3-8 11:39
如果是做输入捕获的东西可以看看PCA 或者PWM 我记得STC15的单片机 是有PCA来做输入捕获的 挺准的 ...
目前硬件已经定型和量产了,只能用这个来做了 本帖最后由 一岁玩DOTA 于 2024-3-8 14:24 编辑
电子DIY小家 发表于 2024-3-8 10:51
TH0先存到16位的变量里,在移位,在加上TL0
这样还是不行:
-----------------------------------------------------------------------------------------------------------
high_duty_time = TH0;
high_duty_time = high_duty_time<<8+TL0;//取出计数器寄存器中的值,用于计算高电平的时间
//high_duty_time = 1500;
-----------------------------------------------------------------------------------------------------------
这样就可以:
-----------------------------------------------------------------------------------------------------------
//high_duty_time = TH0;
//high_duty_time = high_duty_time<<8+TL0;//取出计数器寄存器中的值,用于计算高电平的时间
high_duty_time = 1500;
-----------------------------------------------------------------------------------------------------------
页:
[1]