導航:首頁 > 操作系統 > 51單片機pwm

51單片機pwm

發布時間:2022-05-06 17:08:58

① 求詳細解釋這個51單片機PWM波原理

這個程序每一條語句你肯定能看懂,給你加註釋沒有必要,給你講講PWM的原理,你再對照程序看就明白了
你要用51產生PWM去控制LED,首先你要確定PWM的周期T和占空比D,確定了這些以後,你可以用定時器產生一個時間基準t,比如定時器溢出n次的時間是PWM的高電平的時間,則D*T=n*t,類似的可以求出PWM低電平時間需要多少個時間基準n'
那麼你就可以編寫程序,根據你定的時間基準
t
去給定時器賦值初始化,然後開啟定時器,定義一個標志位flag,根據flag的狀態決定輸出高平還是低電平,假設定義flag=1的時候輸出高電平,用一個變數去記錄定時器中斷的次數,每次中斷就讓記錄中斷次數的變數+1,在中斷程序裡面判斷這個變數的值是否到了
n
,如果到了說明高電平的時間夠了,那麼就改變flag為0,輸出低電平,同時記錄中斷變數的值清零,每次中斷的時候依舊+1,根據flag=0的情況跳去判斷記錄變數的值是否到了
n'
如果到了,說明PWM的低電平時間夠了,那麼就改flag=1,輸出改高電平,同時記錄次數變數清零,重新開始,如此循環便可得到你想要的PWM波形。

② 怎麼用51單片機設定pwm的輸出頻率麻煩具體說明

這個實現起來豐儉由人,可以有三種辦法:
1,軟體定時,一段時間輸出高,一段時間輸出低,加起來就是PWM周期;
2,用硬體定時器代替軟體定時,會准確,原理還是一樣的;
3,帶有PCC、TIM等高級專用計數器的,設置好寄存器之後,自動出來想要的頻率和占空比,又准確又省心,頻率還可以很高;
具體到單片機型號,可以找廠商的應用筆記,源代碼的有。

③ 51單片機pwm問題

你這個只是輸出一個方波而已,占空比50%,就是用的定時器中斷,你上面的說的50ms定時,每中斷一次就取反一次P12,這樣就實現了簡單的PWM,真正的PWM占空比是可調的,如果中斷函數改成這樣,就可以看到PWM占空比的變化了
void int1() interrupt 1
{
static unsigned short temp=0x4c01;
TR1=0; //停止計數
TL1=temp%256;
TH1=temp/256;
TR1=1; //開始計數
temp++;
P12=k;
k=~k;
}

④ 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單片機PWM

#include <stc51.h>
int X ; // PWM的周期 單位:us微秒
int ty; //占空比變數
void main()
{
X=2000; //周期100uS 即PWM的頻率=10KHZ
ty=50; //占空比 50%
TMOD=0X11;
EA=1;
ET0=1;
ET1=1;
TH0=(65535-ty)/256; //定時器0 改變占空比
TL0=(65535-ty)%256;
TH1=(65535-X)/256 ; //定時器1 改變頻率
TL1=(65535-X)%256;
TR0=1;
TR1=1;
while(1) ;
}
void timer0_isr() interrupt 1 //定時器0;改變占空比
{
TR0=0;
P1=0X00;
++ty;
if(ty>=X-1) ty=1;
}
void timer1_isr() interrupt 3 //定時器1 ;改變PWM頻率 即周期
{
P1=0XFF;
TH1=(65535-X)/256; //改變周期
TL1=(65535-X)%256;
TH0=(65535-ty)/256; //改變占空比
TL0=(65535-ty)%256;
TR0=1;
//TR1=1;
}

⑥ 關於用51單片機產生pwm

#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多。

⑦ 如何利用51單片機輸出PWM波

