自己弄得一个下位机程序,有兴趣的同学看下
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit temp1=0,temp2=0;
uchar Buffer[4] = {0}; //从串口接收的数据
uint i,j;
/***************************************端口定义****/
//l298n
sbit EN1=P2^0;
sbit IN1=P2^1;
sbit IN2=P2^2;
sbit EN2=P2^3;
sbit IN3=P2^4;
sbit IN4=P2^5;
//照明 用继电器控制的
sbit LED=P1^0;
//避障
sbit zuo=P2^6;
sbit you=P2^7;
/*
变量定义
*/
uchar key_stime_counter,hight_votage=15,timeT_counter;
bit key_stime_ok;
/*
变量定义
*/
uchar key_stime_counter1,hight_votage1=15,timeT_counter1;
bit key_stime_ok1;
/*
引脚定义
*/
//舵机
sbit control_signal=P3^6;
sbit control_signa2=P3^7;
uchar num;//全局变量
void TimerInit()
{
control_signal=0;
TMOD=0x01; //设置定时器0为工作方式1
EA=1; //开总中断
ET0=1; //定时器0中断允许
TH0 = 0xFF; //定时器装初值
TL0 = 0xA3;
TR0=0;
}
/**********定时器2********/
void Timer2Init()
{
control_signa2=0;
T2CON=0x01;
EA = 1;
ET2 = 1;
TL2 = 0xFF;
TH2 = 0x3A;
TR2 = 0;
}
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1)
{
Buffer[0] = SBUF - 48;
RI = 0;
}
EA = 1;
}
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
/*********************************l198n控制************************/
void Moto_Forward()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void Moto_Backward()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void Moto_TurnLeft()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void Moto_TurnRight()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void Moto_Stop()
{
EN1=0;
EN2=0;
}
/*****************************************/
/*主程序*/
void main(void)
{
LED=0;
Delay_1ms(1);
TimerInit();
Timer2Init();
Com_Init();
while(1)
{
switch (Buffer[0]) //根据键值不同,执行不同的内容
{
case 0:
TR0=0;
TR2=0;
Moto_Stop();
LED=1;
break;
case 6:
ET2=0;
ET0=1;
TR2=0;
TR0=1;
Delay_1ms(40);
hight_votage-=1;
if(hight_votage<5)
hight_votage=5;
break;
case 7:
ET2=0;
ET0=1;
TR2=0;
TR0=1;
Delay_1ms(40);
hight_votage+=1;
if(hight_votage>25)
hight_votage=25;
break;
case 8:
ET0=0;
ET2=1;
TR2=1;
Delay_1ms(5);
hight_votage1-=1;
if(hight_votage1<5)
hight_votage1=5;
break;
case 9:
ET0=0;
ET2=1;
TR2=1;
Delay_1ms(5);
hight_votage1+=1;
if(hight_votage1>25)
hight_votage1=25;
break;
case 1: for(num=0;num<45;num++)
{
Moto_Forward();
}
break;
case 2:
for(num=0;num<45;num++)
{
Moto_Backward();
}
break;
case 3:
for(num=0;num<45;num++)
{
Moto_TurnLeft();
}
break;
case 4:
for(num=0;num<45;num++)
{
Moto_TurnRight();
}
break;
case 5: LED=~LED;break;
default : TR0=0;TR2=0;
break;
}
while((you==0)&&(zuo==0)) //死角,或前面有障碍,退
{
Moto_Backward();
}
while(zuo==0) //右转
{
Moto_TurnRight();
}
while(you==0) //左转
{
Moto_TurnLeft();
}
}
}
void timer0(void) interrupt 1 using 0
{
TH0=0xFF;
TL0=0xA3;
if (++key_stime_counter>=200)
{
key_stime_counter=0;
control_signal=1;
key_stime_ok = 1; // 20ms到
timeT_counter=0;
}
if (key_stime_ok&&(++timeT_counter>=hight_votage))
{
key_stime_ok=0;
timeT_counter=0;
control_signal=0; // hight_votage*0.1ms到
}
}
void Timer2() interrupt 5
{
TH2=0xFF;
TL2=0xA3;
if (++key_stime_counter1>=200)
{
key_stime_counter1=0;
control_signa2=1;
key_stime_ok1 = 1; // 20ms到
timeT_counter1=0;
}
if (key_stime_ok1&&(++timeT_counter1>=hight_votage1))
{
key_stime_ok1=0;
timeT_counter1=0;
control_signa2=0; // hight_votage1*0.1ms到
}
TR2=0;
}
键值 端口根据自己的电路再进行修改
|