用51单片机做的灭火机器人程序,pwm控制速度正反转,能够实现自动寻找火源并灭火。此机器人在电子竞赛中获
单片机源程序如下:
- #include<reg52.h>
- #include<math.h>
- #include<math.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit IN_L1=P1^3; //左轮电机控制1 //
- sbit IN_L2=P1^2; //左轮电机控制2 //
- sbit IN_R1=P1^0; //右轮电机控制1 //
- sbit IN_R2=P1^1; //右轮电机控制2 //
- sbit PWMA=P1^6; //左轮电机PWM波输出 //
- sbit PWMB=P1^5; //右轮电机PWM波输出 //
- sbit HONG_L=P3^0;
- sbit HONG_M=P3^1;
- sbit HONG_R=P3^2; //红外避障,左,中,右
-
- sbit S_L=P3^4;
- sbit S_R=P3^5; //寻迹传感器,
- sbit J_L=P3^6;
- sbit J_R=P3^7; //计数器,左轮,右轮
- sbit DJ=P0^0; // 电机
- sbit SPK=P2^1; //蜂鸣器
- sbit HUO_L=P2^3;
- sbit HUO_R=P2^4; //探测到火源 ,为低电位
- uchar SpeedTemp1=0; //左轮电机速度锁定变量
- uchar SpeedTemp2=0; //右轮电机速度锁定变量
- uchar SpeedLeft=0; //左轮电机速度设定变量
- uchar SpeedRight=0; //右轮电机速度设定变量
- uchar Timer0=0; //定时器T0中断次数计数变量
- uint i,j,k,n;
- void Motor(uchar Select,char Speed) //Select为电机选择,左轮为1,右轮为2 //Description:电机速度,正反转传递程序
- {
- if(Select==1) //对左轮电机的处理
- {
- SpeedLeft=abs(Speed); //取速度的绝对值
- if(Speed>=0)
- {
- IN_L1=0;
- IN_L2=1; //如果速度为非负,则正转
- }
- else
- {
- IN_L1=1;
- IN_L2=0; //如果速度为负,则反转
- }
- }
- if(Select==2) //对右轮电机的处理
- {
- SpeedRight=abs(Speed); //取速度的绝对值
- if(Speed>=0)
- {
- IN_R1=0;
- IN_R2=1; //如果速度为非负,则正转
- }
- else
- {
- IN_R1=1;
- IN_R2=0; //如果速度为负,则反转
- }
- }
- }
- void Delay(uint n) //Delay范围0 ~ 65535
- {
- uint j;
- while(n--!=0) //延时次数
- {
- for(j=0;j<110;j++) //延时1ms
- ;
- }
- } //总延时为Delay*1 ms
- void H_detect()
- {
- if(HUO_L==0)
- {
- for(i=1;i<640;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,-50);
- Motor(2,0);
- DJ=1;
- j=1;
- }
- }
- else
- if(HUO_R==0)
- {
- for(i=1;i<640;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,0);
- Motor(2,-50);
- DJ=1;
- j=2;
- }
- }
- else
- {
- Motor(1,80);
- Motor(2,80);
- j=0;
- }
- if((j==1)||(j==2))
- { DJ=1;
- for(i=0;i<500;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,0);
- Motor(2,0);
- }
- if(j==1)
- {
- for(i=1;i<1150;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,50);
- Motor(2,0);
- }
- }
- else
- {
- for(i=1;i<1150;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,0);
- Motor(2,50);
- }
- }
- DJ=0;
- Delay(200);
- }
- }
- void Move()
- {
- H_detect();
- if((S_L==0)&&(S_R!=0))
- {
- Motor(1,-10);
- Motor(2,80);
- }
- else
- {
- if((S_R==0)&&(S_L!=0))
- {
- Motor(1,80);
- Motor(2,-10);
- }
- else
- {if((S_R==0)&&(S_L==0))
- {
- Motor(1,80);
- Motor(2,80);
- }
- }
- }
- // Delay(100);
- Motor(1,80);
- Motor(2,80);
- }
- void Init()
- {
- IN_L1=1;
- IN_L2=1; //左轮电机刹车
- IN_R1=1;
- IN_R2=1; //右轮电机刹车
- PWMA=0; //左轮电机PWM波初始化
- PWMB=0; //右轮电机PWM波初始化
-
- TMOD=0x01; // 设定T0的工作模式为1,GATE=0说明以TR0启动定时器,C/T为0说明选择了定时模式
- TR0=0; //关闭定时器0
- TF0=0; //定时器溢出复位
- IE=0x00; //所有中断关闭
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256; //装入TO定时初值,定时时间为50us
- EA=1; //开中断
- ET0=1; //开定时器0的中断
- TR0=1; //启动定时器0
- }
- void main()
- { Init();
- DJ=0;
- n=1;
- while(n)
- {
- Motor(1,80);
- Motor(2,80);
- if((S_R!=0)&(S_L!=0))
- {
- for(i=1;i<95;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,80);
- Motor(2,0);
- } //右转九十度
- n=0;
- }
- }
- Delay(200);
- for(i=1;i<150;i++)
- for(k=1;k<110;k++)
- {
- Move();
- }
- for(i=1;i<180;i++)
- for(k=1;k<110;k++)
- {
- Motor(1,0);
- Motor(2,80);
- } //zuo转九十度
- while(1)
- {
- Move();
- }
- }
- void PwmTimer0() interrupt 1 //定时器0的中断服务程序来产生PWM波
- {
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256; //恢复定时器0的初值,定时时间50us
-
- if(Timer0==0) //1个PWM周期完成后才会接受新数值 ,即500us内锁定速度
- {
- SpeedTemp1=SpeedLeft; //锁定左轮电机的速度
- SpeedTemp2=SpeedRight; //锁定右轮电机的速度
- }
-
- if(Timer0<SpeedTemp1)
- PWMA=1;
- else
- PWMA=0; //产生左轮电机的PWM波
-
- if(Timer0<SpeedTemp2)
- PWMB=1;
- else
- PWMB=0; //产生右轮电机的PWM波
-
- Timer0++; //中断计数变量增1
- if(Timer0>=100) //设定PWM波周期为500us
- Timer0=0; //中断计数变量清0
- }
复制代码
所有资料51hei提供下载:
用51单片机做的灭火机器人程序,能够实现自动寻找火源并灭火。此机器人在电子竞赛中获.rar
(32.79 KB, 下载次数: 161)
|