0809.c
来自「本篇文章介绍了一种智能小车」· C语言 代码 · 共 209 行
C
209 行
#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;//存放采集来的数的逻辑电平
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;//--允许转换
uint data dat[8],i;
uint sum=0;
uint max=200;
uint min=134;
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:TurnLeft(20);break;
case 0x0a:TurnRight(20);break;
default:Forward(30);
}
}
//---------------------检测程序-----------------------------------------------------------------------
void test(void)
{
float ave=0;
uint how;
sensors=0x00;
dat[0]-=40;dat[1]-=2;dat[2]+=10;dat[3]-=9;
for(how=0;how<i;how++)
{
if((max<dat[how])&&((dat[how]-max<=80)))//-------取最大值
max=dat[how];
if((min>dat[how])&&((min-dat[how])<=80))//-----取最小值
min=dat[how];
ave=(max+min)/2;
sensors<<=1;
if(dat[how]>=(ave-2))
l1=1;
}
zuo=l4;qian=l3;hou=l2;you=l1;
}
/*-----------------------------------------------------------------------
void hold(void)
{
} */
//------------------------------------------初始化程序--------------------------------------------------
void start(void)
{
uint j;
EA=1; ET0=1;//-----开中断-----------
TMOD=0x02; //方式二
TH0=0xe0; //
TL0=0xe0;
i=4; //四个对管只取四路模拟量
a=b=c=0;
for(j=0;j<8;j++) //清空逻辑量存贮区
{dat[j]=0x00;}
max=200;
min=134;
}
//-----------------------------------------------------------------------------------------------------
void get_0809(void) /*读AD0809数据程序*/
{
int s;
for(gate=0;gate<i;gate++)
{
c=gat_3; b=gat_2; a=gat_1;
_nop_();_nop_();_nop_();_nop_();
ale=1;
ale=0;
delay(5);
while(eoc);
oe=1;sum=0x00;
for(s=0;s<10;s++) //读十次AD值取平均值
{sum=sum+P0;_nop_();}
dat[gate]=sum/10;
oe=0;
}
}
//-----------------------------------------------------------------------------------------------
void main(void) /*主程序*/
{
start();
while(1)
{
start();
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 + =
减小字号Ctrl + -
显示快捷键?