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

51定时器问题

hangtao 2019-03-17 浏览量:715
void Timer0(void) interrupt 1
{//定时:50000uS
    TH0 = 0x4C;
    TL0 = 0x00;
    ms++;
    if(ms>19)	//1s
    {
    	ss++;
    	led1=!led1;
    }

晶振是11.0592M 上面这个代码定时1秒 但是led的闪烁频率很高大概200ms左右

请问这是什么问题

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 如果是11.0592M的晶振的话,TH0和TL0的赋值没有问题。进入中断是50ms。但是没有看到你的ms的定义,以及你的ms加到了20之后,有没有清零。如果没有清零,那么后面都会是50ms的频率闪烁。

    如果这里弄清楚了,还是出现问题,可以拿示波器看看波形,看下频率。

    再者可以通过STC的下载程序的软件看看你下载程序时的时钟频率。我有过这样的经历:

    就是明明自己用的11.0592的晶振,但是下载程序后,发现串口波特率对不上,然后后面看那下载器上面显示我的时钟频率竟然少了一倍。变成了5.5左右了,后面重新下载又好了。

    ​​​

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

其他答案 数量:9
  • 根据TH0,TL0计算可知,你这个定时器是0.05s中断一次。通过ms累加20次可以得到约1s的定时,不过你在ms累计到20后,没有对其清零,所以后面ms都会满足大于19的条件,这样LED的闪烁周期也就成了0.05s了,直到ms溢出发生变化,就这样周而复始。
    • 发布于2019-03-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 变量ms在判断中需要清零,还有建议使用12MHz的晶振,这样定时器1us计一个数,更加准确,还方便计算
    • 发布于2019-03-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 50ms进中断,20次就是100ms,那么一次高一次低,所以一个周期就是200ms
    • 发布于2019-03-17
    • 举报
    • 评论 1
    • 0
    • 0
大棒棒猪 回复了 yhj416606438 :你这个计算是体育老师教的吗?50*20=100? 回复

  • 你在ms达到要求后没有重置,则后面就50ms转换一次啦。相当于100ms一个周期亮、灭啦。
    • 发布于2019-03-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 那个ms参数在哪里定义的,是否有及时清0
    • 发布于2019-03-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这里的定时时间设置的不对的,要再大10倍才可以的
    • 发布于2019-03-17
    • 举报
    • 评论 0
    • 0
    • 0

  • ms计数结束没有清零,另外条件语句中的ss++ 是个什么鬼,突然冒出这个变量,应该是ms = 0;就对了。

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

  • 定时设置1秒,但是200毫秒就翻转一次,说明翻转比你预想的要快,第一排查ms计数的清零情况,第二排查系统使用的晶振频率。

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

  • 你的ms变量在大于19后,要清为0的,要重新进行++运算的,你没有清0
    • 发布于2019-03-18
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

51定时器问题