#include<reg52.h>
#define uchar unsigned char
#define V_TH 0XFF
#define V_TL 0XF6
#define V_TMOD 0X01
void init_sys(void); /*系统初始化函数*/
void f_left(); //前进左转
void f_right(); //前进右转
void b_left(); //后退左转
void b_right(); //后退右转
void forward(); //前进
void back(); //后退
void stop(); //停止
//控制小车正反转
sbit IN1 = P0 ^ 0;
sbit IN2 = P0 ^ 1;
sbit IN3 = P0 ^ 2;
sbit IN4 = P0 ^ 3;
//控制小车转速
sbit ENA = P2 ^ 0;
sbit ENB = P2 ^ 1;
uchar ZKB1 = 80, ZKB2 = 80; //控制轮子转速
uchar tmp; //存放串口数据
void main (void)
{
init_sys();
ENA = 0;
ENB = 0;
ZKB1 = 90;
ZKB2 = 90;
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
TMOD |= 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 设定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
while(1)
{
if(RI) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
switch(tmp)
{
case 'a':
forward();
break;
case 'b':
back();
break;
case 'c':
f_left();
break;
case 'd':
f_right();
break;
case 'e':
b_left();
break;
case 'f':
b_right();
break;
case 'g':
stop();
break;
}
}
}
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD = V_TMOD;
TH0 = V_TH;
TL0 = V_TL;
TR0 = 1;
ET0 = 1;
EA = 1;
}
/*********************************************
*函数功能:控制方向*/
void forward()
{
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void back()
{
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void f_left()
{
ZKB1 = 90;
ZKB2 = 45;
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void f_right()
{
ZKB1 = 45;
ZKB2 = 90;
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
}
void b_left()
{
ZKB1 = 90;
ZKB2 = 45;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void b_right()
{
ZKB1 = 45;
ZKB2 = 90;
IN1 = 0;
IN2 = 1;
IN3 = 0;
IN4 = 1;
}
void stop()
{
IN1 = 1;
IN2 = 1;
IN3 = 1;
IN4 = 1;
}
/********************************************************
/*中断函数*/
void timer0(void) interrupt 1 using 2
{
static uchar click = 0; /*中断次数计数器变量*/
TH0 = V_TH; /*恢复定时器初始值*/
TL0 = V_TL;
++click;
if (click >= 100) click = 0;
if (click <= ZKB1) /*当小于占空比值时输出高电平,高于时是低电平,从而实现占空比的调整*/
{
ENA = 1;
}
if (click > ZKB1)
{
ENA = 0;
}
if (click <= ZKB2) /*当小于占空比值时输出高电平,高于时是低电平,从而实现占空比的调整*/
{
ENB = 1;
}
if (click > ZKB2)
{
ENB = 0;
}
}
|