QQ圖片20171031205821.png (94.06 KB, 下載次數: 83)
下載附件
2017-10-31 21:04 上傳
用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
- }
復制代碼
0.png (8.97 KB, 下載次數: 87)
下載附件
2017-11-1 01:54 上傳
所有資料51hei提供下載:
用51單片機做的滅火機器人程序,能夠實現自動尋找火源并滅火。此機器人在電子競賽中獲.rar
(32.79 KB, 下載次數: 161)
2017-10-31 21:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|