新手~关于51单片机的一些疑问~

2019-07-18 12:17发布

如题,新手问题~
问题一:
错误:
#define   MCLK   11059200UL
uint16 tmp = 0;
tmp = MCLK/12/100;


正确:
#define   MCLK   11059200UL
uint32 tmp = 0;
tmp = MCLK/12/100;

如上面两个例子,为什么将tmp定义为int型不行呢?MCLK/12/100的计算值明明没有超过65536呢?




问题二:用定时器0定时1ms,为什么用keil debug显示相邻两次进入中断间隔了整整20ms呢?
#include<reg52.h>
unsigned char T0RH = 0,T0RL = 0;
#define MCLK 11059200UL

void timer0_init(unsigned char ms)
{
        unsigned long tms;
        tms =  ms*MCLK/12/1000;
        tms = 65536 - tms;
        T0RH = (unsigned char)(tms >> 8);
        T0RL = (unsigned char)tms;
        TH0 = T0RH;
        TL0 = T0RL;

        TMOD &= 0xF0;
        TMOD |= 0x01;

        TR0 = 1;
        ET0 = 1;
}

void main()
{
        EA = 1;
    timer0_init(1);
        while(1);
}

void interrupt_timer0()interrupt 1
{
   P0 = 0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
武力戡乱
2019-07-18 20:31
jimmyvivi 发表于 2015-4-30 00:43
问题一:明白
问题二:不是在中断里面设置断点,然后连续按两次全速运行,然后看时间差吗? ...

问题二:

先不管你咋调试中断哈。但是如果一步一步调试那个时间不对!
先看这个函数
void interrupt_timer0()interrupt 1
{
   P0 = 0;
}
定时器0处在TMOD &= 0xF0;TMOD |= 0x01;即模式1吧。
中断里面没有重新赋值吧,也就是说TH0 = TL0 = 255吧,也就是说,程序一直处在不停的激发中断并执行中断中。

一周热门 更多>