0 单片机C语言请教! - 第2页 - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印

单片机C语言请教!

[复制链接]
楼主: space005
手机看帖
扫描二维码
随时随地手机跟帖
21
john_light| | 2008-10-6 09:52 | 只看该作者 回帖奖励 |倒序浏览

和飞读是一个道理吧

顺便翻页占领广告位

使用特权

评论回复
22
merryme| | 2008-10-6 15:00 | 只看该作者

大家好,

是编译器的原因吗,

使用特权

评论回复
23
ayb_ice| | 2008-10-6 17:44 | 只看该作者

这就是飞读的问题

要关中断再判断,或者飞读后再判断...

使用特权

评论回复
24
hotpower| | 2008-10-6 18:07 | 只看该作者

17楼说明了为什么有很多人喜欢在中断中干事~~~

主程序只有sjmp $即while(1);

使用特权

评论回复
25
xinzha| | 2008-10-7 01:06 | 只看该作者

ll

如果编译器能稍微优化一下,先判断高位,再判断低位,也就没这么多麻烦事了。

使用特权

评论回复
26
smartpower| | 2008-10-7 09:27 | 只看该作者

还有这样的一个方法可以,不用在中断中办事

#include <AT89X51.H>

unsigned int  TD3=0;

void t0(void) interrupt 1 using 3 
{
    TH0=(65536-50000)/256; 
    TL0=(65536-50000)%256;
    TD3++;
}

void main()
{
    unsigned int buf;  //////////增加的变量
    
    TMOD=0x11; 
    TH0=(65536-50000)/256; 
    TL0=(65536-50000)%256; 
    ET0=1;  
    EA=1; 
    TR0=1;
    
    buf = 0x00;
    
    while(buf < 18000)   //////更改的部分
    {
        do
        {
            buf = TD3;
            
        }while(buf != TD3);
    }  
    
    TD3=0;
}

使用特权

评论回复
27
ayb_ice| | 2008-10-7 11:58 | 只看该作者

居然有人说是编译器的问题?

使用特权

评论回复
28
冷漠| | 2008-10-7 22:46 | 只看该作者

编译器没任何问题。

unsigned int  TD3=18000;//定洒水时间间隔为30min  
bit timeout=0;

void t0(void) interrupt 1 using 3 
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256; //定义100mS中断时间常数(6M晶振)

 timeout=1;
}

void main()
{//1
TMOD=0x11; //定义T0定时器工作为方式1
TH0=(65536-50000)/256; //定义100mS中断时间常数
TL0=(65536-50000)%256; 
ET0=1;  
EA=1; 
TR0=1;

while(1){
while(!timeout);
timeout=0;
if(!(--TD3))break;

TR0=0;
EA=0;
while(1);
}//1

使用特权

评论回复
29
冷漠| | 2008-10-7 22:52 | 只看该作者

书上的例子(模型)。

#include <AT89X51.H>

unsigned int  TD3=18000;//定洒水时间间隔为30min  
bit timeout=0;

void t0(void) interrupt 1 using 3 
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256; //定义100mS中断时间常数(6M晶振)

if(!(--TD3)) timeout=1;
}

void main()
{//1
TMOD=0x11; //定义T0定时器工作为方式1
TH0=(65536-50000)/256; //定义100mS中断时间常数
TL0=(65536-50000)%256; 
ET0=1;  
EA=1; 
TR0=1;

while(!timeout);
timeout=0;
 
TR0=0;
EA=0;
while(1);
}//1

使用特权

评论回复
30
johnwjl| | 2008-10-8 11:01 | 只看该作者

遇到问题不要先怀疑编译器,而是先怀疑自己!

使用特权

评论回复
31
gezhi| | 2008-10-8 11:46 | 只看该作者

这是应该是定时器和C语言的特殊关系吧

可以在定时中断里加一个8位的标志,当进入中断时置位标志。在主程序里检测这个标志,当标志被置位后才开始判断while(TD3<=18000)等操作。
这样可以充分利用定时中断出来后,等再进入中断这段时间内,对TD3的值进行判断,这样定时会比较准确吧。

使用特权

评论回复
32
tongjimcu| | 2008-10-8 12:51 | 只看该作者

good

xue xi le

使用特权

评论回复
33
space005|  楼主 | 2008-10-9 19:55 | 只看该作者

看了反汇编后的跟踪程序的确如此!学习了!

使用特权

评论回复
34
救火车| | 2008-10-10 20:24 | 只看该作者

说来说去就是那个问题

看看《一个容易忽略的错误》吧。

使用特权

评论回复
35
hgjinwei| | 2008-10-10 22:42 | 只看该作者

void

在中断设定中断标志,然后主程序计数就不会出现这样的问题了.

使用特权

评论回复
36
l0p0c| | 2008-10-11 09:00 | 只看该作者

真是太厉害了!敬佩……

使用特权

评论回复
37
mcu5i51| | 2008-10-11 21:38 | 只看该作者

汇编也有考虑不到的地方,所以有了臭虫

使用特权

评论回复
38
inter_zhou| | 2008-10-12 23:12 | 只看该作者

有点意思

使用特权

评论回复
39
soso| | 2008-10-13 17:01 | 只看该作者

RE:

汇编是基础。

使用特权

评论回复
40
hartcomm| | 2008-10-13 17:49 | 只看该作者

不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则