智能循迹小车详细源代码程序MSPID

合集下载

循迹小车代码

循迹小车代码

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuint a,d,y,z,h,q;sbit out1 = P0^0 ;//电机驱动输出控制管脚配置sbit out2 = P0^1 ;sbit out3 = P0^2 ;sbit out4 = P0^3 ;sbit in1 = P2^0;//循迹模块的信号输入管脚配置sbit in2 = P2^1;sbit in3 = P2^2;sbit in4 = P2^3;sbit in5 = P2^4;delay(uint a);int zuozhuan(uint z)//控制小车做左转动作(参数z和a可以用来调节左转时间,本程序设定//为不同参数表示每次调用程序左转时间相同不可变,没有调节转弯时间的功能){out1=1;out2=0;out3=0;out4=1;delay(a);}int youzhuan(uint y)//控制小车做右转动作(参数y和a可以用来调节右转时间,本程序设定//为不同参数表示每次调用程序右转时间相同不可变,没有调节转弯时间的功能){out1=0;out2=1;out3=1;out4=0;}int houtui(uint h)//控制小车可以使小车倒退行驶(参数功能与转弯类似){out1=0;out2=1;out3=0;out4=1;delay(a);out1=0;out2=0;out3=0;out4=0;delay(20);}int dengdai (uint d) //使小车停止当前所有动作,停止时间可调。

{out1=0;out2=0;out3=0;out4=0;delay(d);}void qianjin(q)//使小车向前行驶,行驶时间可调{out1=1;out2=0;out3=1;out4=0;delay(q);}void xunji(){P1=P1|0XF0; d elay(5);if(in1==0){dengdai();youzhuan(100);while(in3==1);}else if(in5==0){dengdai();zuozhuan(100);while(in3==1);}else if(in2==0){dengdai();youzhuan(30);}else if(in4==0){dengdai();zuozhuan(30);}else if(in3==0) {qianjin(20); }else {qianjin(20);}}int delay(uint a)//延时子函数{uint x,y;for(x=a;x>0;x--)for(y=110;y>0;y--);}void main(){delay(2000);while(1)xunji();}#include<reg52.h>#define uchar unsigned char#define uint unsigned int//D0-D7:f,b,a,e,d,h,c,g 共阴依次编码//74LS04反相器驱动数码管uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7}; uchar i = 0; //用于0-3数码管轮流显示uint j = 0; //计时的次数uint time=0; //计时uint pwm=16; //占空比uint speed; //调制PWM波的当前的值sbit R=P3^2; //右边传感器P3^2 sbit L=P3^3; //左边传感器P3^3 //电机驱动口定义sbit ENB=P1^0; //前轮电机停止控制使能sbit ENA=P1^1; //后轮控制调速控制端口sbit IN1=P1^2; //前轮sbit IN2=P1^3; //前轮sbit IN3=P1^4; //后轮sbit IN4=P1^5; //后轮void Init() {TMOD = 0x12; //定时器0用方式2,定时器1用方式1TH0=(256-200)/256; //pwmTL0=(256-200)/256;TH1 = 0x0F8; //定时2msTL1 = 0x30;EA = 1;ET0 = 1;ET1 = 1;TR0 = 1;TR1 = 1;}void tim0(void) interrupt 1 //产生PWM{speed ++;if(speed <= pwm) //pwm 就相当于占100的比例{ENA = 1;}else if(speed < 100){ENA = 0;}elsespeed = 0;}void time1() interrupt 3 //定时2ms{TH1 = 0x0F8;TL1 = 0x30;i =(i+1) % 4; //0-3循环j++;if(i == 0) //显示最低位数码管{P0 = 0x00; //段选清零防止乱码P0 = table[time%10]; //送段码信号}if(i == 1){P0 = 0x00;P0 = table[time/ 10% 10];}if(i == 2){P0 = 0x00;P0 = table[time/ 100% 10];}if(i == 3){P0 = 0x00;P0 = table[time/ 1000% 10];}P2 = ( 0x10 << i ); //送位选信号if(j == 500){time ++;//500次为1秒j = 0;}}void forward() //前进{IN2=1;IN1=0;}void back() //后退{IN2=0;IN1=1;}void left() //左转{ENB=1; //打开使能IN3=1;IN4=0;}void right() //右转{ENB=1; //打开使能IN3=0;IN4=1;}void stop() //停止{IN2=0;IN1=0;IN3=0;IN4=0;}void main(){Init(); //定时器初始化while(1){if(R==0 && L==1) //右传感器检测到黑线{right(); //右转forward();while(R==0 && L==1);}if(R==1 && L==0) //左传感器检测到黑线{left();forward();while(R==1 && L==0);}if(R==0 && L==0) //都检测到黑线则停止{stop();j = 0; //定时器仍在工作,计数时间清空}else //都没有检测到黑线{ENB = 0; //关闭转向控制forward();}}}。

