找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)能不能利用定時器做一個不規(guī)則的LED閃爍?

[復(fù)制鏈接]
ID:874595 發(fā)表于 2021-1-7 13:46 | 顯示全部樓層 |閱讀模式
比如不是要那種1秒閃一秒滅那種,而是那種0.4秒亮。1.6秒滅那種.自己找了些程序想做參考,但基本都是那種比較固定的亮滅正好相反的那種。并且在Protest動態(tài)幀運(yùn)的時間計(jì)時是不是剛開始有個延遲?我現(xiàn)在在想的時兩個計(jì)時一個負(fù)責(zé)滅一個負(fù)責(zé)亮

單片機(jī)源程序如下:
#include<reg52.h>
sbit led=P1^0; //聲明一個用于測試的led燈
unsigned char one;
unsigned char two;
void main()
{
TMOD=0x01; //聲明定時器的工作方式M1=0,M0=1
                                         //裝入初始值,即計(jì)滿所裝的數(shù)時,就會溢出
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
EA=1;  //開啟全局中斷允許
ET0=1; //開啟定時器0中斷允許
TR0=1; //開啟定時器0
while(1); //讓程序一直循環(huán)下去,中斷也不斷產(chǎn)生

}
                        //中斷函數(shù)
  void  T_Time() interrupt 2
  {
        TH0=(65536-45872)/256;                                //重裝初值
        TL0=(65536-45872)/256;
        one++;
                                two++;               
        if(one==4)                 //當(dāng)number=20時,即為1s
         {
          one=0;                                          //把number置0,重新計(jì)數(shù)
          led=1;                         //使led燈每隔1s亮一次
         }
                                else(two==16);
                                 {
                                        two=0;
                                        led=0;
                                 }
  }
回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-1-7 15:32 | 顯示全部樓層
WHILE(1)
{
LED = 1;
DELAY 0.4S;
LED = 0;
DELAY 1.6S;
}

不行?
回復(fù)

使用道具 舉報(bào)

ID:752974 發(fā)表于 2021-1-7 15:38 | 顯示全部樓層
用一個定時器即可,設(shè)定時時間10ms。計(jì)時開始LED亮,計(jì)到40關(guān)燈,計(jì)到160,計(jì)數(shù)清零,重新計(jì)數(shù),LED亮,。。。如此。
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 15:49 | 顯示全部樓層

這樣是不是就不去利用中斷計(jì)時器去計(jì)時嗎?
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 15:50 | 顯示全部樓層
munuc_w 發(fā)表于 2021-1-7 15:38
用一個定時器即可,設(shè)定時時間10ms。計(jì)時開始LED亮,計(jì)到40關(guān)燈,計(jì)到160,計(jì)數(shù)清零,重新計(jì)數(shù),LED亮,。 ...

我也是這么想的,但我沒搞懂后面應(yīng)該是怎么些,倒是能看的懂一些常見亮1秒滅一秒的案例代碼,但自己搞不懂怎么修改成我想要的那種計(jì)時效果
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:00 | 顯示全部樓層
能否問下后續(xù)應(yīng)該怎么修改,因?yàn)檫@一段一直沒搞懂,只知道個大概,找了幾個示例程序修改也一直沒搞出想要的效果,編譯也能過,但編譯出來的HEX文件沒有那種效果
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:01 | 顯示全部樓層
C:\Users\Mr.Z\Pictures\Screenshots這是protest的仿真圖
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:05 | 顯示全部樓層
這是Proteus的仿真設(shè)計(jì)圖,用的AT89C51,想修改成利用中斷計(jì)時器去進(jìn)行LED燈亮2滅1那種的自由設(shè)定的參數(shù),求解后續(xù)該怎么修改。
屏幕截圖(6).png
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:10 | 顯示全部樓層
仿真電路圖
屏幕截圖(6).png
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-1-7 16:16 | 顯示全部樓層
用定時器作LED不對稱閃爍當(dāng)然沒有問題,樓主T0中斷號錯了!改這樣就能實(shí)現(xiàn)樓主目的。

void  T_Time() interrupt 1
{
        TH0=(65536-45872)/256;//重裝初值
        TL0=(65536-45872)/256;
        one++;            
        if(one>=40)//2s周期
                one=0;

        if(one<=8)
                led=0;//亮0.4s
        else led=1;//熄1.6s
}
回復(fù)

使用道具 舉報(bào)

ID:831068 發(fā)表于 2021-1-7 16:16 | 顯示全部樓層
迷鹿的夏夜 發(fā)表于 2021-1-7 16:00
能否問下后續(xù)應(yīng)該怎么修改,因?yàn)檫@一段一直沒搞懂,只知道個大概,找了幾個示例程序修改也一直沒搞出想要的 ...

        one++;                           
        if(one<=4)            
         {        
          led=1;                         //led燈亮
         }
         else if(one<=16)
       {
        led=0;  
      }
      else
     {
       one=0;//把number置0,重新計(jì)數(shù)
     }
                  
