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

標題: 51單片機能不能利用定時器做一個不規則的LED閃爍? [打印本頁]

作者: 迷鹿的夏夜    時間: 2021-1-7 13:46
標題: 51單片機能不能利用定時器做一個不規則的LED閃爍?
比如不是要那種1秒閃一秒滅那種,而是那種0.4秒亮。1.6秒滅那種.自己找了些程序想做參考,但基本都是那種比較固定的亮滅正好相反的那種。并且在Protest動態幀運的時間計時是不是剛開始有個延遲?我現在在想的時兩個計時一個負責滅一個負責亮

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

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

作者: 楊雪飛    時間: 2021-1-7 15:32
WHILE(1)
{
LED = 1;
DELAY 0.4S;
LED = 0;
DELAY 1.6S;
}

不行?
作者: munuc_w    時間: 2021-1-7 15:38
用一個定時器即可,設定時時間10ms。計時開始LED亮,計到40關燈,計到160,計數清零,重新計數,LED亮,。。。如此。
作者: 迷鹿的夏夜    時間: 2021-1-7 15:49
楊雪飛 發表于 2021-1-7 15:32
WHILE(1)
{
LED = 1;

這樣是不是就不去利用中斷計時器去計時嗎?
作者: 迷鹿的夏夜    時間: 2021-1-7 15:50
munuc_w 發表于 2021-1-7 15:38
用一個定時器即可,設定時時間10ms。計時開始LED亮,計到40關燈,計到160,計數清零,重新計數,LED亮,。 ...

我也是這么想的,但我沒搞懂后面應該是怎么些,倒是能看的懂一些常見亮1秒滅一秒的案例代碼,但自己搞不懂怎么修改成我想要的那種計時效果
作者: 迷鹿的夏夜    時間: 2021-1-7 16:00
能否問下后續應該怎么修改,因為這一段一直沒搞懂,只知道個大概,找了幾個示例程序修改也一直沒搞出想要的效果,編譯也能過,但編譯出來的HEX文件沒有那種效果
作者: 迷鹿的夏夜    時間: 2021-1-7 16:01
C:\Users\Mr.Z\Pictures\Screenshots這是protest的仿真圖
作者: 迷鹿的夏夜    時間: 2021-1-7 16:05
這是Proteus的仿真設計圖,用的AT89C51,想修改成利用中斷計時器去進行LED燈亮2滅1那種的自由設定的參數,求解后續該怎么修改。

屏幕截圖(6).png (172.61 KB, 下載次數: 91)

屏幕截圖(6).png

作者: 迷鹿的夏夜    時間: 2021-1-7 16:10
仿真電路圖

屏幕截圖(6).png (172.61 KB, 下載次數: 104)

屏幕截圖(6).png

作者: wulin    時間: 2021-1-7 16:16
用定時器作LED不對稱閃爍當然沒有問題,樓主T0中斷號錯了!改這樣就能實現樓主目的。

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
}
作者: chaoge131    時間: 2021-1-7 16:16
迷鹿的夏夜 發表于 2021-1-7 16:00
能否問下后續應該怎么修改,因為這一段一直沒搞懂,只知道個大概,找了幾個示例程序修改也一直沒搞出想要的 ...

        one++;                           
        if(one<=4)            
         {        
          led=1;                         //led燈亮
         }
         else if(one<=16)
       {
        led=0;  
      }
      else
     {
       one=0;//把number置0,重新計數
     }
                  
作者: ggyu7    時間: 2021-1-7 16:27
要是滿足04秒亮1.6滅,我這邊建議的話用PWM波進行控制,一個周期為2秒,高電平(低電平)為0.4秒,低電平(高電平)1.6秒,這種方法和用PWM控制步進電機轉速的方法有點像
作者: 迷鹿的夏夜    時間: 2021-1-7 16:29
wulin 發表于 2021-1-7 16:16
用定時器作LED不對稱閃爍當然沒有問題,樓主T0中斷號錯了!改這樣就能實現樓主目的。

void  T_Time() in ...

非常感謝,大概明白是具體什么工作原理,并且也算是記住了~波浪號是用來取反的,非常感謝
作者: 迷鹿的夏夜    時間: 2021-1-7 16:30
ggyu7 發表于 2021-1-7 16:27
要是滿足04秒亮1.6滅,我這邊建議的話用PWM波進行控制,一個周期為2秒,高電平(低電平)為0.4秒,低電平( ...

嗯,會借鑒參考了,已經解決了,但仍感謝提出的參考意見。
作者: 迷鹿的夏夜    時間: 2021-1-7 16:30
munuc_w 發表于 2021-1-7 15:38
用一個定時器即可,設定時時間10ms。計時開始LED亮,計到40關燈,計到160,計數清零,重新計數,LED亮,。 ...

已經解決了,感覺提出的意見參考
作者: 迷鹿的夏夜    時間: 2021-1-7 16:31
chaoge131 發表于 2021-1-7 16:16
one++;                           
        if(one

謝謝提供的修改意見
作者: ggyu7    時間: 2021-1-7 16:32
其實的話我感覺不用定時器也是可以的,就是用PWM波進行時間點的控制,要是想0.4秒亮,1.6秒滅。可以設置一個周期為兩秒的方波,其中高電平(低電平)為0.4秒,低電平(高電平)為1.6秒,這種方法和用PWM波控制步進電機轉速很像,樓主可以參考一下。如果想用定時器,也可以用這種類似的方法,用到兩個定時器,但是他們時間重合的點,需要刪除。

作者: 楊雪飛    時間: 2021-1-7 18:30
迷鹿的夏夜 發表于 2021-1-7 15:49
這樣是不是就不去利用中斷計時器去計時嗎?

如果你只單純控制LED按你想要的方式閃,這種延時循環似乎比計時器更管用,因為還可以在后邊加很多花樣。你說的等時間閃爍那只是給初學者的教程,為了舉一反三而已。因為那只要一行LED = ~LED;代碼就可以解決。定時器是解決更高級問題用的,比如精確的計算出延時或者使用的器件需要精確的高速的時序。對于點燈來說,無謂了。或者你是為了學習定時器,也不算冤枉。

比如流水燈,你可以寫成:
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;
}

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


作者: 楊雪飛    時間: 2021-1-7 18:32
反正用延時和0,1組合做過爆閃燈玩,沒用定時器,可以多種組合。
作者: man1234567    時間: 2021-1-11 11:16
機器做的肯定是規則的,只是規則復雜些可以讓人有不規則的錯覺而已。
作者: pcbboy    時間: 2021-1-12 16:31
產生個隨機數數組然后裝到定時器,循環使用隨機數數組裝到定時器使用。




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