基于51单片机智能小车循迹程序

基于51单片机智能小车循迹程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned int////电机驱动模块位定义////sbit M11=P0^0;//左轮sbit M12=P0^1;sbit M23=P0^2;//右轮sbit M24=P0^3;sbit ENA=P0^4;//左轮使能PWM输入改变dj1数值控制转速sbit ENB=P0^5;//右轮使能PWM输入改变dj2数值控制转速////占空比变量定义////unsigned char dj1=0;unsigned char dj2=0;uchar t=0;////红外对管位定义////sbit HW1=P1^0;//左前方sbit HW2=P1^1;//右前方sbit HW3=P1^2;//左后方sbit HW4=P1^3;//右后方////小车前进////void qianjin(){M11=1;//左轮M12=0;//M23=1;//右轮M24=0;//dj1=50;dj2=50;}////向左微调////void turnleft2(){M11=1;M12=0;M23=1;M24=0;dj1=7;//左轮dj2=50;//右轮}////向右微调////void turnright2(){M11=1;M12=0;M23=1;M24=0;dj1=50;dj2=7;}////向左大调////void left(){M11=0;M12=1;M23=1;M24=0;dj1=7;dj2=80;}////向右大调////void right(){M11=1;M12=0;M23=0;M24=1;dj1=80;dj2=7;}////循迹动作子函数////void xj(){if(HW1==0&&HW2==0&&HW3==0&&HW4==0)//前进逻辑{qianjin();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0)//左右微调{turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnright2();}if(HW1==1&&HW2==0&&HW3==1&&HW4==0)//左右大调{left();}if(HW1==0&&HW2==1&&HW3==0&&HW4==1){right();}}////初始化////void init(){TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;EA=1;ET0=1;TR0=1;}////定时器0中断////void timer0() interrupt 1 using 1{TH0=(65536-500)/256;TL0=(65536-500)%256;t++;if(t<dj1)ENA=1;else ENA=0;if(t<dj2)ENB=1;else ENB=0;if(t>=50){t=0;}}void main(){init();P1=0Xff;while(1){/////////////////循迹模式/////////////////////xj();}}。

循迹小车程序(三路循迹)

循迹小车程序(三路循迹)

