|
紅外控制舵機
- /*******************************************************************************
- *具體操作: 使用配套的遙控,按按鍵,查看顯示屏鍵值。 *
- * 鍵值表: 45H 46H 47H *
- * 44H 40H 43H *
- * 07H 15H 09H *
- * 16H 19H 0DH *
- * 0CH 18H 5EH *
- * 08H 1CH 5AH *
- * 42H 52H 4AH *
- *******************************************************************************/
- #include<reg52.h>
- #define uchar unsigned char
- sbit IR=P3^3; //紅外中斷引腳
- sbit wela=P2^6; //數(shù)碼管為選位
- sbit dula=P2^5; //數(shù)碼管段選為
- sbit PWM=P1^5; //PWM信號輸出
- uchar IRCOM[7]; //鍵值存儲
- uchar code tab[]={ //共陽極數(shù)碼管段選數(shù)組
- 0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xf8,0x80,0x90};
- uchar dj,count; //dj舵機角度標識引腳
- void delay0(uchar x) //延時0.14ms
- {
- uchar i;
- while(x--)
- {
- for(i=0;i<13;i++);
- }
- }
- void inter() interrupt 2 //外部中斷
- {
- unsigned char j,k,N=0;
- EX1=0;
- delay0(15);
- if(IR==1)
- {
- EX1=1;
- return;
- }
- while(!IR)
- delay0(1); //跳過9ms低電平引導碼
- for(j=0;j<4;j++)
- {
- for(k=0;k<8;k++)
- {
- while(IR)
- delay0(1); //跳過4.5ms的高電平
- while(!IR)
- delay0(0); //跳過0.56ms低電平
- while(IR) //計算高電平的時間
- {
- delay0(1);
- N++;
- if(N>=30) //高電平過長終止外部中斷
- {
- EX1=1;
- return;
- }
- }
- IRCOM[j]=IRCOM[j]>>1;//向右移位補零
- if(N>=8)
- {
- IRCOM[j]=IRCOM[j]|0X80;
- } //如果為高電平IRCOM為1
- N=0;
- }
- }
- if(IRCOM[2]!=~IRCOM[3]) //原碼與反碼對比驗證,如果不正確則停止
- {
- EX1=1;
- // IROK=0;
- return;
- }
- IRCOM[4]=IRCOM[2]>>4; //高四位變低四位
- IRCOM[5]=IRCOM[2]&0X0F; //取鍵值得低四位
- IRCOM[7]=IRCOM[4]*16+IRCOM[5];//十六進制換算成十進制
- EX1=1;
- }
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(uchar num) //十進制鍵值顯示
- {
- uchar bai,shi,ge;
- bai=num/100;
- shi=(num%100)/10;
- ge=num%10;
- wela=1;
- P0=0x01;
- wela=0;
- P0=0XFF;
- dula=1;
- P0=tab[bai];
- dula=0;
- delay(5);
- wela=1;
- P0=0X02;
- wela=0;
- P0=0xff;
- dula=1;
- P0=tab[shi];
- dula=0;
- delay(5);
- wela=1;
- P0=0x04;
- wela=0;
- P0=0xff;
- dula=1;
- P0=tab[ge];
- dula=0;
- delay(5);
- switch(num)
- {
- case 7:
- dj--;
- count=0;
- if(dj==0)
- dj=1;
- break;
- case 21:
- dj++;
- count=0;
- if(dj==6)
- dj=5;
- break;
- default:
- break;
- }
- }
- /*void IRscan(uchar num)
- {
- uchar temp;
- temp=num;
- if(IROK!=0)
- {
- switch(num)
- {
- case 7:
- dj--;
- count=0;
- if(dj==0)
- dj=1;
- break;
- case 21:
- dj++;
- count=0;
- if(dj==6)
- dj=5;
- break;
- default:
- break;
- }
- IROK=0;
- }
- } */
- void main()
- {
- EA=1; //全局中斷開
- EX1=1; //外部中斷1開
- IT1=1;
- TMOD=0X010;
- TH1=0XFE;
- TL1=0X0C;
- ET1=1;
- TR1=1;
- count=0;
- while(1)
- {
- // IRscan(IRCOM[7]);
- display(IRCOM[7]);
- delay(2);
- }
- }
- void time1() interrupt 3
- {
- TH1=0XFE;
- TL1=0X0C;
- count++;
- if(count<dj)
- PWM=1;
- else
- PWM=0;
- count=count%40;
- }
復制代碼
|
-
-
舵機 紅外.rar
2016-3-15 10:27 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
21.55 KB, 下載次數(shù): 48, 下載積分: 黑幣 -5
|