C8051F120单片机产生PWM
答案:3 悬赏:80 手机版
解决时间 2021-12-03 18:15
- 提问者网友:了了无期
- 2021-12-02 22:03
C8051F120单片机产生PWM
最佳答案
- 五星知识达人网友:风格不统一
- 2021-12-02 22:47
1不用看门狗要使用软件禁止,WDTCN = 0xde;WDTCN = 0xad;不然单片机会一直复位,这个不知道你弄过没有。
2CEX0_Compare_Value = 65536 - 65536;这个你什么意思?想产生0%占空比的PWM?16位PWM不能产生0%占空比的PWM,想用可以通过禁用PWM实现,这个芯片资料中提到过。把CEX0_Compare_Value改成10000先试试.追问1看门狗在另一个模块关了
2这个问题,昨天我也试了,不行追答PCA0CN |= 0x40;允许PCA0运行
2CEX0_Compare_Value = 65536 - 65536;这个你什么意思?想产生0%占空比的PWM?16位PWM不能产生0%占空比的PWM,想用可以通过禁用PWM实现,这个芯片资料中提到过。把CEX0_Compare_Value改成10000先试试.追问1看门狗在另一个模块关了
2这个问题,昨天我也试了,不行追答PCA0CN |= 0x40;允许PCA0运行
全部回答
- 1楼网友:神也偏爱
- 2021-12-03 01:32
参考一下这个仿真实例,仿真试试。
- 2楼网友:过活
- 2021-12-03 00:10
C8051F120单片机产生PWM程序为:
olf2010-6-21 22:421#
//PWM输出脚P0.3
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include // SFR declarations
#include
#include
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void PORT_Init (void);
void PCA_Init (void);
void PCA_ISR (void);
void SYSCLK_Init (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
unsigned long b;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
PCA_Init ();
EIE1= 0x08;
EA=1;
PCA0CPH0=0x20;
while (1)
{ }
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x11; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x40; // XBAR2: Initial Reset Value
// Port configuration (1 = Push Pull Output)
PRT0CF = 0x08; // Output configuration for P0
PRT1CF = 0x00; // Output configuration for P1
PRT2CF = 0x00; // Output configuration for P2
PRT3CF = 0x00; // Output configuration for P3
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
unsigned int i; // delaynms counter
OSCXCN = 0x67; // start external oscillator with
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
}
//-----------------------------------------------------------------------------
// PCA_Init
//-----------------------------------------------------------------------------
void PCA_Init (void)
{
// PCA0CPM0 = 0x42; // PCA Capture/Compare Register 0
PCA0CN = 0x40;
PCA0CPM1 = 0x42;
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
// PCA0MD &= 0x40;
PCA0MD = 0x01;
}
//-----------------------------------------------------------------------------
// PCA_ISR
//-----------------------------------------------------------------------------
void PCA_ISR (void) interrupt 9
{ unsigned char a ;
bit PWM_PAC;
CF = 0;
if(PWM_PAC==0) //占空比由0 >>0xfe
{
PCA0CPH1=a;
a++;
if(a==0xfe){PWM_PAC=1;}
}
else //占空比由0xfe >>0
{
PCA0CPH1=a;
a--;
if(a==0){PWM_PAC=0;}
}
}
olf2010-6-21 22:421#
//PWM输出脚P0.3
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include // SFR declarations
#include
#include
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void PORT_Init (void);
void PCA_Init (void);
void PCA_ISR (void);
void SYSCLK_Init (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
unsigned long b;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
PCA_Init ();
EIE1= 0x08;
EA=1;
PCA0CPH0=0x20;
while (1)
{ }
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x11; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x40; // XBAR2: Initial Reset Value
// Port configuration (1 = Push Pull Output)
PRT0CF = 0x08; // Output configuration for P0
PRT1CF = 0x00; // Output configuration for P1
PRT2CF = 0x00; // Output configuration for P2
PRT3CF = 0x00; // Output configuration for P3
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
unsigned int i; // delaynms counter
OSCXCN = 0x67; // start external oscillator with
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
}
//-----------------------------------------------------------------------------
// PCA_Init
//-----------------------------------------------------------------------------
void PCA_Init (void)
{
// PCA0CPM0 = 0x42; // PCA Capture/Compare Register 0
PCA0CN = 0x40;
PCA0CPM1 = 0x42;
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
// PCA0MD &= 0x40;
PCA0MD = 0x01;
}
//-----------------------------------------------------------------------------
// PCA_ISR
//-----------------------------------------------------------------------------
void PCA_ISR (void) interrupt 9
{ unsigned char a ;
bit PWM_PAC;
CF = 0;
if(PWM_PAC==0) //占空比由0 >>0xfe
{
PCA0CPH1=a;
a++;
if(a==0xfe){PWM_PAC=1;}
}
else //占空比由0xfe >>0
{
PCA0CPH1=a;
a--;
if(a==0){PWM_PAC=0;}
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