用兩個定時器的方法是用定時器T0來控制頻率,定時器T1來控制占空比。大致的的編程思路是這樣的:T0定時器中斷讓一個I0口輸出高電平,在這個定時器T0的中斷當中起動定時器T1,而這個T1是讓IO口輸出低電平,這樣改變定時器T0的初值就可以改變頻率,改變定時器T1的初值就可以改變占空比。
用一個定時器時(如定時器T0),首先你要確定PWM的周期T和占空比D,確定了這些以後,你可以用定時器產生一個時間基準t,比如定時器溢出n次的時間是PWM的高電平的時間,則D*T=n*t,類似的可以求出PWM低電平時間需要多少個時間基準n'。
因為這里我們是產生周期為1ms(1000HZ)的PWM,所以可設置中斷的時間基準為0.01ms,,然後中斷100次即為1ms。在中斷子程序內,可設置一個變數如time,在中斷子程序內,有三條重要的語句:1、當time>=100時,time清零(此語句保證頻率為1000HZ),2、當time>n時(n應該在0-100之間變化開),讓單片相應的I/O口輸出高電平,當time<n時,讓單片相應的I/O口輸出低電平,此時占空比就為%n。

⑧ 51單片機實現pwm對電機調速

可以用一個定時器實現,也可以用兩個定時器實現
一個定時器實現辦法,如定時器定時50US中斷一次,中斷100次是5ms,即PWM的周期
每次中斷,變數a加1,並且a與另一變數b比較,如果a<b,讓某一管腳輸出高電平,如果a>=b,則讓其輸出低電平,a等於100時清0,這樣占空比是b/100,改變b的值,就可以改變占空比 缺點定時器定時時間不能太短,例如10us中斷程序根本執行不完,若占空比調節精度要求較高,如要求百分之一,則a需大於100,這樣PWM波的周期就比較大,頻率比較低
兩個定時器,如一個定時器0定時100us,另外一個定時器1定時小於100us,如b us
定時器0中斷時輸出高電平,並打開定時器1,定時器1負責置低電平
這樣,就可以產生周期100us,占空比是b/100的方波
頻率可以比用一個定時器高一些

⑨ 51單片機是如何產生PWM波的

主要通過一個定時器和一個IO口來實現PWM的輸出。
在一個周期裡面,首先讓IO口輸出高電平,並定時一定的時間
然後再將IO口輸出低電平,定時一定的時間。
然後在while裡面循環輸出即可。
需要改變占空比的話就改變高電平的時間與低電平的時間比。

⑩ 帶pwm的51單片機有哪些

1、建議採用stc的pwm單片機,可以直接上他的官方網站查詢,網路宏晶就可以了。

2、如果你需要的pwm信號要求不是很高的話,可以直接採用普通51單片機的定時器模擬pwm信號,可供選擇的有調寬和調頻,建議使用調寬,具體思路如下:定時器產生一個中斷時間基準,定義這個時間基準100次為頻率,高低電平的寬度就是你自己定義的了好比一個20一個80那麼占空比就是1:4。這些參數都是你設定的,定下你的定時器中斷時間基準就可以了。

3、一般51系列帶的pwm都很普通,所以個人認為模擬的也夠用了,不過stc的幾款片子的pwm還可以,支持16位高速模式。

4、常在線,不明白的hi我

閱讀全文

與51單片機pwm相關的資料

熱點內容
程序員生產智能創意 瀏覽:65
匯和銀行app怎麼登錄 瀏覽:379
騰訊伺服器如何上傳源碼 瀏覽:739
單片機的原理概述 瀏覽:508
火控pdf 瀏覽:267
如何復制雲伺服器centos環境 瀏覽:984
債權pdf 瀏覽:299
紅色番字的app怎麼下載 瀏覽:876
雲伺服器流程教課 瀏覽:702
中國農業銀行app怎麼沒有網 瀏覽:997
幾率表演算法 瀏覽:902
程序員理工科 瀏覽:708
企業郵箱登錄收件伺服器地址 瀏覽:558
計算機思維與演算法設計的重要性 瀏覽:664
linux刷新磁碟命令 瀏覽:76
我的世界如何查看伺服器種子pc 瀏覽:284
linuxlamp編譯安裝 瀏覽:609
枚舉演算法ppt 瀏覽:184
cmd查看進程命令 瀏覽:956
手機內怎麼刪除APP 瀏覽:834