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

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

QQ登錄

只需一步,快速開始

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

51單片機(jī)用PMW做呼吸燈,燈卻閃爍的很厲害

[復(fù)制鏈接]
ID:601140 發(fā)表于 2019-8-18 11:39 | 顯示全部樓層 |閱讀模式
新人發(fā)帖 如有不足 請(qǐng)各位批評(píng)指正~
本人想實(shí)現(xiàn)用PWM做一個(gè)呼吸燈 讓燈暗-亮-暗地循環(huán) 但是實(shí)際效果是燈的亮度變化不明顯 而且閃爍得很厲害 請(qǐng)各位幫忙看看我的程序哪里出了問題 謝謝各位!
  1. #include<reg52.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. sbit LED=P0^0;

  5. bit output=1;

  6. u8 TRH_H,TRH_L,TRL_H,TRL_L;

  7. //這兩個(gè)是溝通主程序和T1中斷的
  8. u8 T1RL,T1RH;


  9. u8 freq;
  10. u16 Period;//一個(gè)信號(hào)周期所需要的機(jī)器周期數(shù)

  11. u8 index=0;
  12. u8 code Brightness[]={51, 54, 58, 62, 65, 69, 73, 77, 81, 86, 90, 93, 95};

  13. void SetTimer0();
  14. void SetTimer1(u16);
  15. void AdjustBrightness(u8);


  16. void main()
  17. {
  18.         

  19.    EA=1;
  20.    freq=100;
  21.    Period=12000000/(12*freq);//一個(gè)信號(hào)的周期也就是中斷周期
  22.   
  23.    AdjustBrightness(Brightness[index]);

  24.    SetTimer0();
  25.    SetTimer1(50);

  26.    while(1);
  27. }

  28. void SetTimer0()
  29. {
  30.         ET0=1;
  31.         TMOD=(TMOD&0xF0)|0x01;
  32.         TR0=1;
  33.         TH0=TRH_H;
  34.         TL0=TRL_H;
  35. }



  36. void SetTimer1(u16 interval)
  37. {
  38.         u16 temp=0;//記錄一個(gè)間隔=多少機(jī)器周期
  39.         temp=interval*1000;//這個(gè)間隔以毫秒為單位 而一個(gè)機(jī)器周期又為1us 正好是一千倍的關(guān)系        

  40.         T1RH=(unsigned char)((65536-temp)>>8);
  41.         T1RL=(unsigned char)(65536-temp);


  42.         TMOD &= 0x0F;   //清零T1的控制位
  43.     TMOD |= 0x10;   //配置T1為模式1         
  44.         TL1=T1RL;
  45.         TH1=T1RH;
  46.         ET1=1;
  47.         TR1=1;//打開定時(shí)器1的中斷
  48. }

  49. void AdjustBrightness(u8 dr)//dr=占空比
  50. {
  51.         static u16 hightime,lowtime;//傳送一個(gè)信號(hào)需要多少個(gè)機(jī)器周期
  52.         

  53.         //下面計(jì)算高電平和低電平所需要的時(shí)間
  54.         //并算出對(duì)應(yīng)的TRL和TRH

  55.         hightime=Period*dr/100;
  56.         lowtime=Period-hightime;

  57.         TRH_H=(unsigned char)((65536-hightime)>>8);
  58.         TRL_H= (unsigned char)(65536-hightime);//注意這里只取了低八位 高八位溢出了

  59.         TRH_L=(unsigned char)((65536-lowtime)>>8);
  60.         TRL_L=(unsigned char)(65536-lowtime);

  61. }


  62. void InterruptTimer0()interrupt 1
  63. {
  64.         if(output==1)//如果此時(shí)輸出的是高電平
  65.         {
  66.           LED=output;
  67.          
  68.           TH0=TRH_L;
  69.           TL0=TRL_L;
  70.                
  71.           output=0;
  72.         }

  73.         else if(output==0)//如果此時(shí)輸出的是高電平
  74.         {
  75.           LED=output;
  76.          
  77.           TH0=TRH_H;
  78.           TL0=TRL_H;
  79.                
  80.           output=1;
  81.         }

  82. }

  83. void InterruptTimer1() interrupt 3
  84. {

  85.         static bit dir=0;//表示燈現(xiàn)在是往變大的方向變化還是往小的方向變化
  86.         TH1=T1RH; //重裝
  87.         TL1=T1RL;


  88.         AdjustBrightness(Brightness[index]);

  89.         if(dir==0)
  90.         {
  91.                 index++;
  92.                 if(index>=12)
  93.                 {dir=1;}  
  94.             
  95.         }
  96.         else if(dir==1)
  97.         {
  98.                 index--;
  99.                 if(index==0)
  100.                 {dir=0;}
  101.         }
  102. }
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

