欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫? [打印本頁]

作者: 鬼推磨    時間: 2020-3-11 15:34
標題: 51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?
51單片機LED延時閃爍delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?

LED閃爍實驗 *
實現現象:下載程序后D11指示燈閃爍
注意事項:無
***************************************************************************************/

#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;

sbit led=P0^0; //將單片機的P0.0端口定義為led
sbit led1=p0^1;
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}

/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
while(1)
{
led=0;
delay(50000); //大約延時450ms
led=1;
delay(50000); //大約延時450ms
led1=0;
delay(50000); //大約延時450ms
led1=1;
delay(50000);
}
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以上程序中 delay(50000); 用定時器延時代替delay(50000)延時怎么樣寫?

作者: 鬼推磨    時間: 2020-3-11 15:48




下面是在網上找了點資料。,三次定時中斷調用。
我試了,沒有反應。不知道那錯了了








U8 a =0;//計中斷次數的全局變量

void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
ET0=1; EA=1;
while(1)
{
led=0;
TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0

led=1;

TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0

led1=0;

TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0

led1=1;

TR0=1;
while(a!=9); //9 次中斷450ms
TR0=0; a=0
}
}

中斷程序:
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
a++;
}

作者: 鬼推磨    時間: 2020-3-11 16:55
本帖最后由 鬼推磨 于 2020-3-11 17:57 編輯



成功了,


經過反復測試修改,。終于找到問題。糾正了,。下面是正確的代碼了,
以后寫程序就可以使用定時器來做延時,精準可靠,放棄使用delay延時不準,
特別是新手可以借鑒下面的代碼。為這個問題網上找資料搞了好幾天了,




#include "reg52.h"
#define uchar unsigned char  
typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;
u16 a =0;//計中斷次數的全局變量
sbit led=P2^6;
sbit led1=P2^7;
//晶振頻率是11.0592M,可算出,計數脈沖個數是921個=1ms
//TH0=(65536-921)/256=252=0xFC
//TL0=(65536-921)%256=103=0x67
////////T0定時器///////////////////
void Timer0Init()//晶振頻率是11.0592M
{
//0X00:0 0 方式0 13位計數器
//0X01:0 1 方式1 16位計數器
//0X10:1 0 方式2 自動重裝8位計數器
//0X11:1 1 方式3 T0分為2個8位獨立計數器,T1為無中斷重裝8位計數器

        TMOD|=0X01;// 工作方式1,16位計數器。此處0X01;下面定時1000就是1秒,若設置為0X10下面1000就是0.1秒
        TH0=0XFC;        //給定時器賦初值,定時1ms
        TL0=0x67;        
        ET0=1;//打開定時器0中斷允許
        EA=1;//打開總中斷
        TR0=1;//打開定時器                        
}

void main()
{
Timer0Init();  //定時器0初始化
while(1)
{
led=0;//亮
TR0=1;//打開定時器0
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0; //關閉定時器0
        a=0; //中斷計數清零
led=1;//滅
TR0=1;//打開定時器0
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0; //關閉定時器0
        a=0;//中斷計數清零

led1=0;//亮
TR0=1;//打開定時器
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0; //關閉定時器0
        a=0;//中斷計數清零
led1=1;//滅
TR0=1;//打開定時器0
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0;  //關閉定時器0
        a=0;//中斷計數清零
}
}
//中斷程序:

void Timer0() interrupt 1//晶振頻率是11.0592M
{

        TH0=0XFC;        //給定時器賦初值,定時1ms
        TL0=0x67;
   a++;

}






、、、
//////////////////////////////////////////////////////
新問題來了:吧上面void main()里面代碼換成下面的,
下面代碼只是加了個按鍵IF判斷。
里面定時中斷延時就不執行了,沒有反應了,
這句代碼出問題了while(k!=650); //650ms
不知何故,望大師們幫忙解答。,謝謝


void main()
{

Timer0Init();  //定時器0初始化
a=0;//清零
   while(1)
{  
       
         if(k3==0)
         {
             delay(10);
                 if(k3==0)
                 {
k1=0;
TR0=1;
while(k!=650); //650ms
TR0=0;
k=0;               


k1=1;
TR0=1;
while(k!=350); // 350ms
TR0=0;
k=0;               
k1=0;       
         }
                                                 
                                 }
       


}  



         }





