普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 626|回复: 2

关于定时器的计时问题

[复制链接]

1

主题

2

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2024-1-3 21:37:19 | 显示全部楼层 |阅读模式
本帖最后由 virtuallion 于 2024-1-3 23:40 编辑

开发板芯片是STC89C52,晶振是11.0592的,定时器计时1ms,循环1000次,就对LED控制位取反,理论上应该LED闪烁周期为2s,但是实际上看开发板上的灯是1.1s左右,我数了9次闪烁大概10s,找了半天原因了,找示例程序也是类似的写法,没理解这个时间怎么会差这么多debug用的普中的仿真器,device选的AT89C52,用同一个定时器,换工作方式2,自动重装初值的8位计数方式,串口通讯4800波特率下收发都正常,led翻转也换方式2,周期就是对不上(下面是方式1的代码)
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;


sbit led=P2^0; //D1


void Timer0init()
{
TMOD|=0X01; //工作方式寄存器,选择T0、方式1,16位定时/计数器
TH0=0xfc; //高8位寄存器
TL0=0x66; //低8位寄存器
ET0=1; //T0中断允许位
EA=1; //CPU中断允许位
TR0=1; //T0运行控制位,1开始工作
}


void main()
{
Timer0init();
while(1);
}


void Timer0() interrupt 1
{
static u16 i;
TH0=0xfc;
TL0=0x66;
i++;
if(i==1000)
{
led=~led;
i=0;
}
}

回复

使用道具 举报

1

主题

2

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2024-1-3 23:37:16 | 显示全部楼层
本帖最后由 virtuallion 于 2024-1-3 23:42 编辑

求助,有人能给解释一下原因吗
回复 支持 反对

使用道具 举报

1

主题

2

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2024-1-9 16:27:49 | 显示全部楼层
兄弟你看看我这个怎么回事,我就是想让LED1一闪一亮。系统老是报错,我主页有报错信息。指点下我
#include"reg52.h"
sbit LED1=P2^0;
void delay_10us(u16 ten_us)
{
        while(ten_us--);
}
typedef unsigned int u16;
typedef unsigned char u8;
void main()
{
        while(1)
        {
                LED1=0;
                delay_10us(50000);
                LED1=1;
                delay_10us(50000);
        }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-27 20:25 , Processed in 0.083510 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表