#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条评论)
登录后参与讨论