找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6510|回复: 10
打印 上一主题 下一主题
收起左侧

怎么每次延时的时间不一样?请您帮看看

[复制链接]
跳转到指定楼层
楼主
ID:25279 发表于 2010-8-15 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P0_1=P0^1;
sbit P0_0=P0^0;
sbit P0_2=P0^2;
sbit P1_4=P1^4;

sbit K1=P3^2;

sbit K2=p3^4;
//sbit K1=P3^6;
//sbit K2=P3^7;
uchar aa,bb;

 

void main()
{
 P1_4=0;

 aa=0;
 bb=0;

 
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;

while(1)
{

if(K1==0)
  {
  
  P1_4=0;
  P0_0=0;
  P0_1=0;
  bb=8;
  }

 if((aa==100)&&(bb==8))
 {
  aa=0;    
  P0_1=1;
  P0_2=0;
  bb=0;
  }


if(K2==0)
  {
  P1_4=0;
  P0_0=1;
  P0_2=1;
  }
 
 }
}
void timer0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 aa++;
 
}


 

以上是程序:

以下是实际烧写的过程:(我的板子是:51hei-5型,stc89c52的单片机,晶振12MHZ)

接通电源——(按键1按下——1、2号灯亮——延时5秒——2号灯灭3号灯亮——按键2按下——1、3号灯灭)括号内循环执行,

当我再一次按按键1执行下一个周期循环的时候,本应延时5秒时间却变乱了(从1秒到12秒都出现过),

但是如果每次在按按键1之前先按一下复位键的话,它就会每一次都是5秒,

按照道理讲是不该出现这种问题的:我考虑到会不会是因为T0即作定时/中断用,又做按键开关用,对定时时间有会不会有影响,故有将两个按键开关更改端口,可是结果是一样的,运行的时候,只要在每个周期结束后不按复位键的话,它仍然不会固定是5秒。

 

      求哪位热心人帮忙指点指点哪能里出问题了?会不会是编译器的问题或者是线路板问题?

十分感谢!

小李致上!


 

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:25609 发表于 2010-8-16 17:30 | 只看该作者
你把中断清零那里改一下。。。
#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char 
sbit P0_1=P0^1; 
sbit P0_0=P0^0; 
sbit P0_2=P0^2; 
sbit P1_4=P1^4; 
sbit K1=P3^2; 
sbit K2=p3^4; 
//sbit K1=P3^6; 
//sbit K2=P3^7; uchar aa,bb; 

void main() 
{ P1_4=0; 
aa=0; 
bb=0; 
TMOD=0x01; 
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256; 
EA=1; 
ET0=1; 
TR0=1; 
while(1) 
{ if(K1==0) 
   {P1_4=0; 
    P0_0=0; 
    P0_1=0; 
    bb=8; } 

if(aa==100) 
  {aa=0; 
  if(bb==8) 
    { P0_1=1;
      P0_2=0;
      bb=0; } 
  } 

if(K2==0)
 { P1_4=0; 
   P0_0=1; 
   P0_2=1; 
 }
 } 
} 

void timer0() interrupt 1 
{ 
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256; 
aa++; 
}
回复

使用道具 举报

板凳
ID:25279 发表于 2010-8-17 08:12 | 只看该作者
谢谢您了噢!我今晚回去试一下,有消息了,我再发到论坛上来一起讨论讨论。。。。。。
回复

使用道具 举报

地板
ID:21628 发表于 2010-8-17 12:48 | 只看该作者

程序写的太糙,不够规矩。

 

我给你个思路。如果是要解决两个开关控制LED的点亮和延时的问题。

 

定时器程序 比如 设计成0.25mS一次的循环。每次激活判断 开关电平是否拉低(即开关按下)。短延时,消颤,再次确认判断。确认,置2个标志位。A 控制 定时器里面 打开 计数。B控制主程序里 开始动作

定时器里 如果A=真,开始每0.25mS计数1次。到达5S后,清标志A,开标志C。

 

在主程序里 死循环等待标志位B 的到来。B到 ,则LED点亮。C到则关闭。 不就实现延时5S了么。而且肯定延时稳定

回复

使用道具 举报

5#
ID:25279 发表于 2010-8-17 22:20 | 只看该作者

我试过了:

if((aa==100)&&(bb==8))
 {
  aa=0;
 if(bb==8)
  {  
     P0_1=1;
    P0_2=0;
     bb=0;
    }
 }

 

烧写的时候,时间还是不能固定为5秒,除非每个周期结束后按一下复位键

回复

使用道具 举报

6#
ID:25279 发表于 2010-8-17 22:24 | 只看该作者

哈:

我是新手噢,感谢您的思路,可是我一时还编不出程序来,如果你有程序,可否上传分享分享?

 

回复

使用道具 举报

7#
ID:25279 发表于 2010-8-18 08:19 | 只看该作者
以下是引用小杜在2010-8-16 17:30:16的发言:
你把中断清零那里改一下。。。
#include<reg52.h>
#define uint unsigned int 
#define uchar unsigned char 
sbit P0_1=P0^1; 
sbit P0_0=P0^0; 
sbit P0_2=P0^2; 
sbit P1_4=P1^4; 
sbit K1=P3^2; 
sbit K2=p3^4; 
//sbit K1=P3^6; 
//sbit K2=P3^7; 
uchar aa,bb; 

void main() 
{ P1_4=0; 
aa=0; 
bb=0; 
TMOD=0x01; 
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256; 
EA=1; 
ET0=1; 
TR0=1; 
while(1) 
{ if(K1==0) 
   {P1_4=0; 
    P0_0=0; 
    P0_1=0; 
    bb=8; } 

if((aa==100)&&(bb==8)) 
  {aa=0; 
  if(bb==8) 
    { P0_1=1;
      P0_2=0;
      bb=0; 
    } 
  } 

if(K2==0)
 { P1_4=0; 
   P0_0=1; 
   P0_2=1; 
 }
 } 
} 

void timer0() interrupt 1 
{ 
TH0=(65536-50000)/256; 
TL0=(65536-50000)%256; 
aa++; 
}
我再写了一遍

回复

使用道具 举报

8#
ID:25279 发表于 2010-8-18 08:22 | 只看该作者

我好像试错了,今天下班后我再回去试下

2010-8-19晚试了,没成功:

if(aa==100)

  {aa=0;
  if(bb==8)
    { P0_1=1;
      P0_2=0;
      bb=0;

    } 
  } 

自己也稍改动了程序,也没成功:

     

if((aa==100))&&(bb==8))

  {aa=0;
  if(bb==8)
    { P0_1=1;
      P0_2=0;
      bb=0;

    } 
  } 
我的邮箱是:	yjxianger@126.com ,欢迎爱好单片机的朋友一起讨、进步
QQ:125991680
此问题已解决,谢谢大家关心

  

[此贴子已经被作者于2010-8-28 22:58:15编辑过]
回复

使用道具 举报

9#
ID:25782 发表于 2010-8-28 23:38 | 只看该作者

还是初学者常遇到的问题

 if((aa==100)&&(bb==8))

这里,aa=100是“点”判断拦截的问题, 一下子就可能跑过去了,变成aa>=101,这样,aa只能继续aa++直到溢出,从头再来,这样时间就会不准确,试着改成“ if((aa>=100)&&(bb==8))”或“ if((aa>=100)&&(bb>=8))”将aa>=100的所有情况拦截。试试看。

回复

使用道具 举报

10#
ID:25279 发表于 2010-8-30 19:44 | 只看该作者
在这地方改是没有效果的,我刚开始也是一直在这个上面动脑筋!
回复

使用道具 举报

11#
ID:25279 发表于 2010-8-30 22:10 | 只看该作者

此程序到现在为止已经历时半个多月了,真心的感谢各位朋友一直的观注,现在一位QQ好友的指导下,经过烧机试验,通过。不敢贪功现将这位高手好友发给我的邮件及程序挂上与大家共同分享,

再次感谢各位同学与老师的关心与帮助!

 
 
 
你的问题解决了没
昨天去看世博会了,就没有上网
你这个问题出在,你没有给a赋初值,你改为下面这样就可以了,
 
  if(K1==0)
  {
  
  P1_4=0;
  P0_0=0;
  P0_1=0;
  bb=8;
 aa=0;

  }
当然这个程序还有些需要改善的地方,比如按键需要防抖动,你可以这样写
if(K1==0)
  {
 //delay(10);写一个延时子程序,这样一般就不会由于一些干扰信号,引起误动作.
if(K1==0)
  {
 
  P1_4=0;
  P0_0=0;
  P0_1=0;
  bb=8;
  }
}
 
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表