導航:首頁 > 操作系統 > 51單片機調光程序

51單片機調光程序

發布時間:2022-05-30 00:47:11

單片機調光程序

//程序兩個按鍵接的是外部中斷0、1的輸入口,按下鍵就觸發相應的中斷
//變數和變暗是PWM來控制的,具體在定時中斷中說明
#include <reg51.h>

sbit K1 =P3^2 ; //亮度增加鍵
sbit K2 =P3^3 ; //亮度減少鍵

sbit led=P0^0;

bit t=0;
unsigned char zhankongbi=0;
unsigned char a=0;
void delay (unsigned char i);

void main ()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
TR0=1; //啟動定時器
ET0=1; //允許定時器0中斷
TMOD=0x02;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(1);

}

void delay (unsigned char i)
{
unsigned char a;
while(i--)
{
for(a=120;a>0;a--);
}

}

void zengjia () interrupt 0 // 變亮按鍵
{
if(K1==0)
{
delay (1);
if(K1==0)
{
t=1;
}
}
}

void jianshao () interrupt 2 // 變暗按鍵
{
if(K2==0)
{
delay (1);
if(K2==0)
{
t=0;
}
}
}

void time () interrupt 1
{

TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(t) //當按下變數按鍵時
{
a++;
if(a<=3)
{
led=1; //LED控制高電平為7毫秒
}
else if(a<=10)
{
led=0; //LED控制低電平為3毫秒
}
else if(a==11)
{
a=0;
}
}
else //當按下變暗鍵時
{
a++;
if(a<=7)
{
led=1; //LED控制高電平為3毫秒
}
else if(a<=10)
{
led=0; //LED控制低電平為7毫秒
}
else if(a==11)
{
a=0;
}
}
}
//可見變亮開關按下LED控制PWM脈寬比為7:3
//變暗開關按下LED控制PWM脈寬比為3:7
//這樣就達到了控制LED亮暗的目的,這個程序沒有實現亮到按的逐步變化。

Ⅱ 51單片機輸出pwm

15-PWM調光
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
void Delay(unsigned int t)
{
while(--t);
}
void main ( )
{
unsigned int CYCLE=600,PWM_LOW=0;//定義周期並賦值
while (1) //主循環
{
P2=0X00;
Delay(60000); //特意加延時,可以看到熄滅的過程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
P2=0XFF; //點亮LED
Delay(PWM_LOW);//延時長度,600次循環中從1加至599
P2=0X00; //熄滅LED
Delay(CYCLE-PWM_LOW);//延時長度,600次循環中從599減至1
}
P2=0XFF;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{ //與逐漸變亮相反的過程
P2=0XFF;
Delay(PWM_LOW);
P2=0X00;
Delay(CYCLE-PWM_LOW);
}
}
}
自己修改 可以改變占空比

Ⅲ 基於51單片機的可控硅調壓調光程序-帶過零檢測