回復(fù)

使用道具 舉報(bào)

ID:714744 發(fā)表于 2021-1-7 16:27 | 顯示全部樓層
要是滿足04秒亮1.6滅,我這邊建議的話用PWM波進(jìn)行控制,一個周期為2秒,高電平(低電平)為0.4秒,低電平(高電平)1.6秒,這種方法和用PWM控制步進(jìn)電機(jī)轉(zhuǎn)速的方法有點(diǎn)像
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:29 | 顯示全部樓層
wulin 發(fā)表于 2021-1-7 16:16
用定時器作LED不對稱閃爍當(dāng)然沒有問題,樓主T0中斷號錯了!改這樣就能實(shí)現(xiàn)樓主目的。

void  T_Time() in ...

非常感謝,大概明白是具體什么工作原理,并且也算是記住了~波浪號是用來取反的,非常感謝
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:30 | 顯示全部樓層
ggyu7 發(fā)表于 2021-1-7 16:27
要是滿足04秒亮1.6滅,我這邊建議的話用PWM波進(jìn)行控制,一個周期為2秒,高電平(低電平)為0.4秒,低電平( ...

嗯,會借鑒參考了,已經(jīng)解決了,但仍感謝提出的參考意見。
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:30 | 顯示全部樓層
munuc_w 發(fā)表于 2021-1-7 15:38
用一個定時器即可,設(shè)定時時間10ms。計(jì)時開始LED亮,計(jì)到40關(guān)燈,計(jì)到160,計(jì)數(shù)清零,重新計(jì)數(shù),LED亮,。 ...

已經(jīng)解決了,感覺提出的意見參考
回復(fù)

使用道具 舉報(bào)

ID:874595 發(fā)表于 2021-1-7 16:31 | 顯示全部樓層
chaoge131 發(fā)表于 2021-1-7 16:16
one++;                           
        if(one

謝謝提供的修改意見
回復(fù)

使用道具 舉報(bào)

ID:714744 發(fā)表于 2021-1-7 16:32 | 顯示全部樓層
其實(shí)的話我感覺不用定時器也是可以的,就是用PWM波進(jìn)行時間點(diǎn)的控制,要是想0.4秒亮,1.6秒滅?梢栽O(shè)置一個周期為兩秒的方波,其中高電平(低電平)為0.4秒,低電平(高電平)為1.6秒,這種方法和用PWM波控制步進(jìn)電機(jī)轉(zhuǎn)速很像,樓主可以參考一下。如果想用定時器,也可以用這種類似的方法,用到兩個定時器,但是他們時間重合的點(diǎn),需要刪除。
回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-1-7 18:30 | 顯示全部樓層
迷鹿的夏夜 發(fā)表于 2021-1-7 15:49
這樣是不是就不去利用中斷計(jì)時器去計(jì)時嗎?

如果你只單純控制LED按你想要的方式閃,這種延時循環(huán)似乎比計(jì)時器更管用,因?yàn)檫可以在后邊加很多花樣。你說的等時間閃爍那只是給初學(xué)者的教程,為了舉一反三而已。因?yàn)槟侵灰恍蠰ED = ~LED;代碼就可以解決。定時器是解決更高級問題用的,比如精確的計(jì)算出延時或者使用的器件需要精確的高速的時序。對于點(diǎn)燈來說,無謂了。或者你是為了學(xué)習(xí)定時器,也不算冤枉。

比如流水燈,你可以寫成:
while(1)
{
LED1 = 0;LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7=1;
delay;
LED1 = 1;LED2 = 0; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7=1;
delay;
LED1 = 1;LED2 = 1; LED3 = 0; LED4 = 1; LED5 = 1; LED6 = 1; LED7=1;
delay;
LED1 = 1;LED2 = 1; LED3 = 1; LED4 = 0; LED5 = 1; LED6 = 1; LED7=1;
delay;
……

LED1 = 1;LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7=0;
delay;
}

也可以寫成
while(1)
{
PX = 0XFE;
delay;
PX = 0XFC;
delay;

……

PX =0X7F;
delay;
}

還可以寫成
while(1);
{
PX << =1;
delay;
}

至于你想用哪個,這純屬個人愛好,條條大路通羅馬嘛。

回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-1-7 18:32 | 顯示全部樓層
反正用延時和0,1組合做過爆閃燈玩,沒用定時器,可以多種組合。
回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2021-1-11 11:16 | 顯示全部樓層
機(jī)器做的肯定是規(guī)則的,只是規(guī)則復(fù)雜些可以讓人有不規(guī)則的錯覺而已。
回復(fù)

使用道具 舉報(bào)

ID:25310 發(fā)表于 2021-1-12 16:31 | 顯示全部樓層
產(chǎn)生個隨機(jī)數(shù)數(shù)組然后裝到定時器,循環(huán)使用隨機(jī)數(shù)數(shù)組裝到定時器使用。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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