找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7304|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

怎么每次延時的時間不一樣?請您幫看看

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:25279 發(fā)表于 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號燈滅)括號內(nèi)循環(huán)執(zhí)行,

當我再一次按按鍵1執(zhí)行下一個周期循環(huán)的時候,本應(yīng)延時5秒時間卻變亂了(從1秒到12秒都出現(xiàn)過),

但是如果每次在按按鍵1之前先按一下復(fù)位鍵的話,它就會每一次都是5秒,

按照道理講是不該出現(xiàn)這種問題的:我考慮到會不會是因為T0即作定時/中斷用,又做按鍵開關(guān)用,對定時時間有會不會有影響,故有將兩個按鍵開關(guān)更改端口,可是結(jié)果是一樣的,運行的時候,只要在每個周期結(jié)束后不按復(fù)位鍵的話,它仍然不會固定是5秒。

 

      求哪位熱心人幫忙指點指點哪能里出問題了?會不會是編譯器的問題或者是線路板問題?

十分感謝!

小李致上!


 

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:25609 發(fā)表于 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++; 
}
回復(fù)

使用道具 舉報

板凳
ID:25279 發(fā)表于 2010-8-17 08:12 | 只看該作者
謝謝您了噢!我今晚回去試一下,有消息了,我再發(fā)到論壇上來一起討論討論。。。。。。
回復(fù)

使用道具 舉報

地板
ID:21628 發(fā)表于 2010-8-17 12:48 | 只看該作者

程序?qū)懙奶,不夠?guī)矩。

 

我給你個思路。如果是要解決兩個開關(guān)控制LED的點亮和延時的問題。

 

定時器程序 比如 設(shè)計成0.25mS一次的循環(huán)。每次激活判斷 開關(guān)電平是否拉低(即開關(guān)按下)。短延時,消顫,再次確認判斷。確認,置2個標志位。A 控制 定時器里面 打開 計數(shù)。B控制主程序里 開始動作

定時器里 如果A=真,開始每0.25mS計數(shù)1次。到達5S后,清標志A,開標志C。

 

在主程序里 死循環(huán)等待標志位B 的到來。B到 ,則LED點亮。C到則關(guān)閉。 不就實現(xiàn)延時5S了么。而且肯定延時穩(wěn)定

回復(fù)

使用道具 舉報

5#
ID:25279 發(fā)表于 2010-8-17 22:20 | 只看該作者

我試過了:

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

 

燒寫的時候,時間還是不能固定為5秒,除非每個周期結(jié)束后按一下復(fù)位鍵

回復(fù)

使用道具 舉報

6#
ID:25279 發(fā)表于 2010-8-17 22:24 | 只看該作者

哈:

我是新手噢,感謝您的思路,可是我一時還編不出程序來,如果你有程序,可否上傳分享分享?

 

回復(fù)

使用道具 舉報

7#
ID:25279 發(fā)表于 2010-8-18 08:19 | 只看該作者
以下是引用小杜在2010-8-16 17:30:16的發(fā)言:
你把中斷清零那里改一下。。。
#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++; 
}
我再寫了一遍

回復(fù)

使用道具 舉報

8#
ID:25279 發(fā)表于 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
此問題已解決,謝謝大家關(guān)心

  

[此貼子已經(jīng)被作者于2010-8-28 22:58:15編輯過]
回復(fù)

使用道具 舉報

9#
ID:25782 發(fā)表于 2010-8-28 23:38 | 只看該作者

還是初學(xué)者常遇到的問題

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

這里,aa=100是“點”判斷攔截的問題, 一下子就可能跑過去了,變成aa>=101,這樣,aa只能繼續(xù)aa++直到溢出,從頭再來,這樣時間就會不準確,試著改成“ if((aa>=100)&&(bb==8))”或“ if((aa>=100)&&(bb>=8))”將aa>=100的所有情況攔截。試試看。

回復(fù)

使用道具 舉報

10#
ID:25279 發(fā)表于 2010-8-30 19:44 | 只看該作者
在這地方改是沒有效果的,我剛開始也是一直在這個上面動腦筋!
回復(fù)

使用道具 舉報

11#
ID:25279 發(fā)表于 2010-8-30 22:10 | 只看該作者

此程序到現(xiàn)在為止已經(jīng)歷時半個多月了,真心的感謝各位朋友一直的觀注,現(xiàn)在一位QQ好友的指導(dǎo)下,經(jīng)過燒機試驗,通過。不敢貪功現(xiàn)將這位高手好友發(fā)給我的郵件及程序掛上與大家共同分享,

再次感謝各位同學(xué)與老師的關(guān)心與幫助!

 
 
 
你的問題解決了沒
昨天去看世博會了,就沒有上網(wǎng)
你這個問題出在,你沒有給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;
  }
}
 
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表