作者: 鬼推磨    時間: 2020-3-11 17:53



新問題又來了:吧上面void main()換成下面的。
加了個按鍵if判斷。里面定時中斷就沒有反應。
不執行while(k!=650); //650ms,不知道是什么問題。
大師們幫忙解答下:


void main()
{

Timer0Init();  //定時器0初始化
a=0;//清零
   while(1)
{  
       
         if(k3==0)
         {
             delay(10);
                 if(k3==0)
                 {
k1=0;
TR0=1;
while(k!=650); //650ms
TR0=0;
k=0;               


k1=1;
TR0=1;
while(k!=350); // 350ms
TR0=0;
k=0;               
k1=0;       
         }
                                                 
                                 }
       


}  



         }


作者: 余生不負    時間: 2020-3-11 17:56
定時器這樣用真的很費勁,為什么不用if判斷
作者: 之一知足    時間: 2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
u16 t;
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
        TH1=0XFF;        //給定時器賦初值,定時0.1ms
        TL1=0X9C;       
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                       
}
void main()
{       
        Timer1Init();//定時器1初始化
        while(1)
        {
                if(t == 5000)//5000*0.1=500ms
                {
                        t==0;
                        led=~led;
                }
        }               
}
void Timer1() interrupt 3
{
        TH1=0XFF;        //給定時器賦初值,定時0.1ms
        TL1=0X9C;
        t++;
}
作者: az12580    時間: 2020-3-11 18:41
可以先不加中斷,只用定時器,從簡單到復雜。先設置定時器TMOD的模式為1,即TMOD=0x01;
作者: zhb2004xp    時間: 2020-3-11 19:01
你這是要LED1,450ms狀態反轉一次嗎?
unsigned char a =0;//計中斷次數的全局變量
void main()
{
        EA=1;
        ET0=1;
        TMOD=0X01;
        TH0=(65536-50000)/256;//定時50ms
        TL0=(65536-50000)%256;
        TR0=1;
        while(1);
}

void timer0(void) interrupt 1
{
        TH0=(65536-50000)/256;//定時50ms
        TL0=(65536-50000)%256;
        a++;
        if(a>=9)
        {
                a=0;
                LED1=~LED1;
        }
}
作者: 余生不負    時間: 2020-3-11 19:08
之一知足 發表于 2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;

這才是定時器真正的使用方法。
作者: 鬼推磨    時間: 2020-3-11 20:18
之一知足 發表于 2020-3-11 18:33
用這個程序,仔細理解定時器怎么用
#include "reg51.h"
typedef unsigned int u16;

led=0;
delay(50000); //大約延時450ms
led=1;
delay(50000); //大約延時450ms
led1=0;
delay(50000); //大約延時450ms
led1=1;
delay(50000);


這個delay(50000); 怎么用你代碼替換調用呢。

N多個子程序需要用到這個延時。

子程序需要用到延時用一句話代碼調用。我還實驗過,
你這個代碼沒有辦法在子程序運行不工作

還有個問題。你這個代碼只能在main()里運行。并且在加一個延時。沒有沒有反應




while(1)
        {
                if(t == 5000)//5000*0.1=500ms
                {
                        t==0;
                        led=~led;
                }


                if(t == 3000)//3000*0.1=300ms 比如另外一個發光管LED1,你這個就沒法運行了,編譯通過,下載開發板沒有反應
                {
                        t==0;
                        led1=~led1;
                }


        }               
}
作者: 鬼推磨    時間: 2020-3-11 22:17



#include<reg51.h>
sbit LED=P2^7;
void delay(unsigned int times)
{
unsigned int i ;
TR0=1;
for(i=0;i<times;i++)
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(TF0==0);
TF0=0;//中斷標志位
}
TR0=0;
}
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(1)
{
delay(50); //延時50毫秒
LED=~LED;
}
}




又找到一個版本,。吧定時器中斷搞延時里,
這樣又變成老方法的delay(50); //延時50毫秒調用了,




我測試了,好像不能長時間調用,短時間2000以內是可以的,
下面10秒就不行。運行起來,沒有10秒就滅了,好像只亮2秒就過了。不知道是什么問題
LED=0;
delay(10000); //延時10秒
LED=1;








歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1