|
#include<reg52.h>
#define uchar unsigned char
#define V_TH 0XFF
#define V_TL 0XF6
#define V_TMOD 0X01
void init_sys(void); /*系統(tǒng)初始化函數(shù)*/
void f_left(); //前進左轉(zhuǎn)
void f_right(); //前進右轉(zhuǎn)
void b_left(); //后退左轉(zhuǎn)
void b_right(); //后退右轉(zhuǎn)
void forward(); //前進
void back(); //后退
void stop(); //停止
//控制小車正反轉(zhuǎn)
sbit IN1 = P0 ^ 0;
sbit IN2 = P0 ^ 1;
sbit IN3 = P0 ^ 2;
sbit IN4 = P0 ^ 3;
//控制小車轉(zhuǎn)速
sbit ENA = P2 ^ 0;
sbit ENB = P2 ^ 1;
uchar ZKB1 = 80, ZKB2 = 80; //控制輪子轉(zhuǎn)速
uchar tmp; //存放串口數(shù)據(jù)
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位自動重載模式, 用于產(chǎn)生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 設(shè)定串行口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 啟動定時器1
while(1)
{
if(RI) // 是否有數(shù)據(jù)到來
{
RI = 0;
tmp = SBUF; // 暫存接收到的數(shù)據(jù)
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;
}
}
}
}
/******************************************************
*函數(shù)功能:對系統(tǒng)進行初始化,包括定時器初始化和變量初始化*/
void init_sys(void) /*系統(tǒng)初始化函數(shù)*/
{
/*定時器初始化*/
TMOD = V_TMOD;
TH0 = V_TH;
TL0 = V_TL;
TR0 = 1;
ET0 = 1;
EA = 1;
}
/*********************************************
*函數(shù)功能:控制方向*/
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;
}
/********************************************************
/*中斷函數(shù)*/
void timer0(void) interrupt 1 using 2
{
static uchar click = 0; /*中斷次數(shù)計數(shù)器變量*/
TH0 = V_TH; /*恢復定時器初始值*/
TL0 = V_TL;
++click;
if (click >= 100) click = 0;
if (click <= ZKB1) /*當小于占空比值時輸出高電平,高于時是低電平,從而實現(xiàn)占空比的調(diào)整*/
{
ENA = 1;
}
if (click > ZKB1)
{
ENA = 0;
}
if (click <= ZKB2) /*當小于占空比值時輸出高電平,高于時是低電平,從而實現(xiàn)占空比的調(diào)整*/
{
ENB = 1;
}
if (click > ZKB2)
{
ENB = 0;
}
}
|
|