找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2232|回復: 4
打印 上一主題 下一主題
收起左側(cè)

求指教下stc89c51單片機定時器PWM占空比程序

[復制鏈接]
回帖獎勵 15 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次(中獎概率 80%)
跳轉(zhuǎn)到指定樓層
樓主
ID:336670 發(fā)表于 2022-1-15 23:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個PWM程序是我從網(wǎng)上找的,備注多數(shù)是我自己備注的,請師傅們幫忙看看我備注加??問號的地方的程序是怎么意思呢
#include <reg51.h>


typedef unsigned char uint8;
typedef unsigned int  uint16;


sbit down = P3^3;                 //定義PWM增加按鍵
sbit  up  = P3^0;                //定義PWM減少按鍵
sbit  led = P2^0;                //定義PWM輸出控制端口
uint8 t = 0;                         //定義一個無符號字符變量,累計定時器溢出次數(shù)
uint8 PWM_T = 0;   //占空比控制變量
/***************************************************
                                                        延時1毫秒函數(shù)
****************************************************/
void delay_1ms(uint16 t)
{
        uint16 x,y;
        for(x=t;x>0;x--)
                for(y=120;y>0;y--);
}        
/****************************************************
                  主程序
****************************************************/
void main(void)      
{


        TMOD = 0x02;  //定時器0,工作模式2,8位自動重裝載定時模式
        TH0=210;             //寫入預置初值(取值1-255,數(shù)越大PWM頻率越高)   初值計算公式TH0=255-t*f/12;定時器計數(shù)50次溢出,每次定時計數(shù)1us;
        TL0=210;             //寫入預置值 (取值1-255,數(shù)越大PWM頻率越高)                                t:計數(shù)次數(shù);f:晶振頻率:11.0592M
        TR0=1;               //啟動定時器
        ET0=1;               //允許定時器0中斷
        EA=1;               //允許總中斷
        P1=0xff;                          //初始化P1,輸出端口
        PWM_T=30;                        //默認上電PWM=30%
         while(1)      
        
         {   
                   if(!up)                //檢測PWM增加按鍵是否按下,如果按下,執(zhí)行里面的判斷程序
                         {
                                if(PWM_T<250)                //判斷PWM控制變量是否小于250,如果小于250,則加加,如果不小于250,則無操作
                                        {
                                          PWM_T++;
                                        }
                                
                                delay_1ms(10);//延時10毫秒                ?????此處延時有什么作用?是按鍵消抖嗎?
                        }
                 if(!down)                //檢測PWM減少按鍵是否按下,如果按下,則執(zhí)行里面的判斷程序
                         {
                                if(PWM_T>0)                        //判斷PWM控制變量是否大于0,  如果大于0,則減減,如果不大于0,則無操作
                                        {
                                          PWM_T--;
                                        }
                                
                                delay_1ms(10);//延時10毫秒
                        }


        
         }      
}
/****************************************************
               /定時器0中斷模擬PWM
****************************************************/
timer0() interrupt 1  
{
         t++;                                    //每次定時器溢出計數(shù)變量加1,每次計數(shù)50us,累計溢出250次,累計計時12.5ms
         
        if(t==250)           //PWM周期 100個單位                                        ?????此處如何確定PWM周期就是100個單位                                                                        
         {                                                        //當定時器累計溢出250次時,清空計數(shù)變量,重新開始累計溢出次數(shù),P1端口輸出低電平,否則輸出高電平
                 t=0;                                  //使t=0,開始新的PWM周期
                 led=0;                          //輸出端口
         }
         
         if(PWM_T<=t)          //按照當前占空比切換輸出為高電平                                       
                                                                        //???這兒的PWM_T<=t和PWM_T==t有區(qū)別嗎??應該怎么樣才正確,仿真兩個寫法都能調(diào)節(jié)占空比
         {                                            //當PWM_T檢測等于定時器溢出次數(shù)時,P1端口輸出高電平,否則輸出低電平
                 led=1;        
         }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

來自 4#
ID:213173 發(fā)表于 2022-1-17 10:12 | 只看該作者
  1. #include <reg51.h>


  2. typedef unsigned char uint8;
  3. typedef unsigned int  uint16;


  4. sbit down = P3^3;  //定義PWM增加按鍵
  5. sbit  up  = P3^0;  //定義PWM減少按鍵
  6. sbit  led = P2^0;  //定義PWM輸出控制端口
  7. uint8 t = 0;       //定義一個無符號字符變量,累計定時器溢出次數(shù)
  8. uint8 PWM_T = 0;   //占空比控制變量
  9. /***************************************************
  10.   延時1毫秒函數(shù)
  11. ****************************************************/
  12. void delay_1ms(uint16 t)
  13. {
  14.         uint16 x,y;
  15.         for(x=t;x>0;x--)
  16.                 for(y=120;y>0;y--);
  17. }        
  18. /****************************************************
  19.                   主程序
  20. ****************************************************/
  21. void main(void)      
  22. {
  23.         TMOD = 0x02;  //定時器0,工作模式2,8位自動重裝載定時模式
  24.         TH0=156;      //寫入預置初值(取值1-255,數(shù)越大PWM頻率越高)
  25.         TL0=156;      //定時周期100us
  26.         TR0=1;        //啟動定時器
  27.         ET0=1;        //允許定時器0中斷
  28.         EA=1;         //允許總中斷
  29.         P1=0xff;      //初始化P1,輸出端口
  30.         PWM_T=30;     //默認上電PWM=30%
  31.         while(1)      
  32.         {   
  33.                 if(!up)                //檢測PWM增加按鍵是否按下,如果按下,執(zhí)行里面的判斷程序
  34.                 {
  35.                         delay_1ms(10);    //延時10毫秒消抖
  36.                         if(!up)                                //再次確認按下
  37.                         {
  38.                                 if(PWM_T<100)      //判斷PWM控制變量是否小于100,如果小于100,則加加,如果不小于100,則無操作
  39.                                 {
  40.                                         PWM_T++;
  41.                                         while(!up);//等待松手,否則會連續(xù)++
  42.                                 }
  43.                         }
  44.                 }
  45.                 if(!down)             //檢測PWM減少按鍵是否按下,如果按下,則執(zhí)行里面的判斷程序
  46.                 {
  47.                         delay_1ms(10);                //延時10毫秒消抖
  48.                         if(!down)                        //再次確認按下
  49.                         {
  50.                                 if(PWM_T>0)    //判斷PWM控制變量是否大于0,  如果大于0,則減減,如果不大于0,則無操作
  51.                                 {
  52.                                         PWM_T--;
  53.                                         while(!down);//等待松手,否則會連續(xù)--
  54.                                 }
  55.                         }
  56.                 }
  57.         }      
  58. }
  59. /****************************************************
  60.         /定時器0中斷模擬PWM
  61. ****************************************************/
  62. void timer0() interrupt 1  
  63. {
  64.         t++;
  65.         if(t>=100)//原來代碼不能在0~100范圍可調(diào)
  66.         {
  67.                 t=0;
  68.         }
  69.         if(PWM_T>t)
  70.         {
  71.                 led=0;
  72.         }
  73.         else led=1;
  74. }
復制代碼
回復

使用道具 舉報

沙發(fā)
ID:691185 發(fā)表于 2022-1-16 17:30 | 只看該作者
  if(t==250)           //PWM周期 100個單位                                        ?????此處如何確定PWM周期就是100個單位   
這個感覺不對吧,如果要看作一百個單位的話,前面那個  PWM_T=30;                        //默認上電PWM=30%
這個的值就改了啊。如果不改的話這250就應該改啊。不然感覺你這個輸出的占空比不會是百分之30啊
回復

使用道具 舉報

板凳
ID:81365 發(fā)表于 2022-1-16 22:41 | 只看該作者
1. delay_1ms(10);//延時10毫秒                ????作用是按照給定時間間隔遞增
2.  if(t==250)           //PWM周期 100個單位 ???前一句自加后必然結(jié)果
回復

使用道具 舉報

5#
ID:336670 發(fā)表于 2022-1-18 22:33 | 只看該作者

謝謝老師,明白多了,
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表