c8051单片机输出PWM波形的频率怎么设定

我用的c8051f040单片机,想要编程实现PWM波形的输出,想请教PWM波的频率怎么编程设定,最好有程序,谢谢... 我用的c8051f040单片机,想要编程实现PWM波形的输出,想请教PWM波的频率怎么编程设定,最好有程序,谢谢 展开
 我来答
孔聆宇
推荐于2016-10-23 · 超过11用户采纳过TA的回答
知道答主
回答量:27
采纳率:0%
帮助的人:0
展开全部
具体可以使用三个方式,一个是通过DAC 进行对外输出PWM 或者通过PCA通过IO输出PWM的还可以直接用定时器来实现 程序我给你找找 我以前写过的
/*********************************************************************
* pca实现8位PWM
* * 编写环境KC3.0
* 作者:孔聆宇
***********************************************************************/
//--------------------------------------------------------------------
// PWM8_1.c
//--------------------------------------------------------------------
//
// AUTH: BW
//
//
//
// 说明
// 实现8位PWM的示例代码
// PCA被配置为8位PWM方式 使用SYSCLK/4作为时基信号
// <PWM>中保持着每256个计数周期内输出波形为低电平的PCA周期数
// 波形为高电平的时间占 256 - PWM 个周期
// 输出波形的占空度=(256 - PWM)/256
//
// 由于该8位PWM完全受硬件控制 不需要额外的CPU周期来维持固定的
// 占空度 在本例中 改变占空度只需要向模块的比较寄存器PCA0CP0H
// 的高字节写一个8位数
//
// 可以达到的占空度范围是0.38%(PCA0CP0H = 0xff)
// 到100%(PCA0CP0H = 0x00)
//

//--------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include <c8051f040.h> // SFR declarations

//-----------------------------------------------------------------------------
// Global Constants
//-----------------------------------------------------------------------------

#define SYSCLK 2211810 // Internal oscillator frequency in Hz

//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

void OSCILLATOR_Init (void);
void PORT_Init (void);
void PCA0_Init (void);

//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------

void main (void)
{
unsigned int delay_count;
bit duty_direction = 0;

WDTCN = 0xde;
WDTCN = 0xad;

PORT_Init ();
OSCILLATOR_Init ();
PCA0_Init ();
SFRPAGE = PCA0_PAGE;

while (1)
{

for (delay_count = 30000; delay_count > 0; delay_count--);

if (duty_direction == 1)
{

if ((PCA0CPM0 & 0x40) == 0x00)
{
PCA0CPM0 |= 0x40;
}
else
{
PCA0CPH0--;

if (PCA0CPH0 == 0x00)
{
duty_direction = 0;
}
}
}
else
{
if (PCA0CPH0 == 0xFF)
{
PCA0CPM0 &= ~0x40;
duty_direction = 1;
}
else
{
PCA0CPH0++;
}
}

};
}

void OSCILLATOR_Init (void)
{
char SFRPAGE_save = SFRPAGE;

SFRPAGE = CONFIG_PAGE;

OSCICN = 0x83;

CLKSEL = 0x00;

SFRPAGE = SFRPAGE_save;
}

void PORT_Init (void)
{
char SFRPAGE_save = SFRPAGE;

SFRPAGE = CONFIG_PAGE;

XBR0 = 0x08;
XBR1 = 0x00;
XBR2 = 0x40;

P0MDOUT |= 0x01;

SFRPAGE = SFRPAGE_save;

}
void PCA0_Init (void)
{
char SFRPAGE_save = SFRPAGE;
SFRPAGE = PCA0_PAGE;

PCA0CN = 0x00;
PCA0MD = 0x08;

PCA0CPM0 = 0x42;

PCA0CPH0 = 256 - (256 * 0.5);

CR = 1;
SFRPAGE = SFRPAGE_save;
}

太多还有其他的写不下 这是比较简单的一种。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式