哈哈,你还真找对人了。看看下面的...//pwm_timer_b.h #ifndef __pwm_timer_b #define __pwm_timer_b void timerbinit(); void setscale(unsigned int sc); void setfre(unsigned int fre); unsigned char gopwm(unsigned char doit); #endif /******************************************************************************* 文件名:pwm_timer_b.c 编写者:czhang 描述:使用定时器b进行pwm输出。输出的频率和占空比由串行口发送来的指令确定。 版本: 1.0 2005-2-20 *******************************************************************************/ #include #include "pwm_timer_b.h" #define pwm_dir p4dir #define pwm_sel p4sel #define pwm_out p4out #define pwm_in p4in #define pwm_io bit1 unsigned int ifre; //频率 unsigned int iscale; //占空比 /***************************************************************************** 初始化定时器b *****************************************************************************/ void timerbinit() { tbctl = tbssel_1 + tbclr ; //时钟源为aclk tbcctl1 = outmod_7; //工作在复位/置位 模式 pwm_sel |= pwm_io; //选择输出端口的第二功能 pwm_dir |= pwm_io; } /***************************************************************************** 设置占空比 sc:要修改的占空比值 *****************************************************************************/ void setscale(unsigned int sc) { iscale=sc; } /***************************************************************************** 设置频率 fre:要修改的输出频率值 *****************************************************************************/ void setfre(unsigned int fre) { ifre=fre; } /***************************************************************************** 控制pwm运行或者停止 doit:0:停止 100:运行 其它:什么都不做,只返回运行状态 返回值:运行状态。 同doit的值 *****************************************************************************/ unsigned char gopwm(unsigned char doit) { tbctl &= ~(mc0+mc1); //关闭定时器 if(doit==100) { tbccr1=iscale; tbccr0=ifre; tbctl |= mc_2; //打开定时器,计数模式2 } if((tbctl&mc_0)==0) //判断pwm是否运行 return 0; else return 100; }