chaosheng.c
来自「本篇文章介绍了一种智能小车」· C语言 代码 · 共 215 行
C
215 行
#include<reg52.h>
#include<stdio.h>
#include <absacc.h>
#include <string.h>
#include <intrins.h>//这个头文件中有_nop_();
#define uchar unsigned char
#define uint unsigned int
//------------------------------变量定义--------------------------
uint data tme = 0,PWM = 0; //PWM
uint data speed = 6; //shift
uint data fang_xiang = 70;//直行时AD值
uint data max = 105; //130
uint data min = 30; //25
//---------超声波测距变量
uint data shou_left = 0;
uint data shou_right = 0;
uint data far = 0;
//超声波口线
//----------------
sbit fa = P2^5;
sbit shou_1 = P2^7;
sbit shou_2 = P2^6;
int data ad = 0x00;
unsigned char bdata DATAIN;
unsigned char bdata CTRL;
sbit BITIN = DATAIN^0;
sbit CBIT = CTRL^0;
//------------------------------口线----------------
//---------------------方向电机
sbit duo = P2^0;
sbit left = P2^1;
sbit right = P2^2;
//----------------------驱动电机
sbit run = P1^3;
sbit b = P1^4;
sbit a = P1^5;
//---------------------0832
sbit SCS = P1^0;
sbit SCLK = P1^1;
sbit SDOUT = P1^2;
sbit SDIN = P1^2;
//------------------------------子程序声明---------------------------------------
void delay( uint dey );
void start( void );
unsigned char get_ad( void );
//---------------------------------初始化----------------------------------------
void start( void )
{
EA = 1;
ET0 = 1;
TMOD = 0x22;
TH0 = 0X40;
TL0 = 0X40;
PT0 = 1;
TR0 = 1;
IT0 = 0;
EX0 = 1;
}
//---------------------------------0832------------------------------------------
uchar get_ad( )
{
uchar data i;
CTRL = 0x07; //启动位,SGL 选CH0通道,011三位
SCS = 1; //选通允许
SCS = 0;
for( i = 0;i < 3;i ++ )
{
SDIN = CBIT;
SCLK = 0; //发三个时钟
SCLK = 1;
CTRL = CTRL >> 1;
}
SCLK = 0;
SCLK = 1; //第四个时钟
/*------------------------------------------开始读A/D---------------------------*/
SCLK = 0;
for( i = 0;i < 8;i ++ )
{
DATAIN = DATAIN << 1; //移位8次取到采样的值
BITIN = SDOUT;
SCLK = 1;
SCLK = 0;
}
SCS = 1;
return( DATAIN );
}
//--------------------------------delay---------------------------------------
void delay( uint dey )
{
while( dey -- );
}
//---------------------------------方向调整程序-------------------------------
void regu( int dri )
{
int data k;
ad = 0;
for(k = 0;k < 25;k ++)
{
ad += get_ad();
}
ad /= 25;
k = ad - dri;
if( k > 2)
{
left = 0;
right = 1;
}
else if( k < -1)
{
left = 1;
right = 0;
}
else
left = right = 0;
}
//--------------------------------探障程序---------------------------------------
void test( void )
{
ET1 = 1;
TH1 = 0xe9;
TL1 = 0xe9;
far = 0;
TR1 = 1;
EX0 = 1;
delay ( 100 );
EX0 = 0;
TR1 = 0;
}
//--------------------------------行驶程序-----------------------------------------
void on_the_way( void )
{
a = 0; b = 1; // 小车的前进电平
if( shou_right )
{
fang_xiang += 30;
if( fang_xiang > max )
fang_xiang = max;
}
if( shou_left )
{
fang_xiang -= 30;
if( fang_xiang < min )
fang_xiang = min;
}
shou_left = 0;
shou_right = 0;
TR1 = 0;
}
//-------------------------------直行------------------------------------------
void zhi_xing ( void )
{
if( fang_xiang > 70 )
fang_xiang -= 1;
if( fang_xiang < 70 )
fang_xiang += 1;
}
//--------------------------------主程序------------------------------------------
void main ( void )
{
uint data i;
start( );
while(1)
{
for( i = 0;i < 5;i ++ )
{
test( );
on_the_way( );
regu( fang_xiang );
}
zhi_xing( );
}
}
//--------------------------------小车速度中断(定时器 0)-----------------------------------------
void time0( void ) interrupt 1 using 1
{
tme ++;
if(tme > 5)
{
PWM ++;
tme = 0;
duo = !duo;
}
if ( PWM < speed )
run = 1;
else
run = 0;
if ( PWM >= 10 )
{
PWM = 0 ;
}
}
//--------------------------------超声波发送中断(定时器 1)-------------------------------------------------
void time1 ( void ) interrupt 3 using 3
{
fa =! fa;
far ++;
}
//-------------------------------超声波接收中断 (外中断 0)-------------------------------------------
void int0 ( void ) interrupt 0 using 2
{
TR1 = 0;
if( shou_2 == 0 )
{
if( ( far > 40 ) && ( far < 100 ) )
shou_left = 1;
}
if(shou_1 == 0)
{
if( ( far > 40 ) && ( far < 100 ) )
shou_right = 1;
}
EX0 = 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?