|
還有個(gè)控制機(jī)械臂的加行走8個(gè)電機(jī)的紅外遙控機(jī)器人的程序。- /**********************************************************
- 正確的外部中斷1 P3^3紅外接收 控制LED燈
- 并顯示鍵值
- 紅外遙控控制機(jī)械臂
- P0^6位使能。PO^7段使能。P2口輸出數(shù)據(jù)
- 單片機(jī):STC89C52
- 晶振:11.0592M
- 蘇義江
- 2015年4月22日
- *********************************************************/
- #include<12c5a.h>
- #define QIANJIN a=1;b=0;c=1;d=0;
- #define HOUTUI a=0;b=1;c=0;d=1;
- #define ZUOZHUAN a=0;b=1;c=1;d=0;
- #define YOUZHUAN a=1;b=0;c=0;d=1;
- #define STOP a=1;b=1;c=1;d=1;
- sbit wei =P0^6;
- sbit duan=P0^7;
- sbit ting =P2^7;
- sbit xzdj1a =P0^0;//行走電機(jī)
- sbit xzdj1b =P0^1;
- sbit xzdj2a =P0^2;
- sbit xzdj2b =P0^3;
- sbit toua =P0^6;//頭電機(jī)
- sbit toub =P0^7;
- sbit shoua =P1^0;//手電機(jī)
- sbit shoub =P1^1;
- sbit wana =P1^2;//腕電機(jī)
- sbit wanb =P1^3;
- sbit zhoua =P1^4;//肘電機(jī)
- sbit zhoub =P1^5;
- sbit zhou1a=P1^6;
- sbit zhou1b=P1^7;
- sbit jiana =P2^0;//肩電機(jī)
- sbit jianb =P2^1;
- sbit jian1a=P2^2;
- sbit jian1b=P2^3;
- uchar irtime; //紅外時(shí)間
- uchar startflag; //起始標(biāo)志位
- uchar irdata[33];//多少個(gè)數(shù)據(jù)
- uchar bitnum; //第幾位
- uchar irreceok; //紅外接收完成
- uchar ircode[4]; //用戶碼和鍵值碼4位
- uchar irprosok; //紅外接收結(jié)束
- uchar disp[4]; //分離出4位數(shù)據(jù)顯示
- uchar code table[]={0xfe,0xfd,0xfb,0xf7};
- // 0xef,0xbf,0xdf,0x7f};
- uchar code smg[]={0xC0,0xF9,0xA4,0xB0,0x99,
- 0x92,0x82,0xf8,0x80,0x90,0x88,
- 0x83,0xC6,0xA1,0x86,0x8E};
- /*void delay_50ms(uint t)//12m晶振50ms秒延時(shí)
- {
- uint j;
- for(;t>0;t--)
- for(j=6245;j>0;j--);
- }
- void delay_1ms(uint t)//12m晶振1ms秒延時(shí)
- {
- uint j,k;
- for(j=t;j>0;j--)
- for(k=120;k>0;k--);
- }*/
- void delay_50us(uint t)//12m晶振50us秒延時(shí)
- {
- uchar j;
- for(;t>0;t--)
- for(j=19;j>0;j--);
- }
- void timer0init() //定時(shí)器初始化
- {
- // TMOD=0X12;//T1方式1.T0方式2
- TMOD=0X02;//T0方式2
- TH0=0X00;//高8位清零
- TL0=0X00;//低8位清零
- EA=1;
- ET0=1;
- TR0=1;
- }
- void int0init()//外部中斷1初始化
- {
- IT1=1; //下降沿觸發(fā)
- EX1=1; //打開外部中斷1
- EA=1; // 開總中斷
- }
- void irwork()//分離16進(jìn)制紅外數(shù)據(jù)
- {
- disp[2]=ircode[0]/16;//鍵值碼
- disp[1]=ircode[0]%16;
- disp[3]=ircode[2]/16;//識(shí)別碼
- disp[0]=ircode[2]%16;
- }
- void shoushen()
- {
- shoua=1;
- shoub=0;
- }
- void shouzhua()
- {
- shoua=0;
- shoub=1;
- }
- void wanzuo()
- {
- wana =1;
- wanb=0;
- }
- void wanyou()
- {
- wana =0;
- wanb=1;
- }
- void zhouzuo()
- {
- zhoua=1;
- zhoub=0;
- }
- void zhouyou()
- {
- zhoua=0;
- zhoub=1;
- }
- void zhoushang()
- {
- zhou1a=1;
- zhou1b=0;
- }
- void zhouxia()
- {
- zhou1a=0;
- zhou1b=1;
- }
- void xzqianjin()
- {
- xzdj1a =1;
- xzdj1b =0;
- xzdj2a =1;
- xzdj2b =0;
- }
- void xzhoutui()
- {
- xzdj1a =0;
- xzdj1b =1;
- xzdj2a =0;
- xzdj2b =1;
- }
- void xzzuozhuan()
- {
- xzdj1a =0;
- xzdj1b =1;
- xzdj2a =1;
- xzdj2b =0;
- }
- void xzyouzhuan()
- {
- xzdj1a =1;
- xzdj1b =0;
- xzdj2a =0;
- xzdj2b =1;
- }
- void jianshang()
- {
- jiana=1;
- jianb=0;
- }
- void jianxia()
- {
- jiana=0;
- jianb=1;
- }
- void jianqian()
- {
- jian1a=1;
- jian1b=0;
- }
- void jianhou()
- {
- jian1a=0;
- jian1b=1;
- }
- void tingsha()
- {
- P0=0Xff;
- P2 =0XFF;
- P1=0XFF;
- }
- void display()//顯示
- {
- P2=0xfe;
- wei=1;
- wei=0;
- delay_50us(50);
- P2=smg[disp[0]];
- delay_50us(50);
- duan=1;
- duan=0;
- P2=0xff;
- P2=0xfd;
- wei=1;
- wei=0;
- delay_50us(50);
- P2=smg[disp[1]];
- delay_50us(50);
- duan=1;
- duan=0;
- P2=0xff;
- P2=0xfb;
- wei=1;
- wei=0;
- delay_50us(50);
- P2=smg[disp[2]];
- delay_50us(50);
- duan=1;
- duan=0;
- P2=0xff;
- P2=0xf7;
- wei=1;
- wei=0;
- delay_50us(50);
- P2=smg[disp[3]];
- delay_50us(50);
- duan=1;
- duan=0;
- P2=0xff;
-
- }
- /*void display()//顯示
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- duan=1;
- duan=0;
- P2=smg[disp[i]];
- delay_50us(50);
- wei=1;
- wei=0;
- P2=table[i];
- delay_50us(20);
- }
- }*/
- void irpros()//紅外處理
- {
- uchar k,i,j;
- uchar value; //紅外數(shù)據(jù)值
- k=1; //從第一個(gè)數(shù)據(jù)碼開始
- for(j=0;j<4;j++)//只取出4組碼
- {
- for(i=0;i<8;i++)//8位數(shù)據(jù)循環(huán)8次
- {
- //右移一位。移動(dòng)7次。從低位開始移
- value=value>>1;
- //循環(huán)這個(gè)判斷語(yǔ)句8次.判斷是1 還是0
- //大于7為 1. 小于7為 0
- if(irdata[k]>7)
- {
- value=value|0x80;
- }
- k++;
- }
- //把數(shù)據(jù)放到數(shù)組中
- ircode[j]=value;
- }
- irprosok=1;
- }
- void main()
- {
- timer0init() ;
- int0init();
- while(1)
- {
- if(irreceok)
- {
- irpros();
- irreceok=0;
- }
- if(irprosok)
- {
- irwork();
- irprosok=0;
- }
- display();
- switch(ircode[2])
- {
- // case 0x05: QIANJIN ;break;
- // case 0x06: HOUTUI ;break;
- // case 0x07: ZUOZHUAN;break;
- // case 0x08: YOUZHUAN;break;
- // case 0x04: STOP ; break;
- case 0x02: xzqianjin(); break;//電視遙控器鍵值
- case 0x0a: xzhoutui() ;break;//電視遙控器鍵值
- case 0x07: xzzuozhuan();break;//電視遙控器鍵值
- case 0x05: xzyouzhuan(); break;//電視遙控器鍵值
- case 0x06: tingsha(); break;//電視遙控器鍵值
- case 0x18: tingsha(); break;
- case 0x17: shoushen(); break;
- case 0x14: shouzhua(); break;
- case 0x16: wanzuo(); break;
- case 0x13: wanyou(); break;
- case 0x15: zhoushang();break;
- case 0x12: zhouxia(); break;
- case 0x11: zhouzuo(); break;
- case 0x1a: zhouyou(); break;
- case 0x10: jianqian(); break;
- case 0x0e: jianhou(); break;
- case 0x0f: jianshang();break;
- case 0x19: jianxia(); break;
-
-
- default:break;
- }
- }
- }
- void timer0() interrupt 1//定時(shí)器0中斷服務(wù)函數(shù)
- {
- irtime++; //加到255自動(dòng)清零再加
- }
- void int0() interrupt 2//定時(shí)器1中斷服務(wù)函數(shù)
- {
- if(startflag)
- {
- if(irtime>32)//檢測(cè)引導(dǎo)碼
- {
- bitnum=0;
- }
- irdata[bitnum]=irtime;
- irtime=0;
- bitnum++;
- if(bitnum==33)
- {
- bitnum=0;
- irreceok=1;//紅外接收結(jié)束
- }
- }
- else
- {
- startflag=1;
- irtime=0;
- }
-
- }
復(fù)制代碼 |
|