|
|
pwm.h的代碼如下:
#ifndef __PWM__
#define __PWM__
#define Timer0 0x8A //Timer 0的低字節(jié)
#define Timer1 0x8B //Timer 1的低字節(jié)
#define P1_0 0x01
#define P1_1 0x02
#define P1_2 0x04
#define P1_3 0x08
#define P1_4 0x10
#define P1_5 0x20
#define P1_6 0x40
#define P1_7 0x80
//對(duì)PWM函數(shù)參數(shù)判斷
#define IS_P1(Pin) ( ((Pin)==P1_0)|| \
((Pin)==P1_1)|| \
((Pin)==P1_2)|| \
((Pin)==P1_3)|| \
((Pin)==P1_4)|| \
((Pin)==P1_5)|| \
((Pin)==P1_6)|| \
((Pin)==P1_7) )
#define IS_Timer(Timer) ( ((Timer)==Timer0)|| \
((Timer)==Timer1) )
typedef unsigned char u8;
typedef int u16;
void pwm(u8 Pin,u8 Duty_cycle,u8 Timer);
#endif
pwm.c的代碼如下:
#include "pwm.h"
#include "reg52.h"
u8 g_Pin;
u8 g_Duty_cycle;
u8 g_Voltage;
u8 g_Count; //用于中斷計(jì)數(shù),控制占空比
//輸出周期為10ms,占空比可調(diào)的PWM波
//@param Pin:指定輸出PWM波的引腳,支持P1口的8個(gè)引腳,格式:P1_X
//@param: Duty_cycle:指定占空比,應(yīng)為從1-99的整數(shù)
//@param: Timer:指定使用Timer0或Timer1進(jìn)行定時(shí)
//@retval None
void pwm(u8 Pin,u8 Duty_cycle,u8 Timer)
{
//該函數(shù)開(kāi)啟相應(yīng)的定時(shí)計(jì)數(shù)器,完成相關(guān)初始化工作,最后由中斷服務(wù)函數(shù)完成PWM功能
if(!IS_P1(Pin))
return;
if(!IS_Timer(Timer))
return;
if(Duty_cycle>99 || Duty_cycle<1)
return;
g_Pin=Pin;
g_Duty_cycle=Duty_cycle;
if(Timer==Timer0)
{
//完成定時(shí)器的初始化
TH0=0xff;
TL0=0x9c; //設(shè)置初值為65436,每100us產(chǎn)生一次中斷
//啟動(dòng)Timer0及相應(yīng)中斷
IE|=0x82; //允許Timer0中斷
TMOD|=0x01;
TCON|=0x10; //開(kāi)啟Timer0
}
else
{
//完成定時(shí)器的初始化
TH1=0xff;
TL1=0x9c; //設(shè)置初值為65436,每100us產(chǎn)生一次中斷
//啟動(dòng)Timer1及相應(yīng)中斷
IE|=0x88; //允許Timer1中斷
TMOD|=0x10;
TCON|=0x40; //開(kāi)啟Timer1
}
g_Voltage=1;
P1|=Pin;//將相應(yīng)IO口設(shè)為高電平
g_Count=Duty_cycle;
}
void timer0() interrupt 1
{
TH0=0xff;
TL0=0x9c; //重新賦計(jì)數(shù)初值
g_Count--;
if(!g_Count)//計(jì)數(shù)器計(jì)數(shù)至0說(shuō)明電平需要發(fā)生翻轉(zhuǎn)
{
if(g_Voltage)//原來(lái)為高電平,翻轉(zhuǎn)為低電平
{
P1^=g_Pin; //相應(yīng)Pin翻轉(zhuǎn)電平
g_Voltage=0;
g_Count=100-g_Duty_cycle;
}
else//原來(lái)為低電平,再次翻轉(zhuǎn)為高電平
{
P1^=g_Pin; //相應(yīng)Pin翻轉(zhuǎn)電平
g_Voltage=1;
g_Count=g_Duty_cycle;
}
}
}
void timer1() interrupt 3
{
TH1=0xff;
TL1=0x9c; //重新賦計(jì)數(shù)初值
g_Count--;
if(!g_Count)//計(jì)數(shù)器計(jì)數(shù)至0說(shuō)明電平需要發(fā)生翻轉(zhuǎn)
{
if(g_Voltage)//原來(lái)為高電平,翻轉(zhuǎn)為低電平
{
P1^=g_Pin; //相應(yīng)Pin翻轉(zhuǎn)電平
g_Voltage=0;
g_Count=99-g_Duty_cycle;
}
else//原來(lái)為低電平,再次翻轉(zhuǎn)為高電平
{
P1^=g_Pin; //相應(yīng)Pin翻轉(zhuǎn)電平
g_Voltage=1;
g_Count=g_Duty_cycle;
}
}
} |
|