WCH沁恒单片机
直播中

肖耳朵

12年用户 557经验值
私信 关注
[问答]

如何实现用CH552定时器0,配置成8位自动重装载模式?

我想用CH552定时器0,配置成8位自动重装载模式,100us产生一次中断,然后1s切换LED状态,但是设置完LED是4s才切换状态,不知道是哪里配置错了呢?


代码:
sbit LED = P3^4;

void main(void)
{
//设置时钟
SAFE_MOD = 0x55; //进入安全模式
SAFE_MOD = 0xAA;

CLOCK_CFG &= ~bOSC_EN_XT; //关闭外部晶振
CLOCK_CFG |= bOSC_EN_INT; //使能内部晶振
CLOCK_CFG = CLOCK_CFG & (~MASK_SYS_CK_SEL) | 0x06; //24M

SAFE_MOD = 0x00;//退出安全模式

//LED配置
//LED -- P3.4 -- 推挽输出
P3 &= ~(1 << 0x04);
P3_DIR_PU |= (1 << 0x04);
P3 |= (1 << 0x04);//关闭LED

//定时器0初始化
T2MOD &= ~bT1_CLK; //系统时钟12分频
TMOD = TMOD & 0xF0 | bT0_M1; //模式2
TL0 = 0x38; //赋初值 100us
TH0 = 0x38;
ET0 = 1;
TR0 = 1;

EA = 1;
while(1);
}

//定时器中断
void time0Interrupt(void) interrupt INT_NO_TMR0 using 1
{
static uint16_t cnt = 0;

cnt++;
if(cnt >= 10000)
{
cnt = 0;
LED ^= 1;
}
}  之后我用串口线接到LED引脚,引脚每次从高电平到低电平跳变时,串口会收到0x00
前后收到0x00的时间基本都是8s,也就是LED闪烁的时间间隔为4s,TH0和TL0的初值手算和工具算出来都是这个值。



  

回帖(4)

万菲

2022-6-8 16:02:04
刚用这款单片机,定时器是按照手册和CH554例程来设置的
举报

程娇

2022-6-8 16:02:08
主频24m,定时器时钟12分频即2m,那么一个指令执行时间即1/2m,也就是0.5us。如果要设置100us的定时时间需要设置初值为200。
举报

石径

2022-6-8 16:02:13
定时器不是往上加到全为1变成0就是溢出吗,所以计数200次,200*0.5 = 100,所以初值应该是256 - 200=56吧
举报

李维洲

2022-6-8 16:02:17
已解决   T2MOD &= ~bT1_CLK; //系统时钟12分频
这个配置成定时器1去了,然后修改时钟后加了延时等待稳定
举报

更多回帖

发帖
×
20
完善资料,
赚取积分