❶ 51單片機如何用一個按鍵和一個定時器來模擬PWM控制一個LED燈的亮度
使用定時器T0產生PWM方波,
用按鍵調整占空比,20級可調
控制led燈的亮度等級.
#include "my51.h"
#include "timer0.h"
#define grading 20 //亮度20級變化
sbit keyS3=P3^5; //按鍵調整占空比,PWM_keyChange++
sbit keyS4=P3^6; // PWM_keyChange--
u8 PWM_keyChange=10; //初值,按鍵調整在1~20之間變化
//占空比 PWM_keyChange/grading
void T0_work() //本函數由T0定時器中斷函數調用
{
if(timeMultiple1Flag)
{
led=off(7); //關閉7號燈
timeMultiple1Flag=0; //清定時器復用置位標志
}
if(timeMultiple2Flag)
{
led=on(7); //打開7號燈
timeMultiple2Flag=0; //清定時器復用置位標志
}
}
void main() //測試
{
u8 keyFlag=1; //程序中沒有消抖處理,只是簡易的按鍵進出自鎖標志
led0=ledon; //先打開0號燈,用於和7號燈對比亮度
initT0(1,10,grading); //1毫秒的基本定時,亮的時間1*10毫秒,暗1*(grading-10)毫秒
while(1)
{
if(0==keyS3)
{
if(keyFlag) //防止一次按鍵中多次執行
{
keyFlag=0; //清標志,類似同步鎖
if(++PWM_keyChange>grading)
{
PWM_keyChange=grading; //占空比最大100%
}
initT0(1,PWM_keyChange,grading);
}
}
else if(0==keyS4)
{
if(keyFlag)
{
keyFlag=0;
if(0==--PWM_keyChange) //占空比減小
{
PWM_keyChange=1; //最小占空比 1/20
}
initT0(1,PWM_keyChange,grading); //占空比減小
}
}
else
{
keyFlag=1; //按鍵鎖釋放標志,下一次按鍵時允許調整占空比
}
}
}
C代碼
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include <stdio.h>
#include "mytype.h"
#ifndef _51LED_
#define _51LED_
#define led P1 //P1匯流排連8個led燈,燈連573鎖存器,P1置低電平點亮
#define LED led
#define ON(x) P1&(~(1<<(x))) //打開某個燈,開多個燈用 ON(m) & ON(n)
#define OFF(x) P1|(1<<(x)) //關閉某個燈,關多個燈用 OFF(m)| OFF(n)
#define on(x) ON(x) //包含大小寫
#define off(x) OFF(x)
#define ledon 0 //某個燈,打開
#define ledoff 1 //某個燈,關閉
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //鎖定當前8個led的狀態,0鎖定 ,1不鎖定
#endif
/*************二進制輸入宏****************************/
#ifndef _LongToBin_
#define LongToBin(n) \
( \
((n >> 21) & 0x80) | \
((n >> 18) & 0x40) | \
((n >> 15) & 0x20) | \
((n >> 12) & 0x10) | \
((n >> 9) & 0x08) | \
((n >> 6) & 0x04) | \
((n >> 3) & 0x02) | \
((n ) & 0x01) \
)
#define bin(n) LongToBin(0x##n##l)
#define BIN(n) bin(n)
#define B(n) bin(n)
#define b(n) bin(n)
#endif
/*************單個數據位的置位宏*********************/
#ifndef _BIT_
#define BIT(n) (1<<n)
#define bit(n) BIT(n)
#endif
#define high 1 //高電平
#define low 0 //低電平
sbit beep=P2^3; //蜂鳴器
extern void delayms(u16 ms);
extern void delayXus(u8 us); //函數執行(8+6x)個機器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#endif
C代碼
#ifndef _TIMER0_H
#define _TIMER0_H
#include "my51.h"
extern u8 timeMultiple1Flag; //中斷時間復用置位標志,須手動清零
extern u8 timeMultiple2Flag; //中斷時間復用置位標志,須手動清零
extern void T0_work(); //該函數未實現,需外部實現
extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定時器初始化
#endif
C代碼
#include "timer0.h"
u8 TH0Cout=0 ; //初值
u8 TL0Cout=0 ;
u16 T0IntCouts1=0; //中斷計數
u16 T0IntCouts2=0; //中斷計數
u16 timeMultiple1=0; //中斷復用時間的倍數
u16 timeMultiple2=0; //中斷復用時間的倍數
u8 timeMultiple1Flag=0; //中斷時間復用置位標志,須手動清零
u8 timeMultiple2Flag=0; //中斷時間復用置位標志,須手動清零
//開啟定時器,定時完成後需要手動關閉TR0,否則將循環定時
//參數一是定時的毫秒數,參數二和三是定時基時的倍率數(定時復用)
void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定時器初始化設定,ms取值不超過65
{
u16 N=11059.2*ms/12; //定時器總計數值
TR0=STOP; //停掉定時器
ET0=CLOSE; //關定時器中斷
//對於110592晶振,ms為5的整數倍時沒有計算誤差,但ms最大不超過71毫秒
TH0Cout =(65536-N)/256; //裝入計時值零頭計數初值
TL0Cout =(65536-N)%256;
if(0==t_multiple1) //0倍的基準時間是不合理的,至少1倍
{
t_multiple1=1;
}
if(0==t_multiple2) //0倍的基準時間是不合理的,至少1倍
{
t_multiple2=1;
}
timeMultiple1=t_multiple1; //倍時
timeMultiple2=t_multiple2; //倍時
TMOD &= 0xf0; //清定時器0配置
TMOD |= 0x01; //配置定時器0的工作方式為1
EA =OPEN; //打開總中斷
ET0=OPEN; //打開定時器中斷
TH0=TH0Cout; //定時器裝入初值
TL0=TL0Cout;
TR0=START; //啟動定時器
}
void T0_times() interrupt 1 //T0定時器中斷函數
{
TH0=TH0Cout; //重裝初值
TL0=TL0Cout;
if(++T0IntCouts1==timeMultiple1) //判斷是否復用定時器
{
T0IntCouts1=0; //中斷次數清零,重新計時
timeMultiple1Flag=1; //復用定時器標志,須在T0_work()中手動清零
}
if(++T0IntCouts2==timeMultiple2) //判斷是否復用定時器
{
T0IntCouts1=0; //這個也要清,防止到達最小公倍數時亂掉
T0IntCouts2=0; //中斷次數清零,重新計時
timeMultiple2Flag=1; //復用定時器標志,須在T0_work()中手動清零
}
T0_work(); //調用工作函數
}
❷ 怎麼用單片機的PWM控制一個燈的亮度
想用單片機的PWM控制一個燈的亮度,關鍵是要看什麼燈,電壓是多少,可供直流電嗎。用PWM控制亮度,必須要用一個電子開關,比如三極體,電流比較大時可用MOS管,電流再大用IGBT管。最關鍵的是必須用直流供電。要是交流供電給燈,那隻好用雙向可控硅,但不能用PWM的方法控制了。
❸ 單片機pwm控制LED程序的問題
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;
sbit key2=P3^3;
uchar pwm;
uchar pwm2;
void keyscan();
void delay(uchar z);
void main()
{
pwm=100;
pwm2=100;
TMOD=0x11;
TH0=0xff; TL0=0x9c;
TH1=0xff; TL1=0x9c;
EA=1;
ET0=1; ET1=1;
TR0=1;
while(1)
{
keyscan();
}
}
void time0() interrupt 1
{
static uchar kk;
TH0=0xff;
TL0=0x9c;
TR1=1;
kk=pwm;
if(kk>=30)
{
TR1=0;
P1=0x00;
}
}
void time1() interrupt 3
{
static uchar tt;
TH1=0xff;
TL1=0x9c;
tt=pwm2;
if(tt>=50)
{
TR1=0;
P1=0xff;
}
}
void keyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
pwm2=pwm2-1;
pwm =pwm+1;
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
pwm2=pwm2+1;
pwm =pwm-1;
}
}
}
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
再把上面復制進去看一下!
❹ 51單片機輸出pwm波控制led燈亮度
頻率50HZ,周期是20ms
看你調節的精度 如定時器定時1ms,高電平寬度一次變化是5%
如果想要調節精度高,定時器定時時間小,就要頻繁地發生中斷,會影響主程序的運行
如 要求占空比每步調節為1%,則定時器就要定時200us,對於CpU的影響就比較大了
這時自動重裝模式可以縮短中斷程序佔用時間,但如果再提高PWM的頻率,自動重裝模式也十分吃力,因此許多增強型51單片機有硬體PWM功能
❺ 關於單片機PWM控制24V LED光源
右圖中的兩個二極體是PN結反向保護二極體,防止控制電壓反向電壓太高損毀三極體;右上角的三極體是大電流功率開關管,相當於一個高速運動的開關,你的PWM就是通過它實現的!!
這個兩個圖完全能滿足你的應用要求!!
❻ 如何利用51單片機PWM控制,讓LED呈現「呼吸效果」
每隔一段時間改變一下占空比,比如減小的話就能看到led漸漸熄滅了。同理增加的話就漸漸變亮。重復這個過程就可以看到呼吸效果。
❼ 單片機PWM控制LED亮度
【1】任何一款單片機都能輸出PWM波,即脈沖寬度調制器。用定時器即可輸出占空比變化的方波。
【2】LED亮度調節,首先應當明確LED的伏安特性曲線。還要知道項目中有沒有多基色要求、LED燈數量、它們的連接方式。
【3】用PWM控制,應該控制的實際LED驅動電路為恆壓驅動方式。
【4】以最簡單的單個LED亮度調節為例,一個PNP三極體和基極電阻就搞定了。先根據伏安特性,確定一個最大工作電壓和電流點。用對應的電阻串接直流電流表代替LED做實驗。產生的方波最小占空比為工作電壓(如2.0V)除以電源電壓(如5.0V)。控制方波,用示波器、電流表檢驗調節情況。最後用LED代換。為防止單片機方波失效燒壞LED,後期增加限流電路(如5mA恆流源)保護LED。
❽ 如何用PIC單片機的PWM功能來控制LED的亮度
第一,要理解中斷在這里的作用是固定的「一小段」時間進入一次。 第二,PWM_ON在程序中的作用很大,它會由0------>CYCLE------>0並且一直循環下去。可以把它看成一個有規律的變化的量。 第三,每進入中斷一次count++,滿足條件count==PWM_ON或coun..
❾ 求單片機 pwm 控制led調光程序
CYCLE=10;在初始化中,在程序中不會改變;pwm周期
PWM_ON只在主循環來改變;延時程序很長delay(1000); 中斷函數執行很多次,第一次count=0時,就把led滅了,當PWM_ON=2時,有了亮度,此亮度保持到,PWM_ON=2,加亮,直到PWM_ON=10,最亮,開始執行變暗程序。