PWMPRCLK_PCKA = 0x2 /*16383000Hz/2=8192000Hz */
PWMPRCLK_PCKB = 0x2/*8192000Hz/4 =2048000Hz */
PWMCTL_CON01 = 0X1 /* 0 &1 成 16位精度PWM工作*/
PWMPOL_PPOL1 = 0x1 /搜碰* 极性为先高后低 与占空比芦亮相同 */
PWMCAE = 0x00 /* operate in left aligned output mode. */
}
void setPWM01(word per,byte start) {
per = (word)(2048000/per)
PWMPER01 = (word)per/* 设置脉世哗谈冲周期*/
PWMDTY01 = (word)(per/2)/* 设置脉冲占空比为50% */
if(start==1)PWME_PWME1 = 1 /* 脉冲发送开始*/
else PWME_PWME1 = 0 /* 脉冲停止发送*/
}
发脉冲时调用 setPWM01(频率,1)
voidmain(void)
//主函数
{
while(1)
{
temp=P2
temp=temp&0x07
//取出低三位
while(temp!=0x07)
{
init_sys()
PWM=1
}
}
}
还有可能就是你的定时器一直在跳中断,所以程序很难检测到按键。按键可以备芦用腊答
外部中断仿局带
来实现。
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 ()/*初始化I/O口*/
PCA_Init ()/游扒*PCA初始化成8位脉宽调置方式*/
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=0i <256i++) // 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}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)