#include "reg51.h"typedef unsigned int uint;typedef unsigned char uchar;sbit p2_0 = P2^0; //开关sbit p2_1 = P2^1; //红外检测sbit p2_2 = P2^2;sbit p2_3 = P2^3;sbit p1_0 = P1^0; //电机驱动sbit p1_1 = P1^1;sbit p1_2 = P1^2;sbit p1_3 = P1^3;sbit pwm1 = P1^4; //pwm调速sbit pwm2 = P1^5;unsigned char timer1;/******************************************************************** ************ 函数名 : Time1Config* 函数功能 : 设置定时器* 输入 : 无* 输出 : 无********************************************************************* **********/void Time1Config(){TMOD|= 0x10; //设置定时计数器工作方式1为定时器//--定时器赋初始值,12MHZ下定时0.5ms--//TH1 = 0xFE;TL1 = 0x0C;ET1 = 1; //开启定时器1中断EA = 1;TR1 = 1; //开启定时器}/************************************************ 延时函数总共延时1ms乘以count************************************************/ void DelayX1ms(uint count){uint j;while(count--!=0){for(j=0;j<72;j++);}}/************************************************ 电机转动函数定义************************************************/ void ZhiXing( ){p1_0=0;p1_1=0;p1_2=0;p1_3=0;DelayX1ms(10);p1_0=0;p1_1=1;p1_2=0;p1_3=1;DelayX1ms(15);}void ZuoZhuan( ){pwm1=0;pwm2=0;DelayX1ms(10); p1_0=0;p1_1=1;p1_2=1;p1_3=0;DelayX1ms(20); }void YouZhuan( ){pwm1=0;pwm2=0;DelayX1ms(10);p1_0=1;p1_1=0;p1_2=0;p1_3=1;DelayX1ms(20); }void HouTui( ){p1_0=0;p1_1=0;p1_2=0;p1_3=0;DelayX1ms(6); p1_0=1;p1_1=0;p1_2=1;p1_3=0;DelayX1ms(20);}/************************************************ 主函数************************************************/ void main( ){Time1Config();while(1){if( p2_1==0 && p2_2==0 && p2_3==1){YouZhuan( );}else if(p2_1==1 && p2_2==0 && p2_3==0){ZuoZhuan( );}else{ZhiXing( );}}}/******************************************************************** ************ 函数名 : Time1* 函数功能 : 定时器1的中断函数* 输入 : 无* 输出 : 无********************************************************************* **********/void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断{timer1++;if(timer1>100) //PWM周期为100*0.5ms{timer1=0;}if(timer1 < 85) //改变30这个值可以改变直流电机的速度{pwm1=1;pwm2=1;}else{pwm1=0;pwm2=0;}TH1 = 0xFE; //重新赋初值TL1 = 0x0C;}。

智能循迹小车程序

智能循迹小车程序

智能循迹小车,小车按中字笔画行驶/************“中”字笔画轨迹*************/ #include<reg52.h>#include <intrins.h> //内部包含延时函数_nop_(); #define uchar unsigned char#define uint unsigned intunsigned char dj1=0;unsigned char dj2=0;uchar t=0;uchar num1=0,num2=0,num3=0;sbit HW1=P0^0; //红外对管位定义sbit HW2=P0^1;sbit HW3=P0^2;sbit HW4=P0^3;sbit ENA=P3^2; //PWM输入sbit ENB=P3^3;sbit IN5=P2^4; //电机sbit IN6=P2^5;sbit IN7=P2^6;sbit IN8=P2^7;void delay(uint x) //延时1ms{u int i,j;f or(i=0;i<x;i++)for(j=0;j<120;j++);}void qianjin() //小车前进{I N5=0;I N6=1;I N7=0;I N8=1;d j1=15;d j2=15;}void turnleft2() //小车前进向左微调{I N5=0;I N6=1;I N7=0;I N8=1;d j1=7;d j2=20;}void turnright2() //小车前进向右微调{I N5=0;I N6=1;I N7=0;I N8=1;d j1=20;d j2=7;}void right(){I N5=0;I N6=1;I N7=1;I N8=0;d j1=20;d j2=25;}void left(){I N5=1;I N6=0;I N7=0;I N8=1;d j1=25;d j2=20;}void stop() //小车后退{d j1=0;d j2=0;}void init() //初始化{T MOD=0x01;T H0=(65536-500)/256;T L0=(65536-500)%256;E A=1;E T0=1;T R0=1;}void timer0() interrupt 1 using 1 //定时器0中断{T H0=(65536-500)/256;T L0=(65536-500)%256;t++;i f(t<dj1) ENA=1;e lse ENA=0;i f(t<dj2) ENB=1;e lse ENB=0;i f(t>=50){t=0;}}void main(){i nit();w hile(1){if(num1==0){if(HW1==0&&HW2==1&&HW3==1&&HW4==0){qianjin();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=1;delay(50);}}}if(num1==1){if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=1;delay(50);qianjin();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {stop();delay(50);num1=2;delay(50);}}}if(num1==2){if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=2;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==0&&HW1==1&&HW2==1&&HW3==1&&HW4==1)num3=1;delay(10);stop();delay(100);qianjin();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=3;delay(50);}}}if(num1==3){if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=3;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0)turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=4;delay(50);}}}if(num1==4){if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=4;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==1&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {num3=2;delay(10);stop();delay(100);qianjin();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0)turnright2();}if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=5;delay(50);}}}if(num1==5){if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=5;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0)turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {stop();delay(100);num1=6;delay(50);}}if(num1==6){if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=6;delay(50);num3=3;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==3&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=4;delay(10);stop();delay(100);qianjin();}if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {stop();delay(500);num1=7;delay(50);}}}if(num1==7){if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=7;delay(50);num3=4;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==4&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=5;delay(10);stop();delay(100);qianjin();}if(num3==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=6;delay(10);stop();delay(100);qianjin();}if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(100);if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(90000);}}}}}。

