最近偶然翻到以前的紅外小車程序,分享給大家,希望對大家有幫助。
單片機源程序如下:
- #include<reg52.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit IRIN=P3^2;
- sbit PWM1=P1^4;
- sbit PWM2=P1^5;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^2;
- sbit IN4=P1^3;
- u8 IrValue[6];
- u8 Time;
- void qianjin();
- void houtui();
- void zuozhuan();
- void youzhuan();
- void Time1Config();
- u8 DisplayData[8];
- u8 code smgduan[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
- #define L_go IN3=1;IN4=0 //×ó???°??
- #define R_go IN1=1;IN2=0 //óò???°??
- #define L_back IN3=0;IN4=1 //×ó??oóí?
- #define R_back IN1=0;IN2=1 //óò??oóí?
- #define L_stop IN3=0;IN4=0 //×ó??í£?1
- #define R_stop IN1=0;IN2=0 //óò??í£?1
- #define car_go L_go;R_go //D?3μ?°??
- #define car_back L_back;R_back //D?3μoóí?
- #define car_left R_stop;L_go //D?3μ×ó×a
- #define car_right L_stop;R_go //D?3μóò×a
- #define car_stop L_stop;R_stop //D?3μí£?1
- unsigned char timer1;
- void Delay(u16 i)
- {
- while(i--);
- }
- void DigDisplay() //switch case 語句
- {
- u8 i;
- for(i=0;i<3;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1):
- LSA=1;LSB=0;LSC=0; break;
- case(2):
- LSA=0;LSB=1;LSC=0; break;
- }
- P0=DisplayData[2-i];
- Delay(100);
- P0=0x00;
- }
- }
- void IrInit()
- {
- IT0=1;
- EX0=1;
- EA=1;
- IRIN=1;
- }
- void qianjin()
- {
- while(1)
- {
- car_go;
- if(timer1>100) //PWM周期為100*0.5ms
- {
- timer1=0;
- }
- if(timer1 < 50) //改變30這個值可以改變直流電機的速度
- {
- PWM2=1;
- }
- else
- {
- PWM2=0;
- }
- }
- if(timer1 < 20)
- {
- PWM1=1;
- }
- else
- {
- PWM1=0;
- }
- if(IrValue[2]!=0x18) break;
- }
- }
- void houtui()
- {
- while(1)
- {
- car_back;
- if(timer1>100) //PWM周期為100*0.5ms
- {
- timer1=0;
- }
- if(timer1 < 40) //改變30這個值可以改變直流電機的速度
- {
- PWM1=1;
- }
- else
- {
- PWM1=0;
- }
- }
- if(timer1 < 20)
- {
- PWM2=1;
- }
- else
- {
- PWM2=0;
- }
- if(IrValue[2]!=0x52) break;
- }
- }
- void zuozhuan()
- {
- while(1)
- {
- car_left;
- if(timer1>100) //PWM周期為100*0.5ms
- {
- timer1=0;
- }
- if(timer1 < 40) //改變30這個值可以改變直流電機的速度
- {
- PWM1=1;
- }
- else
- {
- PWM1=0;
- }
- }
- if(timer1 < 20)
- {
- PWM2=1;
- }
- else
- {
- PWM2=0;
- }
- if(IrValue[2]!=0x08)
- {
- break;
- }
- }
- }
- void youzhuan()
- {
- while(1)
- {
- car_right;
- if(timer1>100) //PWM周期為100*0.5ms
- {
- timer1=0;
- }
- if(timer1 < 40) //改變30這個值可以改變直流電機的速度
- {
- PWM1=1;
- }
- else
- {
- PWM1=0;
- }
- }
- if(timer1 < 20)
- {
- PWM2=1;
- }
- else
- {
- PWM2=0;
- }
- if(IrValue[2]!=0x5a) break;
- }
- }
- void main()
- {
- IrInit();
- Time1Config();
- while(1)
- {
- DisplayData[0] = smgduan[IrValue[2]/16];
- DisplayData[1] = smgduan[IrValue[2]%16];
- DisplayData[2] = smgduan[16];
- DigDisplay();
- switch(IrValue[2])
- {
- case 0x52 :qianjin();break;
- case 0x18 :houtui();break;
- case 0x45 :car_stop;break;
- case 0x5a :zuozhuan();break;
- case 0x08 :youzhuan();break;
- }
- }
- }
- void ReadIr() interrupt 0
- {
- u8 j,k;
- u16 err;
- Time=0;
- Delay(700); //7ms
- if(IRIN==0) //è·è?ê?·???μ??óê?μ??yè·μ?D?o?
- {
-
- err=1000; //1000*10us=10ms,3?1y?μ?÷?óê?μ?′í?óμ?D?o?
- /*μ±á???ì??t???a??ê??-?·£?è?1?óDò???ì??t?a?ùμ?ê±oòì?3??-?·£??aμ?3ìDò3?′íμ?ê±
- o?£?3ìDò?à?ú?aà?*/
- while((IRIN==0)&&(err>0)) //μè′y?°??9msμ?μíμ???1yè¥
- {
- Delay(1);
- err--;
- }
- if(IRIN==1) //è?1??yè·μèμ?9msμíμ???
- {
- err=500;
- while((IRIN==1)&&(err>0)) //μè′y4.5msμ??eê???μ???1yè¥
- {
- Delay(1);
- err--;
- }
- for(k=0;k<4;k++) //12óD4×éêy?Y
- {
- for(j=0;j<8;j++) //?óê?ò?×éêy?Y
- {
- err=60;
- while((IRIN==0)&&(err>0))//μè′yD?o??°??μ?560usμíμ???1yè¥
- {
- Delay(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //??????μ???μ?ê±??3¤?è?£
- {
- Delay(10); //0.1ms
- Time++;
- err--;
- if(Time>30)
- {
- return;
- }
- }
- IrValue[k]>>=1; //k±íê?μú??×éêy?Y
- if(Time>=8) //è?1???μ???3???′óóú565us£????′ê?1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //ó?íêê±??òa??D??3?μ
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- }
- void Time1Config()
- {
- TMOD|= 0x10; //設置定時計數器工作方式1為定時器
- //--定時器賦初始值,12MHZ下定時0.5ms--//
- TH1 = 0xFE;
- TL1 = 0x0C;
-
- ET1 = 1; //開啟定時器1中斷
- EA = 1;
- TR1 = 1; //開啟定時器
- }
- void Time1(void) interrupt 3 //3 為定時器1的中斷號 1 定時器0的中斷號 0 外部中斷1 2 外部中斷2 4 串口中斷
- {
- TH1 = 0xFE; //重新賦初值
- TL1 = 0x0C;
- timer1++;
- }
復制代碼
所有資料51hei提供下載:
遙控小車 - 副本.zip
(27.78 KB, 下載次數: 17)
2018-8-5 03:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|