如何用单片机产生PWM

 我来答
aidby2004
2010-04-21 · TA获得超过872个赞
知道小有建树答主
回答量:284
采纳率:0%
帮助的人:124万
展开全部
/*---------------
文件名称: PWM.C
功能 :单片机脉冲方式产生PWM信号
----------------*/
#include <reg52.h> // 引用标准库的头文件
#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define COUNT0 XBYTE [0X0000] // 8254计数器0寄存器地址
#define COUNT1 XBYTE [0X0200] // 8254计数器1寄存器地址
#define COUNT2 XBYTE [0X0400] // 8254计数器2寄存器地址
#define COMWORD XBYTE [0X0600] // 8254控制寄存器地址

/********************************
函数名称: SIGNAL(SIG_OUTPUT_COMPARE1A)
功能 :定时器0中断子程序
入口参数:无
返回值 :无
********************************/
void time0_int () interrupt 1 using 1
{
TR0=0; // 关闭T0
TH0=-(20000/256);
TL0=-(20000%256); //重置20ms计数值
/*--------------用8254计数器发送第一路的PWM信号-----------*/
COMWORD=0x30; //1MHz时钟作为计数时钟,计数1000次后实现1ms高电平
COUNT0=0xE0;
COUNT1=0x03;
/*--------------用8254发送第二路的PWM信号----------------*/
COMWORD=0x70; //1MHz时钟作为计数时钟,计数2000次后实现2ms高电平
COUNT0=0xD0;
COUNT1=0x07;
/*-------------用8254发送第三路的PWM信号----------------*/
COMWORD=0xB0;//1MHz时钟作为计数时钟,计数3000次后实现32ms高电平
COUNT0=0xB0;
COUNT1=0x0B;
TR0=1; //启动T0
}
//主函数
void main ()
{
EA=1; // 开CPU总中断
ET0=1; // 开T0定时器中断
TMOD=0x01; // 开定时器中断
TH0=-(20000/256); //20ms定时器计数初值
TL0=-(20000%256);
/*--------------向8254控制寄存器选择计数器0,并对其赋值0-----------------*/
COMWORD=0x30;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
/*---------------向8254控制寄存器选择计数器1,并对其赋值0------------------*/
COMWORD=0x70;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
/*---------------向8254控制寄存器选择计数器2,并对其赋值0-----------------*/
COMWORD=0xB0;
COUNT0=0; //赋低位字节
COUNT0=0; //赋高位字节
TR0=1; //启动定时器0
While (1); //无限次循环
}
铁书包
2010-04-21 · TA获得超过433个赞
知道小有建树答主
回答量:366
采纳率:0%
帮助的人:143万
展开全部
就是定时器输出脉冲,频率由写入的到寄存器的值确定 输出频率=定时器工作频率/定时器寄存器的值
当然如果是avr的单片机就不是这样算了,要看工作在什么模式下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式