|
智能车的原理图如下:
单片机源程序:
- include "reg52.h"
- # include<intrins.h>
- //定义全局变量
- char count=0,cheer=0; // 调节占空比
- char left=0,right=0; // 左右轮速度 可在主函数中修改
- char duojizhongzhi=0; // 舵机中值
- // 定义I/O口
- // 定义 红外检测 电机引脚 舵机 以上IO口可修改
- // 定义 红外检测
- sbit hw1=P2^0;
- sbit hw2=P2^1;
- sbit hw3=P2^2;
- sbit hw4=P2^3;
- sbit hw5=P2^4;
- sbit hw6=P2^5;
- sbit hw7=P2^6;
- sbit hw8=P2^7;
- //定义电机I/O口 可修改
- sbit dianji1=P1^0;
- sbit dianji2=P1^1;
- sbit dianji3=P1^2;
- sbit dianji4=P1^3;
- // 定义舵机 I/O口 可修改
- sbit duoji=P1^7;
- // 申明 自定义函数 // 不懂勿动
- void time1init();
- void time0init();
- // 红外检测情况 如果用少于8个红外 可自行删减
- int hongwaijiance () //8个红外检测黑线情况 返回值为 整形
- { //红外信号为1检测白,为0检测黑(不一定,根据情况自行调整0和1)
- if((hw1==0)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //左边第一个检测到黑线并且其余
- return 1; //7个检测白,此时返回1
-
- if((hw1==1)&&(hw2==0)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) // 左边第二个检测黑线并且其余7个
- return 2; //检测白,此时返回2
-
- if((hw1==1)&&(hw2==1)&&(hw3==0)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //
- return 3;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==0)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //
- return 4;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==0)&&(hw6==1)&&(hw7==1)&&(hw8==1) ) //
- return 5;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==0)&&(hw7==1)&&(hw8==1) ) //
- return 6;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==0)&&(hw8==1) ) //
- return 7;
-
- if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==0) ) //
- return 8;
-
- return 0; // 以上情况都没有 什么都不执行
- }
- // 延时函数 延时2S 用于延时启动
- void delay2s() //误差 0us
- {
- unsigned char a,b,c,n;
- for(c=167;c>0;c--)
- for(b=39;b>0;b--)
- for(a=152;a>0;a--);
- for(n=1;n>0;n--);
- }
- // 主函数
- void main()
- {
- char Data,Data_1;
- time0init(); // 定时器函数
- time1init(); // 定时器函数
- left=50; // 左轮速度
- right=50; // 右轮速度
- duojizhongzhi=15; // 舵机中值
- delay2s(); // 延时启动
- while(1)
- {
- Data=hongwaijiance(); //对变量 Data 赋值
- if(Data == 0) //
- Data=Data_1; //
- Data_1=Data; //这4句使车冲出去后能自己回来
- // 停车程序
- if((hw1==0)&&(hw2==0)&&(hw3==0)&&(hw4==0)&&(hw5==0)&&(hw6==0)&&(hw7==0)&&(hw8==0) )
- {
- _nop_();
- _nop_();
- if ( (hw1==0)&&(hw2==0)&&(hw3==0)&&(hw4==0)&&(hw5==0)&&(hw6==0)&&(hw7==0)&&(hw8==0) )
- {
- left=0;
- right=0;
- duojizhongzhi=16; // 此时该值为舵机在最中央位置的值 也就是中值
- }
- }
- switch(Data) //switch语句对之前红外检测情况进行处理(由实际情况调整里面各变量数值)
- {
- case 1: duojizhongzhi = 16;left = 90;right =20; _nop_(); _nop_(); break; //Delay_Nms(8)给舵机转动留时间,数8可调整
- case 2: break;
- case 3: break;
- case 4: break;
- case 5: break;
- case 6: break;
- case 7: break;
- case 8: break;
-
- default:
- break;
- }
-
-
- }
- }
- // 定时器 0 中断
- void time0init()
- {
- TMOD=0X11;
- TH0=0XFF;
- TL0=0XF6;
- ET0=1;
- TR0=1;
- EA=1;
- }
- // 定时器 1 中断
- void time1init()
- {
- // TMOD=0X11;
- EA=1;
- ET1=1;
- TR1=1;
- TL1=0XF6;
- TH1=0XFF;
- }
- // 定时器0控制电机速度
- /***********************
- 占空比越大 速度越快
- ************************/
- void time0() interrupt 1 // 定时器0执行函数 中断号1
- {
- //重新装载
- TL0=0XF6; // 初值
- TH0=0XFF; // 每隔10US 进一次中断
- count++; //占空比不断增加
- if(count>100)
- count=0;
- if(count<left) // 占空比对应的速度小于需要的速度 让电机加速
- {
- dianji1=1;
- dianji2=0;
- }
- else
- {
- dianji1=0;
- dianji2=1;
- }
- if(count<right) // 占空比对应的速度小于需要的速度 让电机加速
- {
- dianji3=1;
- dianji4=0;
- }
- else
- {
- dianji4=0;
- dianji3=1;
- }
- }
- // 定时器1控制舵机转向
- /***********************
- 占空比越大偏转的角度越大
- ***********************/
- void time1() interrupt 3 //定时器1执行函数 中断号3
- {
- TL1=0XF6;
- TH1=0XFF;
- cheer++; // 占空比增加
- if(cheer>100)
- cheer=0;
- if(cheer<duojizhongzhi) // 如果占空比所对应的角度没达到所需要的值
- duoji=1; // 高电平
- else
- duoji=0;
- }
复制代码- // 智能车程序
- # include "reg52.h" // 头文件 包含一定定义
- # include "intrins.h"
- // 用uint uchar 代替无符号整型 字符型
- typedef unsigned int uint ;
- typedef unsigned char uchar;
- // 定义 电机引脚 可修改
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- // 定义红外引脚 可修改
- sbit Infrared1=P0^0;
- sbit Infrared2=P0^1;
- sbit Infrared3=P0^2;
- sbit Infrared4=P0^3;
- sbit Infrared5=P0^4;
- sbit Infrared6=P0^5;
- sbit Infrared7=P0^6;
- sbit Infrared8=P0^7;
- // 定义舵机引脚 可修改
- sbit Servo=P2^0;
- // 定义变量 左右轮速度 及占空比 舵机中值
- uint speed_left=0, speed_right=0,count=0,add=0,djzz=0;
- uint receive; // 用于接受返回值
- // 定义自定义函数
- void time0init();
- void delay2s();
- void delay100us();
- uint HW() ;
- void Drive( uint left ,uint right,uint dj );
- void Stop();
- // 主函数
- void main()
- {
- uchar Data_1; //申明变量
- time0init(); // 不断执行定时器中断
- delay2s(); // 延时启动
- // 以下需要修改
- while(1)
- {
- djzz=15; //改这个值 使舵机居中
- delay100us();
- break;
- }
- speed_left=1; // 调节电机速度
- speed_right=1; // 调节电机速度
- // 以上需要修改
- while(1)
- {
- receive=HW(); //receive接受HW函数返回值
- if(receive == 0) //使车自己回去
- receive=Data_1;
- Data_1=receive;
- HW(); //引用自定义函数
- Drive( speed_left,speed_right,djzz ); //引用自定义函数
- Stop(); //停止
- }
- }
- // 延时函数 延时2S
- void delay2s() //误差 0us
- {
- unsigned char a,b,c;
- for(c=127;c>0;c--)
- for(b=235;b>0;b--)
- for(a=32;a>0;a--);
- _nop_();
- }
- void delay100us() //误差 0us
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=47;a>0;a--);
- }
- //红外检测函数 //需要自己添加情况
- uint HW()
- {
- //如果红外一检测到 执行情况
- if( Infrared1==1&&Infrared2==0&&Infrared3==0&&Infrared4==0&&Infrared5==0&&Infrared6==0&&Infrared7==0&&Infrared8==0 )
- return 1;
- /*
- 以下情况复制上面自己改
- */
- else
- {
- return 0;
- }
- }
- // 电机驱动函数 //需要自己添加情况
- void Drive( uint left ,uint right,uint dj )
- {
- if( receive==1 )
- {
- left =10;
- right=10;
- dj=10;
- }
- /*
- 根据所需要自己添加
- */
- }
- /*******************************************************************************
- 以下函数不能修改
- *******************************************************************************/
- // 停止函数 当红外八个灯同时检测到 之后停止
- void Stop()
- {
- if( Infrared1==1&&Infrared2==1&&Infrared3==1&&Infrared4==1&&Infrared5==1&&Infrared6==1&&Infrared7==1&&Infrared8==1 )
- {
- delay100us();
- if( Infrared1==1&&Infrared2==1&&Infrared3==1&&Infrared4==1&&Infrared5==1&&Infrared6==1&&Infrared7==1&&Infrared8==1 )
- speed_left=0;
- speed_right=0;
- }
- }
- void time0init()
- {
- TMOD|=0X11;
- TH0=(65536-50)/256;
- TL0=(65536-50)%256;
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- ET0=1;
- ET1=1;
- EA=1;
- TR0=1;
- TR1=1;
- }
- // 定时器0 用于控制电机速度
- void Motor0 () interrupt 1
- {
- TR0=0;
- TH0=(65536-50)/256;
- TL0=(65536-50)%256;
- count++;
- if(count>100)
- {
- count=0;
- }
- if( count>speed_left ) //
- {
- IN1=0;
- IN2=0;
- }
- else
- {
- IN1=1;
- IN2=0;
- }
- if( count>speed_right ) //
- {
- IN3=0;
- IN4=0;
- }
- else
- {
- IN3=1;
- IN4=0;
- }
- TR0=1;
- }
- void ServoTemper() interrupt 3
- {
- add++;
- TH1=(65536-100)/256;
- TL1=(65536-100)%256;
- if( add>=200 )
- {
- add=0;
- }
- if( djzz>=add )
- {
- Servo=1;
- }
- else
- {
- Servo=0;
- }
- }<div class="quote"><blockquote>
复制代码
|
-
-
原理图.7z
826.6 KB, 下载次数: 55, 下载积分: 黑币 -5
-
-
最新库.7z
79.76 KB, 下载次数: 38, 下载积分: 黑币 -5
评分
-
查看全部评分
|