|
#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;
}
}
|
|