新手~关于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条回答
武力戡乱
1楼-- · 2019-07-18 14:14
第一、UL为长整型
MCLK/12/100也是长整型
uint16 tmp = 0;
tmp = (uint16)(MCLK/12/100);

第二 、用定时器0定时1ms,为什么用keil debug显示相邻两次进入中断间隔了整整20ms呢。你按错键了。
jimmyvivi
2楼-- · 2019-07-18 20:00
 精彩回答 2  元偷偷看……
武力戡乱
3楼-- · 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吧,也就是说,程序一直处在不停的激发中断并执行中断中。
jimmyvivi
4楼-- · 2019-07-19 00:25
武力戡乱 发表于 2015-4-30 00:51
问题二:

先不管你咋调试中断哈。但是如果一步一步调试那个时间不对!

问题找到了,是因为keil里面的晶振频率没设好,不过还是谢谢版主的热心帮助。

一周热门 更多>