標(biāo)題: 注釋詳細(xì)的51單片機(jī)pwm調(diào)光代碼 [打印本頁(yè)]

作者: z6509103    時(shí)間: 2019-5-18 14:59
標(biāo)題: 注釋詳細(xì)的51單片機(jī)pwm調(diào)光代碼
單片機(jī)pwm調(diào)光源程序如下:
  1. /*-----------------------------------------------
  2.   名稱(chēng):PWM調(diào)光
  3.   修改:無(wú)
  4.   內(nèi)容:通過(guò)PWM(脈寬調(diào)制)調(diào)節(jié)LED的亮度
  5. ------------------------------------------------*/
  6. #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義

  7. sbit LED0=P1^0;// 用sbit 關(guān)鍵字 定義 LED到P1.0端口,LED是自己任意定義且容易記憶的符號(hào)


  8. void Delay(unsigned int t); //函數(shù)聲明
  9. /*------------------------------------------------
  10.                     主函數(shù)
  11. ------------------------------------------------*/
  12. void main (void)
  13. {
  14.                   
  15. unsigned int CYCLE=1000,PWM_LOW=0;//定義周期并賦值
  16. while (1)         //主循環(huán)
  17.   {
  18. LED0=1;
  19. Delay(60000);        //特意加延時(shí),可以看到熄滅的過(guò)程
  20. for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低
  21. //電平時(shí)間,這個(gè)循環(huán)中低電平時(shí)長(zhǎng)從1累加到CYCLE(周期)的值,即600次

  22.                    LED0=0;        //點(diǎn)亮LED  
  23.                    Delay(PWM_LOW);//延時(shí)長(zhǎng)度,600次循環(huán)中從1加至599
  24.                    LED0=1;        //熄滅LED
  25.               Delay(CYCLE-PWM_LOW);//延時(shí)長(zhǎng)度,600次循環(huán)中從599減至1
  26.      
  27.    }
  28. LED0=0;
  29. for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //與逐漸變亮相反的過(guò)程

  30.                    LED0=0;
  31.                    Delay(PWM_LOW);
  32.                    LED0=1;
  33.               Delay(CYCLE-PWM_LOW);
  34.      
  35.    }
  36.                      //主循環(huán)中添加其他需要一直工作的程序
  37.   }
  38. }
  39. /*------------------------------------------------
  40. 延時(shí)函數(shù),含有輸入?yún)?shù) unsigned int t,無(wú)返回值
  41. unsigned int 是定義無(wú)符號(hào)整形變量,其值的范圍是
  42. 0~65535
  43. ------------------------------------------------*/
  44. void Delay(unsigned int t)
  45. {
  46. while(--t);
  47. }
復(fù)制代碼

所有資料51hei提供下載:
15-PWM調(diào)光.zip (20.94 KB, 下載次數(shù): 165)



作者: jizhouheng    時(shí)間: 2020-6-4 00:48
這個(gè)程序我覺(jué)得是很標(biāo)準(zhǔn)的寫(xiě)法,容易讀。感謝。
作者: doctorshi    時(shí)間: 2020-12-31 08:03
借鑒一下,做了個(gè)九檔調(diào)光電路,數(shù)碼管顯示。
作者: rsx9583    時(shí)間: 2020-12-31 10:14
有點(diǎn)意思,做單純的PWM還是思路不錯(cuò)的,沒(méi)搞計(jì)時(shí)器,最簡(jiǎn)單的。
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2020-12-31 11:37
#include "STC89.H"                                        //頭文件包含
#include <intrins.h>                                //頭文件包含
typedef unsigned char u8;                        //重新定義數(shù)據(jù)類(lèi)型名
typedef unsigned short u16;                        //重新定義數(shù)據(jù)類(lèi)型名
typedef unsigned long u32;                        //重新定義數(shù)據(jù)類(lèi)型名
sbit PWM_OUT=P2^1;        
u8 idata PWM_Write_Byte[3]=0;

// 定時(shí)器0初始化  晶振11059200,12T,輸出50Hz的PWM,占空比0~255
// 定時(shí)器初值為:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8
//***************************祁緒電子 2020年5月***
void PWM_Init(void)
{
        TMOD &= 0xF0;                                        //配置定時(shí)器工作模式
        TMOD |= 0x02;                                        //配置定時(shí)器工作模式 8位自動(dòng)重裝模式
    TL0 = 0xB8;;                    //定時(shí)器初值
    TH0 = 0xB8;                                //定時(shí)器重裝初值
    TR0 = 1;                        //啟動(dòng)定時(shí)器0
    ET0=1;                                                         //允許定時(shí)器0申請(qǐng)中斷
        EA=1;                                                        //中斷總閘閉合
}
//定時(shí)器0的CPU處理函數(shù),位置任意寫(xiě)都行
//****************************祁緒電子 2020年5月***
void PWM_Display_timer0() interrupt 1
{
        
        static u8 pwm_t=0;                                 //局部變量,不丟失數(shù)據(jù)
        if(pwm_t<PWM_Write_Byte[0])
        {
                PWM_OUT=1;                                 
        }
        else PWM_OUT=0;
        pwm_t++;
}

// PWM 數(shù)模變換數(shù)據(jù)分配
//**************************祁緒電子 2020年5月***
void PWM_Allot()                                          
{
        static u8 kkk=0;        
        static u8 count=0;
        count++;
        if(count>100)
        {
                count=0;
                kkk++;
                PWM_Write_Byte[0]=kkk;        //kkk為占空比自動(dòng)增加
                PWM_Write_Byte[1]=10;        
                PWM_Write_Byte[2]=10;
        }
}


void main()                                                        //主函數(shù)
{
        PWM_Init();
        while(1)                                                //主函數(shù)大循環(huán)
        {
                PWM_Allot();        
        }
}
作者: chjchj816    時(shí)間: 2020-12-31 14:36
程序很標(biāo)準(zhǔn)的寫(xiě)法 注釋得詳細(xì)
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2020-12-31 15:21
STC89單片機(jī) 定時(shí)器做PWM程序 http://www.torrancerestoration.com/bbs/dpj-200820-1.html




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