请教各位大哥,怎样用单片机的一个定时器在多个I/O口输出多个频率的PWM,占空比为50%。

功能:
1.单片机I/O口,P1.0~P1.5分别输出相应的频率的方波,占空比为50%,精确度0.01HZ,幅值4~4.8V。
2.用一个8为的定时器,频率分别为103HZ、45.9HZ、44.2HZ、34.4HZ、23HZ、11.5HZ。

第1个回答  2010-03-10
/*---------------
文件名称: 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); //无限次循环
}本回答被提问者采纳
第2个回答  2010-03-10
PWM是什么,定时器怎么使用,你搞清楚了没有?看看书吧。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网