#include "reg52.h"
#include "uart.h"
#define led P2 //電機狀態(tài)顯示
#define duty_cycle_init 20 //定義初始占空比
#define speed_step 5 //調(diào)速步長(16步)
sbit pwm=P1^0; //定義PWM端口
static uchar duty_cycle=0; //占空比
uchar count=0; //計次
uchar dat; //串口接收的數(shù)據(jù)
void delay10ms(int x) //@11.0592MHz
{
while(x--)
{
unsigned char i, j;
_nop_();
_nop_();
i = 19;
j = 19;
do
{
while (--j);
} while (--i);
}
}
/*串口接收數(shù)據(jù),接收到相應(yīng)數(shù)據(jù)電機動作*/
void uart() interrupt 4 //串口通信中斷函數(shù)
{
if(RI==1)
{
dat=SBUF; //存儲接收到的數(shù)據(jù)
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; //電機減速
}
}
}
/***********************/
/*主函數(shù)*/
void main()
{
uart_init(); //uart初始化(定時器1初始化)
Timer0_Init(); //定時器0初始化
while(1)
{
}
}
/***********************/
void uart_init() //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
TL1 = 0xFD; //設(shè)定定時初值
TH1 = 0xFD; //設(shè)定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
EA=1;
ES=1;
}
/*************************************************************/
/*定時器0初始化*/
void Timer0_Init() //100微秒@11.0592MHz
{
TMOD &= 0xF0; //設(shè)置定時器模式
TMOD |= 0x01; //設(shè)置定時器模式
TL0 = 0xA4; //設(shè)置定時初值,100us
TH0 = 0xFF; //設(shè)置定時初值,100us
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0=1; //T0中斷允許
EA=1; //開總中斷
}
/*************************************************************/
/*中斷,PWM*/
void motor_speed_pwm() interrupt 1
{
TL0 = 0xA4; //設(shè)置定時初值,100us
TH0 = 0xFF; //設(shè)置定時初值,100us
count++; //每隔100us中斷,記錄次數(shù)
count%=100; //超過100,清0
if(duty_cycle==100) led=0x00; //最大速度警示燈
if (count<=duty_cycle)
pwm=1;
else
pwm=0;
}
/*電機啟動,啟動狀態(tài)燈亮*/
void motor_speed_start()
{
led=0xfe;
pwm=1;
delay10ms(1);
pwm=0;
duty_cycle=duty_cycle_init;
}
/*************************************************************/
/*電機停止,停止狀態(tài)燈亮*/
void motor_speed_stop()
{
led=0xfd;
duty_cycle=0;
}
/*************************************************************/
/*電機加速,加速狀態(tài)燈亮*/
void motor_speed_up()
{
led=0xfb;
if(duty_cycle>=duty_cycle_init)
{
duty_cycle+=speed_step;
if(duty_cycle>=100)duty_cycle=100;
}
}
/*************************************************************/
/*電機減速,減速狀態(tài)燈亮*/
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;}}
/*************************************************************/
}
|