循迹小车程序代码

循迹小车程序代码

//(在MAIN中接受铁片颜色判断传感器的信号来赋值) unsigned char Light_Flag=0;//进入光引导区的标志(1) unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时 unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数 /*============================全局变量定义区 ============================*/ /*------------------------------------------------*/ /*-----------------通用延迟程序-------------------*/ /*------------------------------------------------*/ void delay(unsigned int time) { unsigned int i,j; for(j=0;j<time;j++) { for(i=0;i<60;i++) {;} } } /*-----------------------------------------------*/ /*-------------------显示控制模块----------------*/ /*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴)*/ void Display(unsigned char n) { char Numb[12]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n]; } // time*0.5ms延时

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码

//智能小车避障、循迹、红外遥控 C 语言代码// 实现功能有超声波避障, 红外遥控智能小车, 红外传感器实现小车自动循迹, 1602 显示小 车的工作状态,另有三个独立按键分别控制三种状态的转换 // 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起 来比较容易一点 #include <> #include <> #include"" #include <> #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh1[8]=" uchar ENCHAR_PuZh2[8]=" uchar ENCHAR_PuZh3[8]=" ucharENCHAR_PuZh4[8]=" uchar ENCHAR_PuZh5[8]=" run back stop left right "; ";//1602 显示数组 H. H. H. uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW P2 #define PWM /****************************** P1 //红外传感器引脚配置 P2k 口 /* L298N 管脚定义 */ 超声波引脚控制 ******************************/ sbit ECHO=P3A2; sbit TRIG=P3A3;///// 红外控制引脚配置 sbit sbituchar KEY2=P3A7; KEY 仁 P3M;state_total=3,state_2=0;// 2 为红外遥控 ucharuchar time_1 uchar 局变量 // 超声波接收引脚定义 // 超声波发送引脚定义// 红外接收器数据线 // 独立按键控制 总状态控制全局变量 state_1,DAT; // 红外扫描标志位time_1=0,time_2=0;// 定时器 1 中断全局变量 控制转弯延时计数也做延时一次 time,timeH,timeL,state=0;// 超声波测量缓冲变量 count=0;//1602 显示计数 兼红外遥控按键 state_total =2 兼循迹按键 state_total= 0 自动避障 state_total=10 为自动循迹模块 1 为自动避障模块 time_ 2 控制 PWM 脉冲计数 state 为超声波状态检测控制全 uint /**************************/ unsigned char IRC0M[7]; // 红外接收头接收数据缓存 unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; /********* voidvoid voidIRC0M[2 ]存放的为数据 // 红外接收缓存变量 **/ IRdelay(char x); //x* 红外头专用 delay run(); back();void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); void bizhang_test(); void xunji_test(); void hongwai_test();void Delay10ms(void);void init_test()// 定时器 0{ 1 外部中断 // 超声波显示 驱动 0 1 延时初始化 TMOD=0x11; TH1=0Xfe; TL1=0x0c; TF0=0; TF1=0; ET0=1; ET1=1; EA=1;// 设置定时器 0 1 // 装入初值定时一次为工作方式 1 16 位初值定时器2000hz// 定时器 // 定时器 // 允许定时器// 允许定时器 0 方式 1 计数溢出标志 1 方式 1 计数溢出标志 0 中断溢出 1 中断溢出//开总中断 if(state_total==1)// 为超声波模块时初始化 {TRIG=0; ECHO=0; EX0=0; IT0=1;}if(state_total==2)// 发射引脚低电平 // 接收引脚低电平 // 关闭外部中断// 由高电平变低电平,触发外部中断 0// 红外遥控初始化{ IT1=1; EX1=1;TRIG=1;}del ay(60);} void main(){ uint i; delay(50); init_test(); TR1=1; LCD1602_Init() ; delay(50); while(state_2==0)// 外部中断 1 为负跳变触发 // 允许外部中断 1 // 为高电平 I/O 口初始化// 等待硬件操作// 开启定时器 1{if(KEY1==0){Delay10ms(); // 消除抖动 if(KEY1==0) {state_total=0; // 总状态定义 0 为自动循迹模块 1 为自动避障模块2 为红外遥控while((i<30)&&(KEY1==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}}if(TRIG==0){while((i<30)&&(TRIG==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}if(KEY2==0){while((i<30)&&(KEY2==0))// 检测按键是否松开{Delay10ms(); i++; }i=0;// 检测按键 s1 是否按下//检测按键s2是否按下障模块Delay10ms(); // 消除抖动 if(TRIG==0) {state_total=1; 2 为红外遥控//总状态定义 0 为自动循迹模块 1 为自动避// 检测按键 s3 是否按下障模块Delay10ms(); // 消除抖动 if(KEY2==0) {state_total=2; 2 为红外遥控// 总状态定义 0 为自动循迹模块1 为自动避}}} init_test();delay(50); // 等待硬件操作50us TR1=0; // 关闭定时器 1 if(state_total==1) {//SPEED=90; bizhang_test();} if(state_total==0) {// SPEED=98; 电平// 自动循迹速度控制// 自动循迹速度控制高电平持续次数占空比为10 的低电平高电平持续次数占空比为40 的低xunji_test(); }if(state_total== 2){//SPEED=98; // 自动循迹速度控制高电平持续次数占空比为40 的低电平hongwai_test(); }void 断号init0_suspend(void)2 外部中断0 4 串口中断外部中断 1timeH=TH0;timeL=TL0;state=1;EX0=0;}void 断号0{if(state_total==1) { TH0=0X00;TL0=0x00;}if(state_total==0) { TH0=0Xec;TL0=0x78;time_1++;interrupt 0 //3 为定时器 1 的中断号 1 定时器0 的中// 记录高电平次数//// 标志状态为// 关闭外部中断1,表示已接收到返回信号//3 为定时器 1 的中断号2 外部中断0 4 串口中断time0_suspend0(void) interrupt 1外部中断 1// 自动避障初值装入// 装入初值// 自动循迹初值装入// 装入初值定时一次200hz// 控制转弯延时计数1 定时器0 的中}}void IR_IN(void){unsigned char j,k,N=0;EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return;}//确认IR 信号出现//等IR 变为高电平,跳过 9ms 的前导低电平信号。

