CCAP1H = CCAP1L = 0xff;这有问题,这一句意思是P3.5输出的脉冲占空比是99%这样测量就感觉一直高电平,因为只有1%的低电平只有示波器能测出来。
CCAP1H = CCAP1L = 0x80;就是50%的占空比,CCAP1H = CCAP1L = 0x00;是1%的占空比
如果还不行,你把这句删掉试试看PCAPWM0 = 0x00;反正我没写这句能有波形
#includeat89x51.h
unsigned char PWM0=0x80,PWM1=0x80,PWM2=0x80;//PWM的百分比
void InitT0(void)
{
TMOD=0x02;//定时器0工作方式2 8位自动重装
TH0=0;//pwm频率为系统时钟/256
TL0=0;
TR0=1;//开始计时
ET0=1;//允许定时器中断
EA=1;//开启总中断
}
void main(void)
{
InitT0();//初始化T0定时器
while(1)
{
//添加处理代码
}
}
void Timer0(void) interrupt 1//用于PWM的定时器
{
static unsigned char counter=0;//记录中断次数
counter++;
if(counter = PWM0) P1_0 = 0; else P1_0 = 1;
if(counter = PWM1) P1_1 = 0; else P1_1 = 1;
if(counter = PWM2) P1_2 = 0; else P1_2 = 1;
}
串口还是P10?我下面贴出P10输出PWM的产生代码,希望对你能有帮助。
#include reg51.h
# t 10000/100 //修改10000更改周期 单位us T(us)=10^6/f(hz) 至少10000us
# Duty_cycle 10 ///更改此更改占空比 0-100
unsigned char percent=0;
sbit work_pin P1^0;
void Timer0Init() //定时器0初始化
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0xff;
TL0=0x9c;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void PWM_work() interrupt 1
{
TH0=0xff;
TL0=0c9c;
percent++;
if(percent=Duty_cycle*t/100)
{
work_pin=1;
if(percentt) percent=0;
}
else work_pin=0;
}
void main()
{
Timer0Init();
while(1);
}
如果用AVR单片机,只要配置好几个寄存器,那就搞定PWM了,非常简单的!比如Atmega8单片机,4MHz工作频率,在PB1输出90%,1KHz的PWM,PB2输出70%,1KHz的PWM:
PORTB=0x00;
DDRB=0x06;
TCCR1A=0xA2;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x01;
ICR1L=0xF4;
OCR1AH=0x01;
OCR1AL=0xC2;
OCR1BH=0x01;
OCR1BL=0x5E;
15-PWM调光
#includereg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void Delay(unsigned int t)
{
while(--t);
}
void main ( )
{
unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
while (1) //主循环
{
P2=0X00;
Delay(60000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOWCYCLE;PWM_LOW++)
{
P2=0XFF; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
P2=0X00; //熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
P2=0XFF;
for(PWM_LOW=CYCLE-1;PWM_LOW0;PWM_LOW--)
{ //与逐渐变亮相反的过程
P2=0XFF;
Delay(PWM_LOW);
P2=0X00;
Delay(CYCLE-PWM_LOW);
}
}
}
自己修改 可以改变占空比
#ifndef __PWM__H__
#define __PWM__H__
void pwm_ccp1(unsigned char a,unsigned char b);
void pwm_ccp2(unsigned char a,unsigned char b);
#endif
void pwm_ccp1(unsigned char a,unsigned char b) //左边PWM
//CCP1 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值)=b+1 us //pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
//pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
{ //ab时有最高转速
CCPR1L=a; //* 设置工作循环的高 8bit 为 a
CCP1CON=0X0C; //0000 1100 设置 CCP1 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP1IE=0;; //* 禁止总中断和外围中断 */
PR2=b; //* 设置 PWM 周期 */
TRISC2=0; //* 设置 RC2/CCP1 为输出 */
T2CON=0X04; //* 0000 1000前分频比为 1:1 ,后分频器1:2,打开 TMR2 ,同时输出 PWM 信号 */
}
void pwm_ccp2(unsigned char a,unsigned char b) //右边PWM
//CCP2 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值),
//pwm高电平=a:CCP2CON(第四五位)Tosc*(TMR2前分频值)
{
CCPR2L=a; //* 设置工作循环的高 8bit 为 a
CCP2CON=0X0C; //* 设置 CCP2 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP2IE=0; //* 中断屏蔽
PR2=b; //* 设置 PWM 周期 */
TRISC1=0; //* 设置 RC1/CCP2 为输出 */
T2CON=0X04; //* 前分频比为 1 ,打开 TMR2 ,同时输出 PWM 信号 */
}
单片机pwm输出代码的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机pwm输出代码