1樓:
咱空比調節. 首先確定你的控制週期.比如1s,按照10級別可調,分為1-10 .1級的意思是
亮100ms 暗900ms,(1s也就是1000ms),也就是佔空比為10%,
2級,20%,亮200ms,暗800ms,......
同理9級, 亮900ms,暗100ms;
10級,亮1000ms,暗0ms;
寫出程式很簡單,
點亮程式
while(1)
設定程式;
#define add 0
#define dec 1
void tune_led( u08 add_or_dec )else
off_ms =1000-on_ms;
},需要調節時,可以把此函式在按鍵處理或其他事件處理中呼叫.
1000ms的週期只是一種舉例,根據實際需要可以調節 根據顯示的現實性,可以改到50-20ms左右,
防止產生閃爍,
如果改用微控制器的硬體pwm 那就更加簡單了
如何用微控制器控制led燈的亮度,不要pwm波的程式
2樓:創e生活
//程式名稱:一隻按鍵控制兩隻led燈十種亮度顯示//程式設計人:xx
//備註:此程式簡單
#include
sbit d1=p1^7;、、 //定義led燈1sbit d2=p1^6; //定義led燈2sbit key1=p3^0; //定義按鍵燈void delay(unsigned int a)}void main()
while(key1==0); 判//判斷按鍵是否鬆開if(d==10)d=0; //按鍵9種亮度判斷,是否是第9種,如果是,則d=0
for(c=0;c<2;c++)}}
、//2010.10.05 20;06修改//此程式是我寫的簡單程式,已做過實驗,並且通過!
3樓:匿名使用者
電路確定的話,一般的電路就只能用pwm波點亮led實現了,控制頻率實現亮度的控制。為什麼不用呢?
4樓:匿名使用者
那就只能使用dac或者電阻網路了,沒辦法!
51微控制器如何用一個按鍵和一個定時器來模擬pwm控制一個led燈的亮度??
5樓:糊塗伊人笑
使用定時器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(timemultiple2flag)
} void main() //測試
initt0(1,pwm_keychange,grading);
}} else if(0==keys4)
initt0(1,pwm_keychange,grading); //佔空比減小
} }
else
}} c**
#ifndef _my51_h
#define _my51_h
#include
//#include
#include
#include
#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< #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 if(0==t_multiple2) //0倍的基準時間是不合理的,至少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定時器中斷函式 if(++t0intcouts2==timemultiple2) //判斷是否複用定時器 t0_work(); //呼叫工作函式} 51微控制器輸出pwm波控制led燈亮度 6樓:匿名使用者 頻率50hz,週期是20ms 看你調節的精度 如定時器定時1ms,高電平寬度一次變化是5%如果想要調節精度高,定時器定時時間小,就要頻繁地發生中斷,會影響主程式的執行 如 要求佔空比每步調節為1%,則定時器就要定時200us,對於cpu的影響就比較大了 這時自動重灌模式可以縮短中斷程式佔用時間,但如果再提高pwm的頻率,自動重灌模式也十分吃力,因此許多增強型51微控制器有硬體pwm功能 回卜去的 include define uchar unsigned char define uint unsigned intuchar a,b,c,d void delay void anjian if p1 1 0 if p1 2 0 if p1 3 0 void main 伊瑩玉 inclu... 帝都小女子 org 0000h jmp start start mov sp,60h mov r2,20h mov r3,34h mov a,99h lcall bhd lcall hbd nopnop 三位元組除以單位元組子程式 入口條件 被除數在r3 r4 r5中,除數在r7中。出口資訊 ov ... 看lcd的介面情況,並口需要資料線8位 片選 讀使能 寫使能等。如果lcd為串列埠,資料線1,資料同步時鐘1,片選1。使用定時器,啟動定時滾屏動作 如果lcd支援滾屏,只要重新整理一行即可。否則,只能重畫了 16 16顯示一個漢字,向左移動 只能顯示8個漢字,受8位控制 資源分析 r0指向資料快取地...求用c語言程式設計實現51微控制器的led燈移動
微控制器乘法的實現
微控制器lcd實現滾屏