原创 C8051F410模拟产生PWM控制LED

2010-6-24 14:46 4302 10 10 分类: MCU/ 嵌入式

#include<c8051F410.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


#define  PWM_COUST 50                // PWM细分数
volatile unsigned char PWM_H;        // PWM占空比调节
volatile unsigned char PWM_CNT = 0;  // PWM自增值


/*******************************************************
/*系统时钟初始化
*******************************************************/
void SYSCLK_Init(void)

   OSCICN = 0x87;                     //24.5MHz    
   RSTSRC = 0x04;                     //使能丢失时钟监测器
}
/*******************************************************
/*端口定义
*******************************************************/
void Port_Init()
{
   P2MDOUT = 0xff;
   P1MDOUT = 0xff;
   XBR1 = 0x40;
}
/*******************************************************/
/*定时器0初始化
/*******************************************************/
void T0_Init()
{
  TMOD = 0x02;       //8位自动重载
  TH0  = 0xf0;
  TL0  = TH0;
  TR0  = 1;
  ET0  = 1;
  EA   = 1;
}
/*******************************************************/
/*定时器0中断服务程序.
/*PWM_CNT,用于计数,
/*1>、当计数到PWM_H时,LED亮.                   <高电平时间>
/*2>、当计数超过PWM_H时,而小于PWM_COUST时,灯灭 <低电平时间>
/*3>、占空比=高电平时间/总时间:PWM_CNT/PWM_COUST
/*******************************************************/
void T0_ISR() interrupt 1
{
 if(PWM_CNT <PWM_H)    //预设占空比输出
 {
  P1 = 0xff;           //开LED 
 }
 else
 {
  P1 = 0x00;           //关LED
 }
 if (PWM_CNT >= PWM_COUST)  //PWM计数清零,其中PWM_COUST为一个
 {
  PWM_CNT = 0;
 }
 else
 {
  PWM_CNT++;         //自增值加1
 }
}


void main()
{
  PCA0MD &= ~0x40;         //关闭看门狗
  SYSCLK_Init();
  Port_Init();
  T0_Init();
  PWM_H = 1;               //用于控制占空比
  while(1);
}

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条