89C52微控制器怎麼通過按鍵產生PWM訊號來控制LED燈的不

2021-05-19 06:25:40 字數 5744 閱讀 8280

1樓:蠍

用幾個變數表示按鍵的按下/鬆開狀態,然後用定時器中斷設定pwm的頻率,例如要50hz的頻率,那麼定時器中斷週期(pwm週期的一半)可以設定為10ms,在中斷服務程式內根據按鍵的狀態確定是否需要對pwm輸出管腳進行翻轉。改方法可以輸出佔空比為50%的pwm訊號。

led是英文 light emitting diode (發光二極體)的縮寫,它的基本結構是一塊電致發光的半導體材料晶片,用銀膠或白膠固化到支架上,然後用銀線或金線連線晶片和電路板,然後四周用環氧樹脂密封,起到保護內部芯線的作用,最後安裝外殼,所以 led 燈的抗震效能好。運用領域涉及到手機、檯燈、家電等日常家電和機械生產方面。

2樓:匿名使用者

^#include

#define uchar unsigned char#define uint unsigned intsbit lamp=p2^0;//輸出

sbit k1=p3^3;//加鍵

sbit k2=p3^2;//減鍵

sbit k3=p3^4;//停止

uchar a=10;

void delay(uint x)//延時函式void init()

void key()

}// while(!k1);

if(!k2)

}// while(!k2);

if(!k3)

}while(!k3);

}void main() }

void timer0() interrupt 1 using 3

跪求一個 89c52微控制器通過按鍵產生pwm訊號來控制led燈的不同亮度的程式,

3樓:匿名使用者

#include

#define uchar unsigned char#define uint unsigned intsbit lamp=p2^0;//輸出

sbit k1=p3^3;//加鍵

sbit k2=p3^2;//減鍵

sbit k3=p3^4;//停止

uchar a=10;

void delay(uint x)//延時函式void init()

void key()

}// while(!k1);

if(!k2)

}// while(!k2);

if(!k3)

}while(!k3);

}void main() }

void timer0() interrupt 1 using 3

如何使mcs-51微控制器通過按鍵產生pwm訊號來控制led燈的不同亮度?

4樓:傾聽全職服務

可以設兩個按鍵,一個調亮一個調暗

用定時器就可以產生不同佔空比的pwm訊號,佔空比越高led越亮,佔空比越低就越暗

檢測兩個按鍵動作,然後調整pwm訊號的佔空比就行了

5樓:匿名使用者

比較簡單。就是使用加減按鍵,去控制你的p口得輸出頻率就好了啊。

6樓:匿名使用者

方法太多,最簡單的方法一個定時器就可以了,我記得我以前發表過。不用定時器也可以。

7樓:匿名使用者

用兩個定時器就可以,要的話hi我

8樓:匿名使用者

通過改變定時中斷時間改變pwm佔空比,來改變led亮度

51微控制器如何用一個按鍵和一個定時器來模擬pwm控制一個led燈的亮度??

9樓:糊塗伊人笑

使用定時器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(); //呼叫工作函式}

89C52微控制器怎麼點亮數碼管,89C52微控制器怎麼點亮8個數碼管

8個數碼管如果顯示不同內容,那麼一般需要動態掃描顯示,才能消耗最小的硬體資源。如果顯示同一個內容,那麼就直接送段碼,位控全開就可以了。89c52微控制器怎麼點亮8個數碼管?下面 為什麼就亮了3個 遇到相同的問題,我是這樣解決的 1 新增延時 2 在位選和段選開啟之前先賦值 以下是我的程式,僅供參考 ...

用89c52微控制器控制led流水燈的c語言程式

include define uchar unsigned charuchar led1,led2,led3,led4 void delay uchar a for num 0 num 5 num 32燈流水 火柴天堂作品 20130520 52微控制器,12mhz晶振,p0 p3 接32顆led,...

AT89C51微控制器和8051微控制器引腳是否相同?還有哪些相同點

相同,只不過at上多了一些第二功能 理論上是可以的,它包含了8051了。都是51系列的 我現在還用8031的原理相簿呢 肯定是可以的,沒有問題 at89c51微控制器和8051微控制器一樣嗎 mcs 51微控制器是指bai美國intel公司生產的一系列du微控制器的總稱。zhi這一系列包dao含80...