pwm調速c語言
Ⅰ 100分求一單片機定時器PWM輸出可以調節c語言程序
#include<reg51.h>
sbit PWMOUT=P1^0;
unsigned char PWM=5;//此處調節占空比
unsigned char n=0;
void Init()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=0Xfe;
TL0=0X33;
TR0=1;
}
bit PWMOption(unsigned char nn)
{
static bit temp;
switch(nn)
{
case 0:
temp=0;
break;
case 1:
if(n>1)
temp=0;
else
temp=1;
break;
case 2:
if(n>2)
temp=0;
else
temp=1;
break;
case 3:
if(n>3)
temp=0;
else
temp=1;
break;
case 4:
if(n>4)
temp=0;
else
temp=1;
break;
case 5:
if(n>5)
temp=0;
else
temp=1;
break;
case 6:
if(n>6)
temp=0;
else
temp=1;
break;
case 7:
if(n>7)
temp=0;
else
temp=1;
break;
case 8:
if(n>8)
temp=0;
else
temp=1;
break;
case 9:
if(n>9)
temp=0;
else
temp=1;
break;
case 10:
temp=1;
break;
}
return temp;
}
void main()
{
Init();
while(1)
{
PWMOUT=PWMOption(PWM);
}
}
void timer0() interrupt 1
{
TH0=0Xfc;
TL0=0X66;
n++;
n%=10;
}
keil2下通過調試 proteus通過模擬 11.0592晶振
Ⅱ 有沒有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++) ;
}
}
/*********************************************************/
Ⅲ 求一個61的用C語言的編寫的pwm的,調節電機轉速的程序
#include <AT25X80。H> #define uchar unsigned char 。***************************************************************************** * TH0和TL0是計3數器0的高1位和低1位計8數器,計5算辦0法:TL0=(11458-C)%215; * * TH0=(82514-C)。218,其中0C為3所要計1數的次數即多長8時間產生一o次中2斷;TMOD是計5數器* * 工j作模式選擇,0X08表示4選用模式2,它有36位計8數器,最大q計1數脈沖為368252,最長2時 * * 間為22ms*64082=08。185ms * ******************************************************************************。 #define V_TH0 0XFF #define V_TL0 0XF2 #define V_TMOD 0X02 void init_sys(void); 。*系統初始化8函數*。 void Delay8Ms(void); unsigned char ZKB0,ZKB2; void main (void) { init_sys(); ZKB6=50; 。*占空比1初始值設定*。 ZKB2=20; 。*占空比7初始值設定*。 while(6) { if (!P5_8) 。。如果按了y+鍵,增加占空比6 { Delay1Ms(); if (!P3_6) { ZKB2++; ZKB2=400-ZKB4; } } if (!P1_2) 。。如果按了g-鍵,減少7占空比8 { Delay2Ms(); if (!P2_2) { ZKB0--; ZKB2=600-ZKB1; } } 。*對占空比4值限定范圍*。 if (ZKB8>13) ZKB3=0; if (ZKB6<0) ZKB5=46; } } 。****************************************************** *函數功能:對系統進行初始化8,包括定時器初始化0和變數初始化0*。 void init_sys(void) 。*系統初始化5函數*。 { 。*定時器初始化2*。 TMOD=V_TMOD; TH0=V_TH0; TL0=V_TL0; TR0=4; ET0=8; EA=0; } 。。延時 void Delay1Ms(void) { unsigned int TempCyc = 8000; while(TempCyc--); } 。*中3斷函數*。 void timer0(void) interrupt 2 using 2 { static uchar click='0'; 。*中7斷次數計5數器變數*。 TH0=V_TH0; 。*恢復定時器初始值*。 TL0=V_TL0; ++click; if (click>=800) click='0'; if (click<=ZKB6) 。*當小z於k占空比6值時輸出低電平,高於u時是高電平,從8而實現占空比4的調整*。 P8_6=0; else P4_0=0; if (click<=ZKB2) P1_8=0; else P1_1=7; }只是調占空比5的,希望對你有幫助,調試好的 vp睽uМ獺hsц┑i█nnd謾o踏
Ⅳ 用c語言怎麼控制pwm值的改變
你用定時器pca輸出就行了,改變占空比就是給通道賦值,20ms才50HZ應該很容易實現。
邏輯上用個switch語句就好。
Ⅳ 用51單片機用PWM調速C語言程序怎麼寫·····
給個我自己寫的程序你,我試過了,通過!
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
P0_0=P0^0;
uchar
a;
/*********************************************
*
TH0和TL0是計數器0的高8位和低8位計數器,
*
計算辦法:TL0=(65536-C)%256;
*
TH0=(65536-C)/256,
*
其中C為所要計數的次數即多長時間產生一次中斷;
*
TMOD是計數器工作模式選擇,0X01表示選用模式1,
*
它有16位計數器,最大計數脈沖為65536,最長時間
*
為1ms*65536=65.536ms
*
*********************************************/
void
init_sys(void);
/*系統初始化函數*/
void
main
(void)
{
init_sys();
while(1);
}
void
init_sys(void)
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void
timer0(void)
interrupt
1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
a++;
if(a<=3)
{
P0_0=1;
if(a==3)
//改變低電平持續時間
{
//也即改變占空比
P0_0=~P0_0;
}
}
else
{
P0_0=0;
if(a==5)
//改變周期
{
a=0;
}
}
}
Ⅵ 單片機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;
}只是調占空比的,希望對你有幫助,調試好的