#include <reg51.h>
sfr AUXR = 0x8E; //使用STC12C5A60S2单片机
sfr BRT = 0x9C;
char dis_angle[6]; //定义数组
int speed_mr; //右电机转速
int speed_ml=0; //左电机转速
sbit SPDR = P3^4; //右电机B相测速,用来判断电机转向
sbit SPDL = P3^5; //左电机B相测速,用来判断电机转向
void Init_BRT() ////9600bps@22.1184MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xB8; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
void send_char(unsigned char txd) //sent out data
{
SBUF = txd;
while(!TI);
TI = 0;
}
void display(float temp_dat)
{
int temp,i;
if(temp_dat<0)
{
dis_angle[0]='-';
temp_dat=-temp_dat;
}
else dis_angle[0]='+';
temp=temp_dat;
dis_angle[1]=temp/10000+0x30;
temp=temp%10000;
dis_angle[2]=temp/1000+0x30;
temp=temp%1000;
dis_angle[3]=temp/100+0x30;
temp=temp%100;
dis_angle[4]=temp/10+0x30;
temp=temp%10;
dis_angle[5]=temp%10+0x30;
for(i=0;i<6;i++)
{
send_char(dis_angle);
}
}
void main()
{
Init_BRT();
EX0=1;
EX1=1;
IT0=1;
IT1=1;
EA=1;
while(1)
{
display(speed_mr); //显示右边码盘计数脉冲
display(speed_ml); //显示左边码盘计数脉冲
send_char(0x0d);
send_char(0x0a);//换行,回车
}
}
//********左电机中断***********************
void INT_L(void) interrupt 0
{
if(SPDL == 1) { speed_ml++; } //左电机前进
else { speed_ml--; } //左电机后退
}
//********右电机中断***********************
void INT_R(void) interrupt 2
{
if(SPDR == 1) { speed_mr++; } //右电机前进
else { speed_mr--; } //右电机后退
//LED = ~LED;
}
|