當前位置:首頁 » 編程語言 » c語言pwm

c語言pwm

發布時間: 2022-04-27 07:34:09

❶ 51單片機測量PWM波的占空比的c語言程序

用定時器產生程序如下:
unsigned
int
a=0
,b=10;
void
main()
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
tr0=1;
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256
;
a++;
p1^1=0;
if(a=20)
{
a=0;
}
if(a=b)
{
p1^1=1;
}
}
調節a
,b的值即可調節占空比,程序框架就是這樣,具體自己改吧

❷ 有沒有51控制pwm的c語言程序

1、 利用定時器控制產生占空比可變的 PWM 波
按K1,PWM值增加,則占空比減小,電機減速。
按K2,PWM值減小,則占空比增加,電機加速。
當PWM值增加到最大值或減小到最小值時,蜂鳴器將報警。

2、常式:
/*********************************************************/

#include<reg51.h>
#include<intrins.h>

sbit K1 =P1^4 ; //PWM值增加鍵
sbit K2 =P1^5 ; //PWM值減少鍵
sbit BEEP =P3^7 ; //蜂鳴器
unsigned char PWM=0x7f ; //賦初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延時常數
TL0=0x66 ; //頻率調節

TH1=PWM ; //脈寬調節
TL1=0 ;

EA=1;
ET0=1;
ET1=1;

TR0=1 ;

while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);

do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}

/*********************************************************/
// 定時器0中斷服務程序 (頻率)
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //啟動輸出
}

/*********************************************************/
// 定時器1中斷服務程序 (脈寬)
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //結束輸出
}

/*********************************************************/
//蜂鳴器子程序
/*********************************************************/

void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //關閉蜂鳴器
delayms(100);
}

/*********************************************************/
// 延時子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}

/*********************************************************/
// 延時子程序
/*********************************************************/
void delayms(unsigned char ms)

{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

/*********************************************************/

❸ C語言讓STC單片機產生PWM信號。

#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt=0;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
cnt++;
if(cnt>100)cnt=0;
if(cnt<pwm)pluse=1;
else pluse=0;
}
main()
{
TMOD=0x02;
TH0=256-246; //改變該值可以改變頻率。
TL0=256-246;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
if(pwm<100)pwm++;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}

❹ 利用51單片機定時器產生PWM波的c語言程序,要求如下

#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
cnt++;
if(pwm>0)
{
if(cnt>100)cnt=0;
if(cnt<=pwm)pluse=1;
else pluse=0;
}
else pluse=0;
}
main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
pwm++;
if(pwm>100)pwm=100;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}

❺ 單片機C語言編程:用PWM控制直流電機轉速

#include <AT89X51.H>

#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是計數器0的高8位和低8位計數器,計算辦法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C為所要計數的次數即多長時間產生一次中斷;TMOD是計數器*
* 工作模式選擇,0X01表示選用模式1,它有16位計數器,最大計數脈沖為65536,最長時 *
* 間為1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01

void init_sys(void); /*系統初始化函數*/
void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值設定*/
ZKB2=70; /*占空比初始值設定*/
while(1)
{
if (!P1_1) //如果按了+鍵,增加占空比
{
Delay5Ms();
if (!P1_1)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}

if (!P1_2) //如果按了-鍵,減少佔空比
{
Delay5Ms();
if (!P1_2)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*對占空比值限定范圍*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}

/******************************************************
*函數功能:對系統進行初始化,包括定時器初始化和變數初始化*/
void init_sys(void) /*系統初始化函數*/
{
/*定時器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}

//延時
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}

/*中斷函數*/
void timer0(void) interrupt 1 using 2
{
static uchar click='0'; /*中斷次數計數器變數*/
TH0=V_TH0; /*恢復定時器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click='0';

if (click<=ZKB1) /*當小於占空比值時輸出低電平,高於時是高電平,從而實現占空比的調整*/
P1_3=0;
else
P1_3=1;

if (click<=ZKB2)
P1_4=0;
else
P1_4=1;

}只是調占空比的,希望對你有幫助,調試好的

❻ 請幫寫一段C語言的pwm固定輸出程序

/*s52,12M晶振,P30輸出PWM,P10按鍵控制輸出*/
#include<reg52.h>

sbit control=P1^0;
sbit pwm=P3^0;
void delay()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<112;j++);
}

main()
{
unsigned char flag=1;
TMOD=0x02; //定時器0方式2自動載入;
TH0=0xe3; //28us定時,即28us翻轉一次;周期為56us,頻率約為18K
TL0=0xe3;
EA=1;
ET0=1;
TR0=1;

while(1)
{
if(control==0)
{
delay();
if(control==0)
{
flag=~flag;

switch(flag)
{
case 0:TR0=0;EA=0;pwm=0;
break;
case 1:EA=1;TR0=1;
}
}
}while(control==0);
}

}
void timer0()interrupt 1
{
pwm=~pwm;
}

