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

QQ登錄

只需一步,快速開始

搜索
查看: 10919|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

注釋詳細(xì)的51單片機(jī)pwm調(diào)光代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:433086 發(fā)表于 2019-5-18 14:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)pwm調(diào)光源程序如下:
  1. /*-----------------------------------------------
  2.   名稱:PWM調(diào)光
  3.   修改:無
  4.   內(nèi)容:通過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í),可以看到熄滅的過程
  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--){ //與逐漸變亮相反的過程

  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,無返回值
  41. unsigned int 是定義無符號(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)


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

使用道具 舉報(bào)

沙發(fā)
ID:563595 發(fā)表于 2020-6-4 00:48 | 只看該作者
這個(gè)程序我覺得是很標(biāo)準(zhǔn)的寫法,容易讀。感謝。
回復(fù)

使用道具 舉報(bào)

板凳
ID:709856 發(fā)表于 2020-12-31 08:03 | 只看該作者
借鑒一下,做了個(gè)九檔調(diào)光電路,數(shù)碼管顯示。
回復(fù)

使用道具 舉報(bào)

地板
ID:468878 發(fā)表于 2020-12-31 10:14 | 只看該作者
有點(diǎn)意思,做單純的PWM還是思路不錯(cuò)的,沒搞計(jì)時(shí)器,最簡(jiǎn)單的。
回復(fù)

使用道具 舉報(bào)

5#
ID:390416 發(fā)表于 2020-12-31 11:37 | 只看該作者
#include "STC89.H"                                        //頭文件包含
#include <intrins.h>                                //頭文件包含
typedef unsigned char u8;                        //重新定義數(shù)據(jù)類型名
typedef unsigned short u16;                        //重新定義數(shù)據(jù)類型名
typedef unsigned long u32;                        //重新定義數(shù)據(jù)類型名
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ù),位置任意寫都行
//****************************祁緒電子 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();        
        }
}
回復(fù)

使用道具 舉報(bào)

6#
ID:120677 發(fā)表于 2020-12-31 14:36 | 只看該作者
程序很標(biāo)準(zhǔn)的寫法 注釋得詳細(xì)
回復(fù)

使用道具 舉報(bào)

7#
ID:390416 發(fā)表于 2020-12-31 15:21 | 只看該作者
STC89單片機(jī) 定時(shí)器做PWM程序 http://www.torrancerestoration.com/bbs/dpj-200820-1.html
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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