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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2190|回復: 4
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
回帖獎勵 15 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 1 次(中獎概率 80%)
跳轉到指定樓層
樓主
ID:336670 發表于 2022-1-15 23:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個PWM程序是我從網上找的,備注多數是我自己備注的,請師傅們幫忙看看我備注加??問號的地方的程序是怎么意思呢
#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;                         //定義一個無符號字符變量,累計定時器溢出次數
uint8 PWM_T = 0;   //占空比控制變量
/***************************************************
                                                        延時1毫秒函數
****************************************************/
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,數越大PWM頻率越高)   初值計算公式TH0=255-t*f/12;定時器計數50次溢出,每次定時計數1us;
        TL0=210;             //寫入預置值 (取值1-255,數越大PWM頻率越高)                                t:計數次數;f:晶振頻率:11.0592M
        TR0=1;               //啟動定時器
        ET0=1;               //允許定時器0中斷
        EA=1;               //允許總中斷
        P1=0xff;                          //初始化P1,輸出端口
        PWM_T=30;                        //默認上電PWM=30%
         while(1)      
        
         {   
                   if(!up)                //檢測PWM增加按鍵是否按下,如果按下,執行里面的判斷程序
                         {
                                if(PWM_T<250)                //判斷PWM控制變量是否小于250,如果小于250,則加加,如果不小于250,則無操作
                                        {
                                          PWM_T++;
                                        }
                                
                                delay_1ms(10);//延時10毫秒                ?????此處延時有什么作用?是按鍵消抖嗎?
                        }
                 if(!down)                //檢測PWM減少按鍵是否按下,如果按下,則執行里面的判斷程序
                         {
                                if(PWM_T>0)                        //判斷PWM控制變量是否大于0,  如果大于0,則減減,如果不大于0,則無操作
                                        {
                                          PWM_T--;
                                        }
                                
                                delay_1ms(10);//延時10毫秒
                        }


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


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

使用道具 舉報

來自 4#
ID:213173 發表于 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;       //定義一個無符號字符變量,累計定時器溢出次數
  8. uint8 PWM_T = 0;   //占空比控制變量
  9. /***************************************************
  10.   延時1毫秒函數
  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,數越大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增加按鍵是否按下,如果按下,執行里面的判斷程序
  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);//等待松手,否則會連續++
  42.                                 }
  43.                         }
  44.                 }
  45.                 if(!down)             //檢測PWM減少按鍵是否按下,如果按下,則執行里面的判斷程序
  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);//等待松手,否則會連續--
  54.                                 }
  55.                         }
  56.                 }
  57.         }      
  58. }
  59. /****************************************************
  60.         /定時器0中斷模擬PWM
  61. ****************************************************/
  62. void timer0() interrupt 1  
  63. {
  64.         t++;
  65.         if(t>=100)//原來代碼不能在0~100范圍可調
  66.         {
  67.                 t=0;
  68.         }
  69.         if(PWM_T>t)
  70.         {
  71.                 led=0;
  72.         }
  73.         else led=1;
  74. }
復制代碼
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黑人巨大精品欧美一区二区免费 | 成人a视频在线观看 | 国产精品自产拍在线观看蜜 | 国产目拍亚洲精品99久久精品 | 羞羞在线视频 | 国产精品国产a级 | 欧美一区二区在线观看 | 久久亚洲国产精品日日av夜夜 | 久久久久久久久综合 | 久久久一| 欧美一区二区三区高清视频 | 精品亚洲一区二区三区 | 欧美伊人影院 | 国产99久久精品一区二区永久免费 | 欧美精品1区2区3区 精品国产欧美一区二区 | 国产免费一区二区 | 久久久久久91 | 欧美性一级| 日韩免费网站 | 亚洲小视频 | 欧美日韩综合精品 | 亚洲精品一区二区三区四区高清 | 一级片av| 久久久久国产精品一区二区 | 在线播放亚洲 | 天天干天天操天天射 | 亚洲一区二区三区四区五区中文 | 日韩成人在线观看 | 欧美一区二区三区精品 | 国产精品电影在线观看 | 九九热精品视频 | 亚洲va欧美va天堂v国产综合 | 一区二区三区视频在线观看 | 久久33| 国产电影一区 | 国产一区二区三区www | 亚洲欧美日韩精品久久亚洲区 | 国产亚洲精品综合一区 | 午夜影院在线观看 | 天天欧美| www.4hu影院 |