程序:
#include<reg52.h>
#include<intrins.h>
sbitledRS=P1^0;
sbitledRW=P1^1;
sbit ledE=P1^2;
sbit keyjia=P2^7;
sbitkeyjian=P2^6;
sbitcontrolLD=P1^3;
bitflag1=1;
bitflag2=1;
unsigned
char code table[]=" guang liang
";
unsignedchar code table1[]=" 00 ";
intnum,flag=0,count=0;
charliang=3;
voiddelaykt(void) //導通延時
{
unsigned char a;
for(a=2;a>0;a--);
}
voiddelay(int z) //可調延時
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
delay9ms(void) //誤差
-0.43402777778us 延時9ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=224;b>0;b--)
for(a=17;a>0;a--);
}
voidwrite_com(unsigned com) //寫指令
{
ledRS=0;
P0=com;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_date(unsigned date) //寫數據
{
ledRS=1;
P0=date;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_liang(unsigned liang) //寫亮度
{
int shi,ge;
shi=(liang-3)/10;
ge=(liang-3)%10;
write_com(0x80+0x40+7);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit() //初始化
{
controlLD=1; //觸發控制初始化
ledRW=0; //液晶初始化
ledE=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delaykt();
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delaykt();
}
EA=1; //外部中斷設置
EX0=1;
IT0=1;
}
voidkeyscanf() //鍵盤判斷
{
if(keyjia==0) //加鍵判斷
{
delaykt();
if(keyjia==0)
{
if(flag1==1)
{
flag1=0;
liang++;
if(liang==10)
liang=3;
write_com(0x80+0x40+7);
write_liang(liang);
}
}
}
else if(keyjia!=0)
{
delaykt();
if(keyjia!=0)
flag1=1;
}
if(keyjian==0) //減鍵判斷
{
delaykt();
if(keyjian==0)
{
if(flag2==1)
{
flag2=0;
liang--;
if(liang==2)
liang=9;
write_com(0x80+0x40+7);
write_liang(liang);
}
}
}
else if(keyjian!=0)
{
delaykt();
if(keyjian!=0)
flag2=1;
}
}
voidzhongan() interrupt 0 //外部中斷
{
flag=1;
}
voidtimepd() //同步標志判斷與定時器設置
{
if(flag==1)
{
flag=0;
TMOD=0x01;
TH0=(65536-1000*(10-liang))/256;
TL0=(65536-1000*(10-liang))%256;
ET0=1;
TR0=1;
}
}
voidtime0() interrupt 1 //定時中斷程序
{
count=1;
}
voidchufa() //MOS3020觸發
{
if(count==1)
{
count=0;
controlLD=0;
delaykt();
controlLD=1;
delay9ms();
controlLD=0;
delaykt();
controlLD=1;
}
}
voidmain()
{
init();
while(1)
{
keyscanf();
timepd();
chufa();
}
}

Ⅳ 您好,我們是初學者,想編寫一個c程,輸出基於51單片機的能夠控制舵機的pwm信號,望您賜教!謝謝!

51單片機是5v 的,要控制舵機得用到繼電器,聲稱PWm波的程序給你粘一個:

#include <reg52.h>

sbit LED = P1^2;
unsigned char CYCLE; //定義周期 該數字X基準定時時間 如果是10 則周期是10 x 0.1ms
unsigned char PWM_ON ;//定義高電平時間
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
bit Flag;

TMOD |=0x01;//定時器設置 0.1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定時0.1mS
IE= 0x82; //打開中斷
TR0=1;

CYCLE = 10;// 時間可以調整 這個是10調整 8位PWM就是256步
while(!Flag)
{
delay(20000); //延時時間,從一個亮度到下一個亮度的間隔時間,速度快就能看到連續效果
PWM_ON++; //這個使用較長延時,以便能看清楚變化過程
if(PWM_ON == CYCLE)
{ //這個里可以添加其他程序 如到最亮時候控制設備
Flag=1;
}
}

while(Flag) //亮度遞減 同上,是個相反的過程
{
delay(20000);
PWM_ON--;
if(PWM_ON == 0)
{
Flag=0;
}
}
}
/********************************/
/* 定時中斷 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定時0.1mS

if (count==PWM_ON)
{
LED = 1; //燈滅
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右時間是0 保持原來狀態
LED = 0;//燈亮

}

}
這是用51單片機PWM 進行液晶調光的程序,你可以參考下!PWM波的頻率和占空比,通過設置定時期的值來確定。

Ⅳ 用51單片機 調光

你的電路構思不太好,目的一樣但是電路構成的方法有很多的,你這種辦法比較耗費元件,並且因為過多的原件而導致可靠性下降。實現你的要求有簡單的辦法,就是採用單片機產生可控的PWM(PWM(PulseWidthMolation)控制——脈沖寬度調制技術。通過對一系列脈沖的寬度進行調制,來等效地獲得所需要波形(含形狀和幅值)。)通過光電耦合隔離電路並經過驅動放大對雙向可控硅G極控制,可控硅和220v電源相連串在燈上。參考電路:

Ⅵ 高分懸賞:51單片機 程序分析,請求前輩的指導,

問題1:這個程序確實分了10段,初始時K=5,而J的值是反復從0到9在變化。當K=5,則在J=0-4期間輸出高電平,5-9期間輸出低電平
問題2:K=10和K=0這個確實是為了限制K的范圍,防止程序出現異常(當K成了負值,K就永遠不能大於J了,然後輸出一直是低電平;K大於9以後也是一樣的)
問題3:TH0和TL0等於多少與你的晶振頻率有關,這個是為了計算時間方便。比如用11.0592MHZ的晶振,定時器計滿一次用時(1/11059200)*12*256ms,計時滿1秒需要3600次定時器計滿。程序是取值56,然後還計時滿5000次,實際用時1秒。這個程序實際運行後LED燈估計能看到很明顯的閃爍。如果你想實現255級調光,這個程序不能勝任(我估計是按照書上套下來的程序,這個程序時間誤差很大)。其實我也自己寫有這種模擬PWM的程序,255級調光,其實很容易,自己多想想。建議:定時器中斷裡面只執行一個i++就可以了,剩下的事情全放到中斷外面執行(不僅是這個程序,以後寫別的程序也要盡量讓中斷裡面的程序盡可能的少,這樣CPU可以有時間多執行主程序,不影響程序整體的運行)

Ⅶ 51單片機PWM調光程序無法正常運行

http://..com/question/316661185

參考。

Ⅷ 51單片機 PWM LED 調光程序,請高人幫忙講一下執行過程,重點是CYCLE、PWM_ON是怎樣的變化的。

CYCLE=10;在初始化中,在程序中不會改變;pwm周期
PWM_ON只在主循環來改變;延時程序很長delay(1000); 中斷函數執行很多次,第一次count=0時,就把led滅了,當PWM_ON=2時,有了亮度,此亮度保持到,PWM_ON=2,加亮,直到PWM_ON=10,最亮,開始執行變暗程序。

Ⅸ 如何用51單片機產生pwm 並利用pwm控制led燈的功率

#include<reg52.h>
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
#define uint unsigned int
#define uchar unsigned char
uchar whith_p=50;
uchar max_p=255;
uchar min_p=1;
uint fre = 0xffff;
sbit CR = 0xDE;
sbit led = P2^0;
void timer0_int (void) interrupt 1 using 1
{
TH0 = fre >> 8;
TL0 = fre & 0xff;
led = ~led;
}
void timer0_init(void)
{
TMOD &= 0xf0;
TMOD |= 0x1;
TH0 = 0xff;
TL0 = 0xff;
TR0 = 1;
ET0 = 1;
}

void pwm_init(void)
{
CMOD = 0x4;
CL = 0x0;
CH = 0x0;
CCAP0H = whith_p;
CCAPM0 = 0x42;
CR = 1;
}

void soft_delay(uint _1ms)
{
unsigned int tmp;
while(_1ms--!=0) {
for(tmp=0;tmp<144;tmp++);
}
}
void pwm_out(void)
{
whith_p=50;
while(whith_p<max_p)
{ CCAP0H =whith_p;
soft_delay(10);
whith_p=whith_p+5;
CCAP0H = whith_p;
soft_delay(10);
}

whith_p=max_p;
while(min_p<whith_p)
{ CCAP0H = whith_p;
soft_delay(10);
whith_p=whith_p-5;
CCAP0H = whith_p;
soft_delay(10);
}

}

void main (void)
{
pwm_init();
timer0_init();
EA = 1;
while(1){
pwm_out();
}
}

STC單片機具有PWM輸出功能,最近玩12864LCD萬年歷時,用的是杜洋的FT4時鍾電路,用他提供的H文件控制時,具有調光功能,由於只是玩一玩,沒有購買源碼,而網上流行的程序都沒有此功能,無奈,只能自己弄,好在杜老師及人所及早在網站中備下了資料,簡單攢一下,居然成功了,並成功的匯入了萬年歷的程序中,現在將其改成完整的控製程序公開於此供參考。

/*************************************************
STC單片機單/雙鍵控制LED亮度PWM調光程序 原創WanNengGong 2010/09/20
參考程序: 杜洋工作室PWM功能程序模塊
*************************************************/
#include<STC12C5A60S2.H> //頭文件
#define uchar unsigned char
#define uint unsigned int
uchar vx=5;
//vx=5在用於12864LCD的LED背光調整時上電為半亮度狀態,可根據自己的用途及要求任意設定
sbit KEY_H=P2^4;
sbit KEY_L=P2^5;
/*******************************************************************************/
void PWM_init (void){//PWM初始化函數
CMOD=0x02; //設置PCA定時器
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM0設置PCA工作方式為PWM方式(0100 0010)
CCAP1L=0x00; //設置PWM0初始值與CCAP0H相同
CCAP1H=0x00; // PWM0初始時為0
CR=1; //啟動PCA定時器
}
/******************************************************************************/
void PWM0_set (uchar a){//PWM0占空比設置函數
CCAP1L=a; //設置值直接寫入CCAP1L
CCAP1H=a; //設置值直接寫入CCAP1H
}
/*****************************************************************************/
void DelayM(unsigned int a){//延時函數 1mS/次(用於1T單片機)
unsigned char n,i,j;
while(--a!=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
} }
/****************************************************************************/
void main(void)
{
KEY_H = 1;KEY_L = 1;
PWM_init ();
while(1)
{
PWM0_set(vx*24);
//數字24是配合vx調試取得的,此時vx的賦值范圍約為1-10對應最暗-最亮

//--------減調整---------//
if (KEY_L == 0 ){
DelayM(20); //延時20毫秒消抖動
if(KEY_L == 0){ //如果20SM後KEY_L還是0狀態則確認下調鍵是按下的
vx--;
if(vx<1){vx=5;}
//如果設定vx=10,將語句改為if(vx<1){vx=10;}則為單按鍵循環控制,則可去除加調整控制部分
}
while(KEY_L == 0);//等待鍵松開
}
//--------加調整---------//
if (KEY_H == 0 ){
DelayM(20);
if(KEY_H == 0){
vx++;
if(vx>10){vx=5;}
}
while(KEY_H == 0);
}
}
}

程序自己理解消化了,就可以編出你自己的程序了,你說的,完全可以實現,而且比這倆個例子簡單N多。
這是網路裡面別人的回答,感覺可以解決您單片機產生PWM的問題了,至於後面如何控制功率,那你就要搞清功率的單位是什麼,除了w,還有什麼,在時間一定的情況下,如何改變功率,只需要改變其PWM的占空比。如果一個周期裡面,它有50%是高電平,那麼它是正常輸入的50%的功率,如果只有20%呢,10%呢?這不就在改變其功率么?

閱讀全文

與51單片機調光程序相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:27
不能修改的pdf 瀏覽:751
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491