❼ 用C語言在設置單片機脈寬的時候應該怎樣設置成多個擋位的PWM

你是想用來調速的吧?

十個檔位分別對應電機的10個速度?

其實沒有那麼麻煩,你用定時器做一個固定的定時時間。

在中斷裡面,設置PWM占空比,也就是高低電平的比例。

voidTimer0_ISR(void)interrupt1
{
staticucharCount=0;
TH0=xx;
TL0=xx;//這個你自己定
Count++;
switch(Status)
{
case0:
if(Count<Duty0)IO=1;
elseif(Cont>100)Count=0;
elseIO=0;
break;
//其餘的9檔都一樣。
}
}

//Duty0是0檔的占空比,依次類推
//這樣,你只需改變Status的值,就可以改變PWM的占空比了。

❽ 用c語言怎麼控制pwm值的改變

你用定時器pca輸出就行了,改變占空比就是給通道賦值,20ms才50HZ應該很容易實現。
邏輯上用個switch語句就好。

❾ 單片機C語言PWM的典型程序謝謝

/ 利用定時器控制產生占空比可變的 PWM 波
// 按K1,PWM值增加,則占空比減小,電機減速。
// 按K2,PWM值減小,則占空比增加,電機加速。
// 當PWM值增加到最大值或減小到最小值時,蜂鳴器將報警。

/*********************************************************/

#include<reg51.h>
#include<intrins.h>

sbit K1 =P1^4 ; //PWM值增加鍵
sbit K2 =P1^5 ; //PWM值減少鍵
sbit BEEP =P3^7 ; //蜂鳴器
unsigned char PWM=0x7f ; //賦初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延時常數
TL0=0x66 ; //頻率調節

TH1=PWM ; //脈寬調節
TL1=0 ;

EA=1;
ET0=1;
ET1=1;

TR0=1 ;

while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);

do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}

/*********************************************************/
// 定時器0中斷服務程序 (頻率)
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //啟動輸出
}

/*********************************************************/
// 定時器1中斷服務程序 (脈寬)
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //結束輸出
}

/*********************************************************/
//蜂鳴器子程序
/*********************************************************/

void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //關閉蜂鳴器
delayms(100);
}

/*********************************************************/
// 延時子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}

/*********************************************************/
// 延時子程序
/*********************************************************/
void delayms(unsigned char ms)

{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

/*********************************************************/

❿ 用C語言實現:採用中斷方式,P1.0輸出脈沖寬度調制(PWM)信號,即脈沖頻率為2kHz,占空比為

/*用keil3與proteus7.4聯調,自己下載後開啟聯調設置,在proteus中畫個最小單片機系統,再用單片機連接keil的編譯文件.HEX即可。假設時鍾頻率12MHz,執行一條語句所用時間1us,2kHz為500us,即定時器頻率定時500us,如果用T0,則初值為TH0=0x1f,TL0=0x40;占空比7:10,脈沖寬度350us,用T1,初值TH1=0x15,TL1=0xe0。*/
#include<reg51.h>
sbit OUTW=P1^0;
void init()
{
EA=1;
TMOD=0x11;
ET0=1;
ET1=1;
TR0=1;
TR1=0;

OUTFW=0;
}

void main()
{
init();
while(1);
}

void timer0 interrupt 1
{
TH0=0x1f;
TL0=0x40;

TH1=0x15;
TL1=0xe0;

OUTW=1;

TR1=1;
}

void timer1 interrupt 3
{
OUTW=0;
TR1=0;
}
//注意:調頻就是在IO變數在不同的時間置1,調寬就是在不同的時間置0

熱點內容
同時修改多台伺服器管理地址工具 發布:2025-05-16 09:20:36 瀏覽:421
什麼配置就能玩地平線 發布:2025-05-16 09:13:46 瀏覽:82
python旋轉圖片 發布:2025-05-16 09:13:40 瀏覽:638
少女前線防檢測腳本 發布:2025-05-16 08:59:07 瀏覽:728
編譯器對系統的依賴 發布:2025-05-16 08:37:29 瀏覽:711
javamap數組 發布:2025-05-16 08:37:28 瀏覽:451
移動光貓如何自行修改密碼 發布:2025-05-16 08:20:15 瀏覽:125
作為基線存儲 發布:2025-05-16 08:15:22 瀏覽:859
安卓怎麼關閉手機應用推薦 發布:2025-05-16 08:03:38 瀏覽:930
sql內置函數 發布:2025-05-16 08:03:34 瀏覽:923