#include <intrins.h>
unsigned char tmp;
sbit led0=P0^0; //指示灯0
sbit led1=P0^1; //指示灯1
sbit led2=P0^2; //指示灯2
unsigned long PeriodCnt = 0; //PWM 周期计数值
unsigned char HighRH = 0; //高电平重载值的高字节
unsigned char HighRL = 0; //高电平重载值的低字节
unsigned char LowRH = 0; //低电平重载值的高字节
unsigned char LowRL = 0; //低电平重载值的低字节
unsigned char T1RH = 0; //T1 重载值的高字节
unsigned char T1RL = 0; //T1 重载值的低字节
void ConfigPWM(unsigned int fr, unsigned char dc);
void init(); //串口初始化
void main()
{
init();
while(1)
{
if(RI==1) //是否有数据到来
{
RI = 0;
tmp = SBUF; //暂存接收到的数据
switch(tmp){
case'1': //前进
EA=1;
ConfigPWM(100, 10);
while(1);
break;
default: //停止
led0=1;
led1=1;
led2=1;
break;
}
}
}
void init() //串口初始化
{
ES=0; //关中断
SCON = 0x50; 位,1位停止位,无奇偶校验),波特率可变
TMOD = 0x20;
TH1=TL1=0xFD;
PCON &= 0x7f;
TR1 = 1;
TI=0;
RI=0;
ES=1;
}
/* 配置并启动 PWM,fr-频率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc){
unsigned int high, low;
unsigned long tmp;
tmp = (11059200/12) / fr; //计算一个周期所需的计数值
high = (tmp*dc) / 100; //计算高电平所需的计数值
low = tmp - high; //计算低电平所需的计数值
high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时
HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
LowRL = (unsigned char)low;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = HighRH; //加载 T0 重载值
TL0 = HighRL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
led0 = 0;
led1=0;
}
/* T0 中断服务函数,产生 PWM 输出 */
void InterruptTimer0() interrupt 1{
led2=0;
}