久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7245|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲永久精品国产 | 最新中文字幕一区 | 久久久久久综合 | 国产免费一区二区三区 | 激情一区 | 久久综合成人精品亚洲另类欧美 | 91精品国产欧美一区二区 | 精品在线一区二区三区 | 成人在线播放网址 | 久久国产99 | 免费大黄视频 | 欧美黑人狂野猛交老妇 | 粉嫩av在线 | 欧美一区在线视频 | 一级黄色片毛片 | 91成人在线视频 | 久久99精品久久久 | www.色婷婷 | 999久久久免费精品国产 | 国产精品久久免费观看 | 久久久精品影院 | 九九九久久国产免费 | 超碰男人天堂 | 欧美99久久精品乱码影视 | 黄色在线免费观看 | 中文字幕福利视频 | 日韩一区二区三区在线看 | 欧美a视频| 91国在线 | 国产精品一区二区欧美黑人喷潮水 | 日本三级精品 | 久久香焦 | 国产精品久久国产精品 | av成人在线观看 | 国产精品片aa在线观看 | 国产精品明星裸体写真集 | 凹凸日日摸日日碰夜夜 | 福利视频一区 | 国产一区亚洲 | 日本成人在线网址 | 天天干天天想 |