打印

延时程序能调用,延时无效

[复制链接]
4679|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzf6929|  楼主 | 2010-10-15 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看看各位对这个程序有解没,问题是,不能控制延时时间。

功能:实现数码管位上的延时和单向重复流水,且以数字标示是第几位;而中断程序实现循环流水。
#include <reg52.h>
#include <intrins.h>
sbit duan=P3^5;
sbit wei=P3^6;
unsigned char code table1[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
unsigned char code table2[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char a,b,c;
void delay(unsigned char b);
void main()
{
EA=1;
EX0=1;
IT0=1;
while(1)
{   
      for(a=0;a<8;a++)
   {
      duan=1;
      P0=table1[a];
      duan=0;
      duan=0xff;
      wei=1;
      P1=table2[a];
      delay(200);
      P1=0XFF;
      delay(200);
      wei=0;                                   
   }         
}
}
void inte(void) interrupt 0 using 3
{
   P3=0xfe;
    while(1)
    {
     delay(100);
      P3=_crol_(P3,1);
    }
}
void delay(unsigned char b)
{
for(c=110;c>0;c--)
     for(;b>0;b--);
}
改变b的变量,对延时程序无影响。不是延时程序不能调用的问题,而是无法控制延时时间的问题。

相关帖子

沙发
zjswuyunbo| | 2010-10-15 17:27 | 只看该作者
本帖最后由 zjswuyunbo 于 2010-10-15 20:53 编辑

改为:
void delay(unsigned char b)
{
for(;b>0;b--)
     for(c=110;c>0;c--);
}


刚刚自己写错了。。。

使用特权

评论回复
板凳
NE5532| | 2010-10-15 19:38 | 只看该作者
呵呵,楼主确实该检讨,这样学单片机可学不好哈。

使用特权

评论回复
地板
fzu_csc| | 2010-10-15 20:02 | 只看该作者
void delay(unsigned char b)
{
for(c=110;c>0;c--)
     for(;b>0;b--);
}

似乎无错,倒是2楼弄巧成拙改错了。

使用特权

评论回复
5
zjswuyunbo| | 2010-10-15 20:48 | 只看该作者
4# fzu_csc 真没错吗?B只有第一次循环是被负值。

使用特权

评论回复
6
zjswuyunbo| | 2010-10-15 20:55 | 只看该作者
哎,我也改错了

使用特权

评论回复
7
yuanquan12345| | 2010-10-15 21:45 | 只看该作者
void delay(unsigned char b)
{
    uint c;
     for(;b>0;b--)
          for(c=110;c>0;c--);

}

使用特权

评论回复
8
yuanquan12345| | 2010-10-15 21:46 | 只看该作者
前面定义了C,uint c;
可以不用。
这样对吗?

使用特权

评论回复
9
fzu_csc| | 2010-10-15 21:58 | 只看该作者
unsigned char a,b,c;

b去掉应该就可以。

当然,程序还有其它可优化的地方,暂不说了。

使用特权

评论回复
10
hgjinwei| | 2010-10-16 10:18 | 只看该作者
还是先弄懂什么事全局变量,什么是局部变量再说吧。

void delay(unsigned char b)
{
for(c=110;c>0;c--)
     for(;b>0;b--);
}

因为C是全局变量,而且其余地方没有发现修改C值,
所以第一次后,C恒为 0 ,你说丫还能延时。

PS,中断函数中玩 delay(); 楼主开创了中断服务例程的先例,必将掀起新一轮的中断技术革命。

使用特权

评论回复
11
老鱼探戈| | 2010-10-16 11:46 | 只看该作者
还是先弄懂什么事全局变量,什么是局部变量再说吧。

void delay(unsigned char b)
{
for(c=110;c>0;c--)
     for(;b>0;b--);
}

因为C是全局变量,而且其余地方没有发现修改C值,
所以第一次后,C恒为 0 ,你说丫 ...
hgjinwei 发表于 2010-10-16 10:18




开始还真没注意LZ的延时是在中断里!

真是大开眼界啊!

使用特权

评论回复
12
老鱼探戈| | 2010-10-16 11:46 | 只看该作者
:L

使用特权

评论回复
13
zzz1367| | 2010-10-16 12:44 | 只看该作者
本帖最后由 zzz1367 于 2010-10-16 12:45 编辑

2楼这样改,应该能解决LZ的问题了,中断里玩延时的确很危险。

还是先弄懂什么事全局变量,什么是局部变量再说吧。

void delay(unsigned char b)
{
for(c=110;c>0;c--)
     for(;b>0;b--);
}

因为C是全局变量,而且其余地方没有发现修改C值,
所以第一次后,C恒为 0 ,你说丫 ...
hgjinwei 发表于 2010-10-16 10:18


还有,
“因为C是全局变量,而且其余地方没有发现修改C值,
所以第一次后,C恒为 0 ,你说丫 ...”
这句 好像错了吧,C是全局变量没错,“c=110”就修改了C的值了,不是恒为0。

使用特权

评论回复
14
qjmxxgui| | 2010-10-17 23:34 | 只看该作者
2楼这样改,应该能解决LZ的问题了,中断里玩延时的确很危险。



还有,
“因为C是全局变量,而且其余地方没有发现修改C值,
所以第一次后,C恒为 0 ,你说丫 ...”
这句 好像错了吧,C是全局变量没错,“c=110”就 ...
zzz1367 发表于 2010-10-16 12:44


我想请问下,为什么2楼那样改就可以了呢?不是一样的吗?然后中断里面用延时会有什么问题呢?不好意思我刚学。。谢谢各位大虾了

使用特权

评论回复
15
zzz1367| | 2010-10-19 09:42 | 只看该作者
本帖最后由 zzz1367 于 2010-10-19 09:44 编辑

14# qjmxxgui


顺序 不一样的。

b 只在进入函数的时候 赋值 一次。

中断 里 玩 延时:
如果 刚好 在延时的 时候 中断的话…………

使用特权

评论回复
16
fzu_csc| | 2010-10-19 10:38 | 只看该作者
一、全局变量与局部变量:最好采用局部变量,可以释放内存空间
局部变量记得赋初值,不然它的初值是不确定的。
二、中断内延迟:影响中断响应时间,比如定时5ms,中断服务1小时,结果第二次定时中断要1小时又5ms之后。
另外说下,中断内延时产生中断是不可能的,除非产生的是更高优先级中断。
三、前后台调用同一函数:注意函数的可重入
比如加关键字reentrant。当然这里如果硬要中断里也调用delay函数,可另写一个同样的delay函数,采用using,用中断服务一样的寄存器组。

使用特权

评论回复
17
fzu_csc| | 2010-10-19 10:44 | 只看该作者
楼主的问题确实是 b只赋值 一次的问题,其后再次循环的初值都是255了,按语义需重新赋值。

常规写法是2楼再次修订后的写法。

使用特权

评论回复
18
lzf6929|  楼主 | 2010-10-19 20:52 | 只看该作者
第一次延时后c为0,然而,当第二次调用时,c又被从新赋值为110。所以,c虽定义为全局变量,也无关乎延时。 10# hgjinwei

使用特权

评论回复
19
lzf6929|  楼主 | 2010-10-19 20:57 | 只看该作者
谁说的,每次调用都会被重新赋值。 5# zjswuyunbo

使用特权

评论回复
20
lzf6929|  楼主 | 2010-10-19 21:50 | 只看该作者
撤中断延时,可行。

使用特权

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

本版积分规则

0

主题

16

帖子

0

粉丝