智能循迹小车程序

智能循迹小车程序

#include<reg52.h> #define uchar unsigned char#define uint unsigned int//D0-D7:f,b,a,e,d,h,c,g 共阴 依次编码 //74LS04 反相器驱动数码管uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7};uchari = 0; // 用于 0-3 数码管轮流显示 uintj = 0; // 计时的次数 uinttime=0; // 计时 uintpwm=16; // 占空比 uintspeed; //调制PWM 波的当前的值// 电机驱动口定义sbitENB=P1A0; // 前轮电机停止控制使能 sbitENA=P1A1; // 后轮控制调速控制端口 sbitIN1=P1A2; // 前轮 sbitIN2=P1A3; // 前轮 sbitIN3=P1A4; // 后轮 sbit IN4=P1A5; // 后轮void Init(){TMOD = 0x12; // 定时器 0 用方式 2, 定时器 1 用方式 1TH0=(256-200)/256; //pwmTL0=(256-200)/256;TH1 = 0x0F8; // 定时 2msTL1 = 0x30;EA = 1;ET0 = 1;ET1 = 1;TR0 = 1;TR1 = 1;}void tim0(void) interrupt 1 //产生 PWM{ speed ++; if(speed <= pwm)sbitR=P3A 2; // 右边传感器 P3A 2 sbit L=P3A3; // 左边传感器 P3A3 //pwm 就相当于占 100 的比例ENA = 1;}else if(speed < 100) {ENA = 0;}elsespeed = 0;}void time1() interrupt 3 {TH1 = 0x0F8;TL1 = 0x30;i =(i+1) % 4; j++;if(i == 0){ P0 = 0x00; P0 = table[time%10]; } if(i == 1) {P0 = 0x00;P0 = table[time/ 10% 10]; } if(i == 2) { P0 = 0x00;P0 = table[time/ 100% 10]; } if(i == 3) {P0 = 0x00;P0 = table[time/ 1000% 10];}P2 = ( 0x10 << i );// 送位选信号 if(j == 500){time ++; //500 次为 1 秒 j = 0;void forward() // 前进{IN2=1;IN1=0;}void back() // 后退{IN2=0;IN1=1;}void left()// 左转{ ENB=1;// 打开使能 IN3=1;// 定时 2ms //0-3 循环// 显示最低位数码管// 段选清零防止乱码// 送段码信号IN4=0;}void right() // 右转{ENB=1; // 打开使能IN3=0;IN4=1;}void stop() // 停止{IN2=0;IN1=0;IN3=0;IN4=0;}void main(){Init(); // 定时器初始化while(1){if(R==0 && L==1) // 右传感器检测到黑线{right(); // 右转forward();while(R==0 && L==1);}if(R==1 && L==0) // 左传感器检测到黑线{left(); forward(); while(R==1 && L==0);}if(R==0 && L==0) // 都检测到黑线则停止{stop();j = 0; // 定时器仍在工作,计数时间清空} else // 都没有检测到黑线{ENB = 0; // 关闭转向控制forward();}}}。

