久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4407|回復: 10
收起左側

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

[復制鏈接]
ID:601140 發表于 2019-8-18 11:39 | 顯示全部樓層 |閱讀模式
新人發帖 如有不足 請各位批評指正~
本人想實現用PWM做一個呼吸燈 讓燈暗-亮-暗地循環 但是實際效果是燈的亮度變化不明顯 而且閃爍得很厲害 請各位幫忙看看我的程序哪里出了問題 謝謝各位!
  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. //這兩個是溝通主程序和T1中斷的
  8. u8 T1RL,T1RH;


  9. u8 freq;
  10. u16 Period;//一個信號周期所需要的機器周期數

  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);//一個信號的周期也就是中斷周期
  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;//記錄一個間隔=多少機器周期
  39.         temp=interval*1000;//這個間隔以毫秒為單位 而一個機器周期又為1us 正好是一千倍的關系        

  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;//打開定時器1的中斷
  48. }

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

  53.         //下面計算高電平和低電平所需要的時間
  54.         //并算出對應的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)//如果此時輸出的是高電平
  65.         {
  66.           LED=output;
  67.          
  68.           TH0=TRH_L;
  69.           TL0=TRL_L;
  70.                
  71.           output=0;
  72.         }

  73.         else if(output==0)//如果此時輸出的是高電平
  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;//表示燈現在是往變大的方向變化還是往小的方向變化
  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. }
復制代碼




回復

使用道具 舉報

ID:96682 發表于 2019-8-18 13:07 | 顯示全部樓層
同一個程序使用不同型號的單片機會產生不同的視覺效果,不滿意只能修改程序了
回復

使用道具 舉報

ID:123289 發表于 2019-8-18 13:22 | 顯示全部樓層
寫出你的設計思路看看。
回復

使用道具 舉報

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

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

使用道具 舉報

ID:601140 發表于 2019-8-18 14:26 | 顯示全部樓層
wc86110 發表于 2019-8-18 13:07
同一個程序使用不同型號的單片機會產生不同的視覺效果,不滿意只能修改程序了

單片機型號是STC89C516 應該不是單片機的問題 應該是我的程序本身有問題 可是不知道究竟是哪里不對呢...
回復

使用道具 舉報

ID:598942 發表于 2019-8-18 20:44 | 顯示全部樓層
可以把周期調長一點
回復

使用道具 舉報

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

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

你在MAIN的大循環里改變CYCLE_TIME   DUTY這兩個變量,就可以實現周期,占空比的調整.
有段時間沒寫過51的程序了,不保證沒BUG,參考參考就行.
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

非常感謝!!我去試試。!
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 操人网站 | 婷婷激情综合 | 国产在线看片 | 日韩欧美专区 | 欧美一区二区三区精品免费 | 五月综合久久 | 精品视频一区二区三区 | 欧美日一区二区 | 女朋友的闺蜜3韩国三级 | 在线观看av网站永久 | 亚洲精品一区二区另类图片 | 亚洲夜射 | 国产精品区一区二 | 欧美日韩精品免费观看 | 日韩精品在线播放 | 欧美日韩a | 久久久久无码国产精品一区 | 视频一二三区 | 日韩欧美大片在线观看 | 午夜久久久久久久久久一区二区 | 久操av在线| 日本免费黄色一级片 | 国产真实精品久久二三区 | 亚洲第一区久久 | 久草视频在线播放 | 久久久精 | jav成人av免费播放 | 色爱综合| av网站在线免费观看 | 亚洲高清久久 | 老司机午夜性大片 | 网色| 能看的av | 黄色国产大片 | 久久精品一区二区三区四区 | 91九色麻豆 | 青青草久久 | 日本精a在线观看 | 羞羞的视频在线看 | av香港经典三级级 在线 | 中国一级特黄毛片大片 |