ID:96682 發(fā)表于 2019-8-18 13:07 | 顯示全部樓層
同一個(gè)程序使用不同型號(hào)的單片機(jī)會(huì)產(chǎn)生不同的視覺效果,不滿意只能修改程序了
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2019-8-18 13:22 | 顯示全部樓層
寫出你的設(shè)計(jì)思路看看。
回復(fù)

使用道具 舉報(bào)

ID:601140 發(fā)表于 2019-8-18 14:24 | 顯示全部樓層
yzwzfyz 發(fā)表于 2019-8-18 13:22
寫出你的設(shè)計(jì)思路看看。

設(shè)計(jì)思路是:定時(shí)器1定時(shí)切換占空比,也就是切換亮度  定時(shí)器0按照對(duì)應(yīng)的占空比控制燈的亮滅  這些都在中斷里面完成 主程序只是設(shè)定定時(shí)器的初值和頻率之類的
回復(fù)

使用道具 舉報(bào)

ID:601140 發(fā)表于 2019-8-18 14:26 | 顯示全部樓層
wc86110 發(fā)表于 2019-8-18 13:07
同一個(gè)程序使用不同型號(hào)的單片機(jī)會(huì)產(chǎn)生不同的視覺效果,不滿意只能修改程序了

單片機(jī)型號(hào)是STC89C516 應(yīng)該不是單片機(jī)的問題 應(yīng)該是我的程序本身有問題 可是不知道究竟是哪里不對(duì)呢...
回復(fù)

使用道具 舉報(bào)

ID:598942 發(fā)表于 2019-8-18 20:44 | 顯示全部樓層
可以把周期調(diào)長(zhǎng)一點(diǎn)
回復(fù)

使用道具 舉報(bào)

ID:388197 發(fā)表于 2019-8-18 23:37 | 顯示全部樓層
現(xiàn)在新款的都有硬件的PWM,如果自己寫軟件的...也不用兩個(gè)定時(shí)器,1個(gè)就足夠了
比如10u一次的定時(shí)器T0中斷.
u16 Cycle_Time = 100;         //這個(gè)數(shù)字乘以定時(shí)器中斷時(shí)間就是周期.
u16 Duty          =  40;          //占空比.
u16 T0_Cnt =         0           //計(jì)數(shù)器變量,用以跟上面兩個(gè)變量比較,決定輸出電平.
sbit PWM_Out_Pin = Px^x;

void main()
{
    Init_XXX();                //IO輸出模式之類的各種INIT.....
    ........
    ........
   Init_T0();                   //設(shè)置好定時(shí)器T0并使能.
    PWM_Out_Pin = 1;    // 將對(duì)應(yīng)的IO口先拉高.
    while(1);
}
T0_ISR() interrupt 1    //10us
{
     TH0 = X;        //新款的51有16位自動(dòng)重載,或者用8位的自動(dòng)重載,這些就不用寫了
     TL0 = X;
     T0_Cnt++;
     if(T0_Cnt<Duty)       //小于占空比則輸出高.
    {
        PWM_IO_Pin = 1;
    }
    if(T0_Cnt >=Duty && T0_Cnt<Cycle_Time) //計(jì)數(shù)變量大于占空比了,當(dāng)然要輸出低.
   {
       PWM_IO_Pin = 0;
   }
   if(T0_Cnt >= Cycle_Time)   //如果計(jì)數(shù)變量超過周期時(shí)間了,就清0.下一個(gè)周期開始.
   {
      T0_Cnt = 0;
   }
}

你在MAIN的大循環(huán)里改變CYCLE_TIME   DUTY這兩個(gè)變量,就可以實(shí)現(xiàn)周期,占空比的調(diào)整.
有段時(shí)間沒寫過51的程序了,不保證沒BUG,參考參考就行.
回復(fù)

使用道具 舉報(bào)

ID:299748 發(fā)表于 2019-8-19 00:38 | 顯示全部樓層
增大頻率試試
回復(fù)

使用道具 舉報(bào)

ID:96857 發(fā)表于 2019-8-19 08:38 | 顯示全部樓層
PWM調(diào)壓要電流連續(xù)模式才與占空比成正比關(guān)系,你的閃爍與你的開關(guān)頻率可能有關(guān)系。
回復(fù)

使用道具 舉報(bào)

ID:601140 發(fā)表于 2019-8-19 09:30 | 顯示全部樓層
cjm82 發(fā)表于 2019-8-18 23:37
現(xiàn)在新款的都有硬件的PWM,如果自己寫軟件的...也不用兩個(gè)定時(shí)器,1個(gè)就足夠了
比如10u一次的定時(shí)器T0中斷.
...

非常感謝!!我去試試。!
回復(fù)

使用道具 舉報(bào)

ID:601529 發(fā)表于 2019-8-19 11:44 | 顯示全部樓層
哦  學(xué)到了,我去試試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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