智能寻光小车源程序

智能寻光小车源程序

智能寻光小车源程序#include#define uchar unsigned char//宏定义#define uint unsigned int//宏定义sbit zuo1=P0^0;//定义控制左边电机的单片机引脚sbit zuo2=P0^1;//定义控制左边电机的单片机引脚sbit you1=P0^2;//定义控制右边电机的单片机引脚sbit you2=P0^3;//定义控制右边电机的单片机引脚sbit qh=P1^0;//前后控制位sbit zy=P1^1;//左右控制位sbit ting=P1^2;//停止控制位void delay(uint z)//一个带参数的延时程序{int i,j;//定义两个变量for(i=10;i>0;i--)for(j=z;j>0;j--);//将参数z赋值给j}void goright()//前进右转子程序{zuo1=0;zuo2=1;//左边轮子正转delay(24);//pwm有用值,越大左边方向的轮子越快zuo1=1;//关闭左边轮子you1=0;you2=1; //右边轮子正转delay(10);//pwm有用值,越大右边的轮子越快you1=1;//关闭右边轮子delay(80);//pwm无用值,越大,小车跑的越慢}void goleft()//前进左转子程序{zuo1=0;zuo2=1;//左边轮子正转delay(10);//pwm有用值,越大左边方向的轮子越快zuo1=1;//关闭左边轮子you1=0;you2=1; //右边轮子正转delay(24);//pwm有用值,越大右边的轮子越快you1=1;//关闭右边轮子delay(80);//pwm无用值,越大,小车跑的越慢}void down()//停止子程序{zuo1=1;zuo2=1;you1=1;you2=1; //左右轮全部停止}void main(){while(1){zy=1;qh=1;ting=1;//初始化各个引脚while(ting==1)//如果中间传感器检测到光亮则认为是遇到光源,就停止{down();}if(qh==0&&zy==1)//当前后传感器为0且左边传感器触发时,前进左转goleft();if(qh==0&&zy==0)//当前后传感器为0且右边传感器触发时,前进右转goright();}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

