📄 gai__0809.c
字号:
#include <intrins.h>//这个头文件中有_nop_();
#include <reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------------------------------------
char bdata gate=0x00; //三—八译码器
char bdata sensors=0xff;//存放采集来的数的逻辑电平
char temp[4];
int idata max[4]={90,90,90,90};
int idata min[4]={245,245,245,245};
sbit l1=sensors^0;
sbit l2=sensors^1;
sbit l3=sensors^2;
sbit l4=sensors^3;
//-----------
sbit lun=P1^6;
//----------------------------------------------------------------------------------------------------
sbit left=P1^0; //左电机使能
sbit right=P1^1;//右电机使能
//---------------------------------
sbit you=P3^7;
sbit hou=P3^6;
sbit qian=P3^5;
sbit zuo=P3^4;
//---------------AD模拟通道选择
sbit gat_3=gate^2;///存放 A
sbit c=P2^6; ////////////// A
sbit gat_2=gate^1;// 存放 B
sbit b=P2^5; ///////////// B
sbit gat_1=gate^0;// 存放 C
sbit a=P2^4; ///////////// C
sbit eoc=P2^2;//---转换结束标志
sbit oe=P2^3; //---取值允许
sbit ale=P2^7;//--允许转换
int idata dat[4];
int tim=0; //--进中断次数100为一个周期
uint speedleft,speedright;//--左右轮转速控制
//---------------------------------------------------------------------------------------------------
void get_0809(void);//--读0809数据 0809用到的程序
void start(void);//--初始化
void test(void); //--检测
void cotor_car(void);//--控制小车
void hold(void);
void stop(void);
//---------------------------------------------------------------------------------------------------
void Forward(char speed);//前进 293用到的程序
void Reverse(char speed,int dely,bit r);//speed--速度,dely--时间,r--左(右)
void TurnRight(uint dey);//右拐
void TurnLeft(uint dey);//左拐
void delay(unsigned int time);//--延时
void stop(void);//---停止
void delay(uint e);//--延时
//---------------------------延时程序-------------------------------------------------------------
void delay(uint e)
{
while(e--)
{
_nop_();_nop_();_nop_();
_nop_();_nop_();}
}
//-----------------------前进程序----------------------------------------------------------------
void Forward(char speed)
{
P1=0x1b;lun=1;
speedleft=speed;
speedright=speed+4;
TR0=1;
delay(15);
TR0=0;
}
//----------------------左转程序-------------------------------------------------------------------
void TurnLeft(uint dey)
{
P1=0x2b;lun=1;
speedleft=35;
speedright=25;
TR0=1;
delay(dey);
TR0=0;
}
//----------------------右转程序-------------------------------------------------------------------
void TurnRight(uint dey)
{
P1=0x17; lun=0;
speedleft=25;
speedright=35;
TR0=1;
delay(dey);
TR0=0;
}
/*----------------------------------后退程序----------------------------------------------------
void Reverse(char speed,int dely,bit r)
{
}
//-----------------------------------停止程序---------------------------------------
void stop(void)
{
TR0=0;right=0;left=0;
} */
//-------------------------控制小车程序------------------------------------------------------------
void cotor_car(void) /* 中间的两个对管为 a b */
{ /* 左边为 c右边为 d */
switch(sensors)
{ //--设收到返回光为高电平
//------------------------------------------------------------------------------------
case 0x07:TurnLeft(20);break;
case 0x0e:TurnLeft(20);break;
case 0x06:Forward(80);break;
case 0x05:TurnLeft(10);break;
case 0x0c:TurnRight(20);break;
case 0x03:TurnRight(20);break;
case 0x0a:TurnLeft(20);break;
default:Forward(30);
}
}
//---------------------检测程序-----------------------------------------------------------------------
void test(void)
{
uint s,yu=0xf7,huo=0x08;
uint ave[4];
//----------------------------------
for(s=0;s<4;s++)
{
if(max[s]==255)
max[s]=90;
if(min[s]<40)
min==254;
//----------------------------------
if(dat[s]>max[s])
max[s]=dat[s];
if(dat[s]<min[s])
min[s]=dat[s];
//-----------------------------------
ave[s]=((max[s]/2)+(min[s])/2);
//-----------------------------------
if(dat[s]>ave[s])
sensors|=huo;
else
sensors&=yu;
//-----------------------------------
yu>>=s;
huo>>=s;
}
zuo=l4;qian=l3;hou=l2;you=l1;
}
/*-----------------------------------------------------------------------
void hold(void)
{
} */
//------------------------------------------初始化程序--------------------------------------------------
void start(void)
{
EA=1; ET0=1;//-----开中断-----------
TMOD=0x02; //方式二
TH0=0xe0; //
TL0=0xe0;
}
//-----------------------------------------------------------------------------------------------------
void get_0809(void) /*读AD0809数据程序*/
{
uint i=4;
for(gate=0;gate<i;gate++)
{
c=gat_3; b=gat_2; a=gat_1;
_nop_();_nop_();_nop_();_nop_();
ale=1;
ale=0;
while(!eoc);
oe=1;
_nop_();
dat[gate]=P0;
oe=0;
}
}
//----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
void main(void) /*主程序*/
{
start();
while(1)
{
get_0809();
test();
cotor_car();
}
}
//------------------------------------------------------------------------------------------------
void time0(void) interrupt 1 using 2 /*电机定时中断*/
{
if(tim<=speedright)
right=1;
else
right=0;
if(tim<=speedleft)
left=1;
else
left=0;
tim++;
if(tim>=100)
tim=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -