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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8952|回復(fù): 10
收起左側(cè)

51單片機(jī)LED延時(shí)閃爍delay(50000); 用定時(shí)器延時(shí)代替delay(50000)延時(shí)怎么樣寫(xiě)?

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 1 黑幣 回復(fù)本帖可獲得 1 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
ID:475031 發(fā)表于 2020-3-11 15:34 | 顯示全部樓層 |閱讀模式
51單片機(jī)LED延時(shí)閃爍delay(50000); 用定時(shí)器延時(shí)代替delay(50000)延時(shí)怎么樣寫(xiě)?

LED閃爍實(shí)驗(yàn) *
實(shí)現(xiàn)現(xiàn)象:下載程序后D11指示燈閃爍
注意事項(xiàng):無(wú)
***************************************************************************************/

#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16; //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
typedef unsigned char u8;

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

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

使用道具 舉報(bào)

ID:475031 發(fā)表于 2020-3-11 15:48 | 顯示全部樓層




下面是在網(wǎng)上找了點(diǎn)資料。,三次定時(shí)中斷調(diào)用。
我試了,沒(méi)有反應(yīng)。不知道那錯(cuò)了了








U8 a =0;//計(jì)中斷次數(shù)的全局變量

void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;//定時(shí)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;//定時(shí)50ms
TL0=(65536-50000)%256;
a++;
}
回復(fù)

使用道具 舉報(bào)

ID:475031 發(fā)表于 2020-3-11 16:55 | 顯示全部樓層
本帖最后由 鬼推磨 于 2020-3-11 17:57 編輯



成功了,


經(jīng)過(guò)反復(fù)測(cè)試修改,。終于找到問(wèn)題。糾正了,。下面是正確的代碼了,
以后寫(xiě)程序就可以使用定時(shí)器來(lái)做延時(shí),精準(zhǔn)可靠,放棄使用delay延時(shí)不準(zhǔn),
特別是新手可以借鑒下面的代碼。為這個(gè)問(wèn)題網(wǎng)上找資料搞了好幾天了,




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

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

void main()
{
Timer0Init();  //定時(shí)器0初始化
while(1)
{
led=0;//亮
TR0=1;//打開(kāi)定時(shí)器0
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0; //關(guān)閉定時(shí)器0
        a=0; //中斷計(jì)數(shù)清零
led=1;//滅
TR0=1;//打開(kāi)定時(shí)器0
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0; //關(guān)閉定時(shí)器0
        a=0;//中斷計(jì)數(shù)清零

led1=0;//亮
TR0=1;//打開(kāi)定時(shí)器
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0; //關(guān)閉定時(shí)器0
        a=0;//中斷計(jì)數(shù)清零
led1=1;//滅
TR0=1;//打開(kāi)定時(shí)器0
while(a!=1000); //1000 次中斷是1000ms=1s
TR0=0;  //關(guān)閉定時(shí)器0
        a=0;//中斷計(jì)數(shù)清零
}
}
//中斷程序:

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

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

}






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


void main()
{

Timer0Init();  //定時(shí)器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;       
         }
                                                 
                                 }
       


}  



         }




回復(fù)

使用道具 舉報(bào)

ID:475031 發(fā)表于 2020-3-11 17:53 | 顯示全部樓層



新問(wèn)題又來(lái)了:吧上面void main()換成下面的。
加了個(gè)按鍵if判斷。里面定時(shí)中斷就沒(méi)有反應(yīng)。
不執(zhí)行while(k!=650); //650ms,不知道是什么問(wèn)題。
大師們幫忙解答下:


void main()
{

Timer0Init();  //定時(shí)器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;       
         }
                                                 
                                 }
       


}  



         }

回復(fù)

使用道具 舉報(bào)

ID:316880 發(fā)表于 2020-3-11 17:56 | 顯示全部樓層
定時(shí)器這樣用真的很費(fèi)勁,為什么不用if判斷
回復(fù)

使用道具 舉報(bào)