巡线车程序(完整版)1 #ifndef _Macro.h_2 #define _Macro.h_3 #include <msp430x14x.h>4 #include <intrinsics.h>5 #define uchar unsigned char6 #define uint unsigned int7 #define one 11.118 #define LMAX 19999 #define RMAX 399910 #define CPU_F ((double)8000000)11 #define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))1213 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))14 #define PC 20 // 比例放大系数15 #define IC 0 //积分放大系数16 #define DC 85 //大系数17 #define LEFTOUT TACCR118 #define RIGHTOUT TACCR219 #define SensorIn P5IN20 #define F 5000//5000hz21 #define Period (8000000/F)22 #define EnableLeftPos P3OUT|=BIT123 #define UnenableLeftPos P3OUT&=~BIT12425 #define EnableLeftNeg P3OUT|=BIT026 #define UnenableLeftNeg P3OUT&=~BIT02728 #define EnableRightPos P3OUT|=BIT229 #define UnenableRightPos P3OUT&=~BIT23031 #define EnableRightNeg P3OUT|=BIT332 #define UnenableRightNeg P3OUT&=~BIT33334 #define Basic_Left 100//百分之八十35 #define Basic_Right 100//Basic_Left36 #define MAX (100)37 #define MIN (-100)38 #define foreward 139 #define backward 040 #define max_speed 10041 #define min_speed -10042 #define key 0434445 #define left_1 146 #define left_2 247 #define left_3 348 #define left_4 449 #define left_5 550 #define left_6 651 #define left_7 7//右直角5253 #define right_1 -154 #define right_2 -255 #define right_3 -356 #define right_4 -457 #define right_5 -558 #define right_6 -659 #define right_7 -7//左直角60 #endif[cpp]view plaincopy61 #include "Macro.h"62 #include "sensor.h"63 void Motorstop()64 {65 LEFTOUT=0;66 RIGHTOUT=0;67 }68 void MotorLeft(int speed,int direction)69 {70 if(speed>max_speed)speed=max_speed;71 if(direction==backward)//反转72 {73 EnableLeftNeg;74 UnenableLeftPos;75 }76 else if(direction==foreward)//正转77 {78 EnableLeftPos;79 UnenableLeftNeg;80 }81 LEFTOUT=Period/100*speed;82 }83 void MotorRight(int speed,int direction)84 {85 if(speed>max_speed)speed=max_speed;8687 if(direction==backward)//反转88 {89 EnableRightNeg;90 UnenableRightPos;91 }92 else if(direction==foreward)//正转93 {94 EnableRightPos;95 UnenableRightNeg;96 }97 RIGHTOUT=Period/100*speed;98 }99 void MotorDrive(int PIDout)100 {101 int speedleft,speedright;102 speedleft=Basic_Left PIDout;103 speedright=Basic_Right-PIDout;104105 if(speedleft<0)106 MotorLeft(speedleft,backward);//反转107 else MotorLeft(speedleft,foreward);//正转108109 if(speedright<0)110 MotorRight(speedright,backward);//反转111 else MotorRight(speedright,foreward);//正转112 }113 void Rangle(float angle)114 {115 // TBCTL|=TBCLR;116 TBCCR1=LMAX (unsigned int)(angle*one);117 }[cpp]view plaincopy118 //下面是小车的程序。

