• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

不到50行代码的51单片机的定时器0溢出速度有问题,大神求解

31ae57b916008ed8 2019-02-27 浏览量:729

//晶振是11.0592Mhz 
#include <reg52.h>

#define s8 signed char
#define u8 unsigned char
#define u16  unsigned int


sbit D1 = P0^0;//位定义LED0


u8 tmr0_value = 1000;//定时器0的初值

void init_tmr0(void); 


int main(void)

{
 init_tmr0();//初始化定时器0
 
 while (1);
 
 return 0;
}

void init_tmr0(void)
{
 TMOD = 0x01;//设置tmr0为工作方式1
 EA = 1;//开总中断
 ET0 = 1;//开定时器0中断
 TH1 = (65536 - tmr0_value) / 16;//得到高8位
 TH0 = (65536 - tmr0_value) % 16;//得到低8位
 TR0 = 1;//启动定时器0

 return;
}

//注:定时器溢出后若没重装初值就重新从0开始计数(0—65535)
//计数到65536就溢出!
void tmr0(void) interrupt 1//定时器0中断
{    
    TR0 = 0;//关闭定时器0
 //重新给定时器0赋初值
 TH1 = (65536 - tmr0_value) / 16;
 TH0 = (65536 - tmr0_value) % 16;
    
    D1 = !D1;//D1的闪烁速度和tmr0_value的值不匹配
 
    TR0 = 1;//启动定时器0
 
    return;
}
        现象:人眼可以明显地看见D1的闪烁!
        困惑:大家看红色代码tmr0_value = 1000,说明定时器0是大约1ms中断一次,对吧?
那么即D1的亮灭状态是1ms变化一次,以这个速度人眼肯定不能看到灯的闪烁的,但我的灯的闪烁状态就很明显。
这是为什么呢?大神解释,小弟很痛苦!!!

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • u8的范围是0-255,不能赋值为1000,不过你这里编译器不会报错或者警告的吗
    • 发布于 2019-02-27
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  • 把两个TH0改成TL0就可以了然后把两个TH1改动TH0写代码要仔细一点
    • 发布于2019-02-27
    • 举报
    • 评论 1
    • 0
    • 0
yhj416606438 回复了 yhj416606438 :还有把4个16改成0xff或者255都行 回复

  • 还是写错了,注意放数据要到一个寄存器,高低要对齐!
    • 发布于2019-02-27
    • 举报
    • 评论 0
    • 0
    • 0

  • 变量类型错了。U8类型只能最大255。你的定时器初值设置1000就超出了寄存器最大表示范围。
    • 发布于2019-02-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个是变量定义的类型不对,要把u8改成short或者int。

    • 发布于2019-02-28
    • 举报
    • 评论 0
    • 0
    • 0

  • TH1 = (65536 - tmr0_value) / 16;//得到高8位

    TH0 = (65536 - tmr0_value) % 16;//得到低8位

    这一句都是高位了,写法错误要改成TH0、TL0

    tmr0_value的类型不要用char型,用int​

    • 发布于2019-02-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以先看看你的外部的晶振是多大的

    再把变量改成int型的

    • 发布于2019-03-16
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

不到50行代码的51单片机的定时器0溢出速度有问题,大神求解