ID:342451 發(fā)表于 2020-3-11 18:33 | 顯示全部樓層
用這個(gè)程序,仔細(xì)理解定時(shí)器怎么用
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
u16 t;
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開(kāi)啟動(dòng)。
        TH1=0XFF;        //給定時(shí)器賦初值,定時(shí)0.1ms
        TL1=0X9C;       
        ET1=1;//打開(kāi)定時(shí)器1中斷允許
        EA=1;//打開(kāi)總中斷
        TR1=1;//打開(kāi)定時(shí)器                       
}
void main()
{       
        Timer1Init();//定時(shí)器1初始化
        while(1)
        {
                if(t == 5000)//5000*0.1=500ms
                {
                        t==0;
                        led=~led;
                }
        }               
}
void Timer1() interrupt 3
{
        TH1=0XFF;        //給定時(shí)器賦初值,定時(shí)0.1ms
        TL1=0X9C;
        t++;
}
回復(fù)

使用道具 舉報(bào)

ID:685726 發(fā)表于 2020-3-11 18:41 | 顯示全部樓層
可以先不加中斷,只用定時(shí)器,從簡(jiǎn)單到復(fù)雜。先設(shè)置定時(shí)器TMOD的模式為1,即TMOD=0x01;
回復(fù)

使用道具 舉報(bào)

ID:234075 發(fā)表于 2020-3-11 19:01 | 顯示全部樓層
你這是要LED1,450ms狀態(tài)反轉(zhuǎn)一次嗎?
unsigned char a =0;//計(jì)中斷次數(shù)的全局變量
void main()
{
        EA=1;
        ET0=1;
        TMOD=0X01;
        TH0=(65536-50000)/256;//定時(shí)50ms
        TL0=(65536-50000)%256;
        TR0=1;
        while(1);
}

void timer0(void) interrupt 1
{
        TH0=(65536-50000)/256;//定時(shí)50ms
        TL0=(65536-50000)%256;
        a++;
        if(a>=9)
        {
                a=0;
                LED1=~LED1;
        }
}
回復(fù)

使用道具 舉報(bào)

ID:316880 發(fā)表于 2020-3-11 19:08 | 顯示全部樓層
之一知足 發(fā)表于 2020-3-11 18:33
用這個(gè)程序,仔細(xì)理解定時(shí)器怎么用
#include "reg51.h"
typedef unsigned int u16;

這才是定時(shí)器真正的使用方法。
回復(fù)

使用道具 舉報(bào)

ID:475031 發(fā)表于 2020-3-11 20:18 | 顯示全部樓層
之一知足 發(fā)表于 2020-3-11 18:33
用這個(gè)程序,仔細(xì)理解定時(shí)器怎么用
#include "reg51.h"
typedef unsigned int u16;

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


這個(gè)delay(50000); 怎么用你代碼替換調(diào)用呢。

N多個(gè)子程序需要用到這個(gè)延時(shí)。

子程序需要用到延時(shí)用一句話代碼調(diào)用。我還實(shí)驗(yàn)過(guò),
你這個(gè)代碼沒(méi)有辦法在子程序運(yùn)行不工作

還有個(gè)問(wèn)題。你這個(gè)代碼只能在main()里運(yùn)行。并且在加一個(gè)延時(shí)。沒(méi)有沒(méi)有反應(yīng)




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


                if(t == 3000)//3000*0.1=300ms 比如另外一個(gè)發(fā)光管LED1,你這個(gè)就沒(méi)法運(yùn)行了,編譯通過(guò),下載開(kāi)發(fā)板沒(méi)有反應(yīng)
                {
                        t==0;
                        led1=~led1;
                }


        }               
}
回復(fù)

使用道具 舉報(bào)

ID:475031 發(fā)表于 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;//中斷標(biāo)志位
}
TR0=0;
}
void main()
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(1)
{
delay(50); //延時(shí)50毫秒
LED=~LED;
}
}




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




我測(cè)試了,好像不能長(zhǎng)時(shí)間調(diào)用,短時(shí)間2000以內(nèi)是可以的,
下面10秒就不行。運(yùn)行起來(lái),沒(méi)有10秒就滅了,好像只亮2秒就過(guò)了。不知道是什么問(wèn)題
LED=0;
delay(10000); //延時(shí)10秒
LED=1;



回復(fù)

使用道具 舉報(bào)

12#
無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

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

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