STC8H的主频问题
同志们这咋搞,我这35mhz,40mhz定时器延时好像不准呀,定时器的延时直接用的工具,P20口接的led灯,这都不是1s闪烁,慢了好多,哭了,我用24mhz跑就是对的#include <STC8H.H>
void Timer0_Isr(void) interrupt 1
{
static unsigned int T0Count1;
T0Count1++;
if(T0Count1 >= 1000)
{
P20 = !P20;
T0Count1 = 0;
}
}
//定时器0(16位自动重载)
void Timer0_Init(void) //1毫秒@35MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x48; //设置定时初始值
TH0 = 0x77; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main(void)
{
//测试引脚 P20:系统版载LED01P21:系统板载按键SW01
P2M0 &= ~0x03;
P2M1 &= ~0x03;
P_SW2 |= 0x80;
Timer0_Init();
EA=1;
while(1)
{
}
}
使用的什么型号 使用这个选项试试 小飞侠 发表于 2024-5-30 15:01
使用这个选项试试
用的就是STC8H8K64U,我这里是这样设置的 小飞侠 发表于 2024-5-30 15:01
使用这个选项试试
我单独写了个程序去看那个定时器延时准不准,24mhz,35mhz,40mhz,好像就24mhz是1S的延时{:cry:},这啥情况嘞
#include <STC8H.H>
//P20 是LED灯
//void Timer0_Isr(void) interrupt 1
//{
// static unsigned int T0Count1;
// T0Count1++;
// if(T0Count1 >= 1000)
// {
// P20 = !P20;
// T0Count1 = 0;
// }
//}
////定时器0(16位自动重载)
//void Timer0_Init(void) //1毫秒@35MHz
//{
// AUXR |= 0x80; //定时器时钟1T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0x48; //设置定时初始值
// TH0 = 0x77; //设置定时初始值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
//}
void Timer0_Isr(void) interrupt 1
{
static unsigned int T0Count1;
T0Count1++;
if(T0Count1 >= 1000)
{
P20 = !P20;
T0Count1 = 0;
}
}
void Timer0_Init(void) //1毫秒@24.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x40; //设置定时初始值
TH0 = 0xA2; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
//void Timer0_Isr(void) interrupt 1
//{
// static unsigned int T0Count1;
// T0Count1++;
// if(T0Count1 >= 1000)
// {
// P20 = !P20;
// T0Count1 = 0;
// }
//}
//void Timer0_Init(void) //1毫秒@30.000MHz
//{
// AUXR |= 0x80; //定时器时钟1T模式
// TMOD &= 0xF0; //设置定时器模式
// TL0 = 0xD0; //设置定时初始值
// TH0 = 0x8A; //设置定时初始值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
// ET0 = 1; //使能定时器0中断
//}
void main(void)
{
//测试引脚 P20:系统版载LED01P21:系统板载按键SW01
P2M0 &= ~0x03;
P2M1 &= ~0x03;
P_SW2 |= 0x80;
Timer0_Init();
EA=1;
while(1)
{
}
}
你看看我之前的帖子,我也遇到过这种问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7181 我当时的判断就是"动态调节IRC"有问题,我是只有18.432M不正常,其他都正常,我最高试到24M,35M和44M我没有试 小飞侠 发表于 2024-5-30 15:10
我当时的判断就是"动态调节IRC"有问题,我是只有18.432M不正常,其他都正常,我最高试到24M,35M和44M我没 ...
{:cry:}害,我等官方回复吧,看看他们怎么说,我看你那个帖子官方都没有回复你呀 本帖最后由 晓飛飛 于 2024-5-30 16:46 编辑
实测35MHz和40MHz IRC工作频率下都很正常,没有上述问题,下面是代码和测试视频:
144
#include "stc8h.h"
#include "intrins.h"
void Timer0_Isr(void) interrupt 1
{
static unsigned int count;
switch(count++)
{
case 200:
P26 = 0;
break;
case 400:
P27 = 0;
break;
case 600:
P26 = 1;
break;
case 800:
P27 = 1;
break;
case 1000:
count = 0;
break;
default:
break;
}
}
void Timer0_Init(void) //1毫秒@40MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xC0; //设置定时初始值
TH0 = 0x63; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
}
void main()
{
EAXSFR(); //
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
Timer0_Init(); //初始化Timer0并启动中断
EA = 1;
while (1);
}
晓飛飛 发表于 2024-5-30 16:44
实测35MHz和40MHz IRC工作频率下都很正常,没有上述问题,下面是代码和测试视频:
144 ...
你可以试试我的代码不,把输出脚改了就行,反正我单独跑就24mhz是稳的😔,35,40都不对
页:
[1]
2