日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自动感光调节LED灯亮度C语言程序,单片机PWM调节LED灯亮度

發(fā)布時間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自动感光调节LED灯亮度C语言程序,单片机PWM调节LED灯亮度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

剛搞完飛思卡爾智能車,昨天我一起做車的搭檔跑來跟我說魏老師(我們系的前主任,不知道他們怎么認(rèn)識的....)叫他幫忙做個可通過無線遙控調(diào)節(jié)LED燈亮度的設(shè)計(jì)方案,問我有沒有興趣做做,主要是魏老師也是受他以前的老同學(xué)(合工大的....)所托,他自己估計(jì)沒怎么搞過這個,開始自己不敢接,很擔(dān)心自己不會做,自己幾斤幾兩自己還不清楚,呵呵,后來實(shí)在央求不過,算了,做就做吧,還以為是什么大項(xiàng)目...了解了才知道,我能需要做的很簡單,只要通過無線按鍵控制增減調(diào)節(jié)燈得亮度,甚至只要通過按鍵實(shí)現(xiàn)一定范圍變化的模擬變化量輸出就OK了,回來上網(wǎng)搜索了一些資料,昨晚花了一晚上的時間寫了一個很簡單的通過單片機(jī)PWM調(diào)節(jié)LED燈亮度的代碼,估計(jì)我想通過調(diào)節(jié)燈得亮度一般都是通過PWM來調(diào)節(jié)的,(網(wǎng)上一般都是這樣的設(shè)計(jì))

上午又寫了個,主要是感覺昨晚的那個不怎么好,而且控制的不夠精準(zhǔn),兩個程序都貼出來吧,主要大家一起學(xué)習(xí)!這兩個程序都是經(jīng)過我親自調(diào)試過!下載到自己使用只需要修改相關(guān)的控制引腳就OK了.......

昨晚的程序如下:

// PWM 控制 LED 燈漸亮漸滅程序

// 晶振為12M

// 利用定時器控制產(chǎn)生占空比可變的 PWM 波

// 按K1,PWM值增加,則占空比減小,LED 燈漸暗。

// 按K2,PWM值減小,則占空比增加,LED 燈漸亮。

// 當(dāng)PWM值增加到最大值或減小到最小值時,蜂鳴器將報(bào)警。

#include < reg51.h >

sbit K1 =P3^0

;?//增加鍵

sbit K2 =P3^1 ;

sbit P10=P1^0

;?//減少鍵

sbit BEEP =P3^7

;?//蜂鳴器

unsigned char PWM=0x7f;?//賦初值

void Beep();

void delayms(unsigned char ms);

void delay(unsigned char t);

void main()

{

/初始化/

K1=1;

K2=1;

TMOD=0x21;

TH0=0xfc;?//1ms延時常數(shù)

TL0=0x18;?//頻率調(diào)節(jié)

TH1=PWM;?//脈寬調(diào)節(jié)

TL1=0;

EA=1;

ET0=1;

ET1=1;?TR0=1;

/主循環(huán)//?while(1)

{

if(K1==0)//遞增按鍵考慮消抖..

{

delayms(20);

if(K1==0)

{?if(PWM==255)

{?PWM=255;

Beep();?}

else

PWM++;

}

}

if(K2==0)//遞減按鍵

{

delayms(20);

if(K2==0)

{?if(PWM==0)

{?PWM=0;

Beep();?}

else PWM--

;

}

}

}

}

// 定時器0中斷服務(wù)程序.

void timer0() interrupt 1

{

TH0=0xfc

;

TL0=0x18

;

TH1=PWM

;//定時器自動重裝值由PWM提供

TR1=1

;

P10=0

;?//啟動輸出

}

// 定時器1中斷服務(wù)程序

void timer1() interrupt 3

{

TR1=0;

P10=1

;?//結(jié)束輸出

}

//蜂鳴器子程序

void

Beep()?{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delay(200) ;

BEEP=!BEEP

;?//Beep取反

}

BEEP=1

;?//關(guān)閉蜂鳴器

delayms(200);

}

// 延時子程序

void delay(unsigned char t)

{

while(t--)?;

}

// 延時子程序

void delayms(unsigned char ms)

{

unsigned

char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

上午的程序,也是從網(wǎng)上下修改修改的,通過示波器可以很明顯的觀察到PWM占空比的變化

#include

?//模擬PWM輸出控制燈的10個亮度級

unsigned int scale;

sbit K1 =P3^0

;?//增加鍵

sbit K2 =P3^1 ;

sbit P11=P1^2 ;

sbit P10=P1^0

;?//減少鍵

sbit BEEP =P3^7

;?//蜂鳴器

unsigned char PWM=20;?//賦初值?//占空比控制變量

void Beep();

void delayms(unsigned char ms);

void delay(unsigned char t);

void main(void)?// 主程序

{

TMOD=0x02;?//定時器0,工作模式2(0000,0010),8位定時模式

TH0=0x06;?//寫入預(yù)置初值6到定時器0,使250微秒溢出一次(12MHz)

TL0=0x06;?//寫入預(yù)置值

TR0=1;?//啟動定時器

ET0=1;?//允許定時器0中斷

EA=1;?//允許總中斷

while

(1)?//無限循環(huán),實(shí)際應(yīng)用中,這里是做主要工作

{

if(K1==0)//遞增按鍵

{

delayms(100);

if(K1==0)

{?if(scale==40)

{?//PWM=255;

Beep();?}

else scale++;

;

}

}

if(K2==0)//遞減按鍵

{

delayms(100);

if(K2==0)

{?if(scale==0)

{?//PWM=0;

Beep();?}

else scale--

;

}

}

}

}

void timer0(void) interrupt 1 //定時器0中斷服務(wù)程序

{

static

unsigned int n ; //n用來保存當(dāng)前時間在一秒中的比例位置

n++;?//每250微秒增加1

if(n==40)?//1秒的時鐘周期

{

n=0;?//使n=0,開始新的PWM周期

P10=0; //使LED燈亮

}

if(scale==n)?//按照當(dāng)前占空比切換輸出為高電平

P10=1; //使LED燈滅

}

//程序中從tt=0開始到scale為低電平,從scale開始到n=10為高電平,

//由于scale是變量,所以改變scale就可以改變占空比。

/下面的程序同上面一樣///

//蜂鳴器子程序

void

Beep()?{

unsigned char i ;

for (i=0 ;i<100 ;i++)

{

delay(200) ;

BEEP=!BEEP

;?//Beep取反

}

BEEP=1

;?//關(guān)閉蜂鳴器

delayms(200);

}

// 延時子程序

void delay(unsigned char t)

{

while(t--)?;

}

// 延時子程序

void delayms(unsigned char ms)

{

unsigned

char i ;

while(ms--)

{

for(i = 0 ; i < 120 ; i++) ;

}

}

總結(jié)

以上是生活随笔為你收集整理的自动感光调节LED灯亮度C语言程序,单片机PWM调节LED灯亮度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。