#include "reg52.h"
#include "uart.h"
#define led P2 //电机状态显示
#define duty_cycle_init 20 //定义初始占空比
#define speed_step 5 //调速步长(16步)
sbit pwm=P1^0; //定义PWM端口
static uchar duty_cycle=0; //占空比
uchar count=0; //计次
uchar dat; //串口接收的数据
void delay10ms(int x) //@11.0592MHz
{
while(x--)
{
unsigned char i, j;
_nop_();
_nop_();
i = 19;
j = 19;
do
{
while (--j);
} while (--i);
}
}
/*串口接收数据,接收到相应数据电机动作*/
void uart() interrupt 4 //串口通信中断函数
{
if(RI==1)
{
dat=SBUF; //存储接收到的数据
RI=0;
switch (dat)
{
case 0x00: motor_speed_start();break; //启动电机
case 0x01: motor_speed_stop();break; //停止电机
case 0x02: motor_speed_up();break; //电机加速
case 0x03: motor_speed_cut();break; //电机减速
}
}
}
/***********************/
/*主函数*/
void main()
{
uart_init(); //uart初始化(定时器1初始化)
Timer0_Init(); //定时器0初始化
while(1)
{
}
}
/***********************/
void uart_init() //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
/*************************************************************/
/*定时器0初始化*/
void Timer0_Init() //100微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xA4; //设置定时初值,100us
TH0 = 0xFF; //设置定时初值,100us
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //T0中断允许
EA=1; //开总中断
}
/*************************************************************/
/*中断,PWM*/
void motor_speed_pwm() interrupt 1
{
TL0 = 0xA4; //设置定时初值,100us
TH0 = 0xFF; //设置定时初值,100us
count++; //每隔100us中断,记录次数
count%=100; //超过100,清0
if(duty_cycle==100) led=0x00; //最大速度警示灯
if (count<=duty_cycle)
pwm=1;
else
pwm=0;
}
/*电机启动,启动状态灯亮*/
void motor_speed_start()
{
led=0xfe;
pwm=1;
delay10ms(1);
pwm=0;
duty_cycle=duty_cycle_init;
}
/*************************************************************/
/*电机停止,停止状态灯亮*/
void motor_speed_stop()
{
led=0xfd;
duty_cycle=0;
}
/*************************************************************/
/*电机加速,加速状态灯亮*/
void motor_speed_up()
{
led=0xfb;
if(duty_cycle>=duty_cycle_init)
{
duty_cycle+=speed_step;
if(duty_cycle>=100)duty_cycle=100;
}
}
/*************************************************************/
/*电机减速,减速状态灯亮*/
void motor_speed_cut()
{
led=0xf7;
if(duty_cycle!=0)
{duty_cycle-=speed_step;
if(duty_cycle<duty_cycle_init){duty_cycle=duty_cycle_init;}}
/*************************************************************/
}
|