用定时器A来输出两路PWM波。

119 //选用输出模式7(首先输出高电平。

在TAR=CCRX时,电平自动变低。

这样可以输出任意占空比的PWM波)120 // 传感器接在P5口,电机的驱动接在P3口。

121 #include "Macro.h"122 #include "motor.h"123 typedef struct p124 {125 float error_1;//上次的误差126 float sumerror;127 }PID;128 PID Pid;129 PID *pid=&Pid;130 uchar detection,sample=0,corner,k,flag,tt=0;131 int weight1[]={-8,-5,-3,-2,0,2,3,5,8};//传感器的权值132 float sensorin;133 int num,tag=1;134 void IO_inti()//io口初始化135 {136 P1SEL|=BIT2 BIT3;//p1为定时器输出端。

137 P1DIR|=BIT2 BIT3;//设置为输出模式。

P5为传感器输入。

138 P3DIR|=BIT0 BIT1 BIT2 BIT3 BIT4;//0,1,2,3,作为电机控制的输出端,其他的作为传感器的输入端139 P5DIR=0X00;//P5为传感器输入端。

设置P5为输入端。

普通IO口。

140 P5SEL=0x00;141142143 P2DIR=0X00;//输入144145 P2IE|=BIT3;146 P2IES|=BIT3;147148 P6DIR=0XFF;//纯粹是为了调试用的。

149 P6OUT=0X00;150151 }152 void delay(int t)153 {154 unsigned int i;155 while(t--)156 {157 i=65535;158 while(i--);159 }160 }161 void CLK_inti()//时钟初始化162 {163 BCSCTL1=0X00;//打开XT2164 do{165 IFG1&=~OFIFG;166 for(int i=0x20;i>0;i--);167 }while((IFG1&OFIFG)==OFIFG);//如果起震失败。

继续起震。

知道成功为止168 BCSCTL2=0X00;169 BCSCTL2|=SELM_2|SELS;//mclk,sMCLK的时钟源为XT2,0分频。

170 }171172 void PID_inti()//PID初始化173 {174 pid->error_1=0;175 pid->sumerror=0;176 }177178 void PWM_inti()//PWM初始化179 {180 TACTL|=TASSEL_2|ID_0|MC_1|TACLR;//时钟源采用SMCLK,增计数模式。

清空TAR,0分频181 TACCR0=8000000/F;//0分频。

所以Period=8000000/5000182 TACCTL1|=OUTMOD_7;//两个PWM输出口的输出模式。

183 TACCTL2|=OUTMOD_7;//184 LEFTOUT=0;185 RIGHTOUT=0;186 }187188 float abs(float a)189 {190 return a<0?-a:a;191 }192193 void timer_inti()//用定时器B1来确定采样周期194 {195 TBCTL|=TBSSEL_2|CNTL_0|ID_3|MC_1|TBCLR;//定时器B:SMCLK,16位,8分频,增计数196 TBCCTL0|=CCIE;//使能timerb1的中断。

197 TBCCR0=5000;//八分频,1MHz,5000表示5ms。

198 _EINT();//打开总中断。

199 }200 void num_inti()201 {202 sensorin=0;203 num=0;204 }205 void inti()//总初始化函数206 {207 PID_inti();208 CLK_inti();209 PWM_inti();210 IO_inti();211 timer_inti();212 num_inti();213 }214 float ReadSensor2()215 {216 int state=0,i,num=0;217 float sum=0;218 static float output=0;219 state=P3IN&0X80;220 state<<=1;221 state|=P5IN;222 for(i=0;i<9;i )223 if(((1<<i)&state)==0)224 {225 sum =weight1[i];226 num ;227 }228 if(num>0&&num<7)//不是全白或者全黑229 {230 corner=0;231 if(num>=3)232 {233 corner=1;234 if(sum>0)235 output=10;236 else output=-10;237 return output;238 }239 output=sum/num;240 }241 else if(num>=7)//如果是全黑。

相关文档
最新文档