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;
}只是調占空比的,希望對你有幫助,調試好的
