圖片1.png (136.21 KB, 下載次數(shù): 47)
下載附件
2018-5-10 22:17 上傳
單片機源程序如下:
- /* 模仿人機界面 通過遙控器控制馬達
- 其狀態(tài)通過LCD顯示
- 通過按第一個按鍵可以控制馬達的啟動和停止*/
- #include<reg52.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- sbit rs=P2^6;
- sbit rw=P2^5;
- sbit e=P2^7;
- uint8 d1[8]=" RED IR ";
- uint8 d2[12]="MOTO STATE: ";
- uint8 num[16]="0123456789ABCDEF";
- uint8 a[]={0x2d,0x03,0x17,0x02,0x2a,0x00,0x14,0x01};//A-AB-B-B`A-`A-`A`B-`B-`BA
- uint8 irtime; //接收時間
- uint8 startflag; //開始檢測
- uint8 bitnum; //bit位數(shù)
- uint8 irdata[33]; //寄存沒有個bit的時間
- uint8 irreceok; //接收完成標志位
- uint8 ircode[4]; //將接收的四個字節(jié)數(shù)據(jù)保存
- uint8 irprosok; //接收數(shù)據(jù)處理標志位
- uint8 irdisp[8]; //將四個字節(jié)的16進制通過轉換變成十進制存儲
- uint8 dat1,dat2;
- uint8 keynum;
- uint8 moto;
- void delay(uint16 i)
- {
- while(i--);
- }
- void lcdwrc(uint8 c)
- {
- delay(1000);
- rs=0;
- rw=0;
- e=0;
- P0=c;
- e=1;
- delay(10);
- e=0;
- /*
- P0=c<<4;
- e=0;
- */
- }
- void lcdwrd(uint8 dat)
- {
- delay(1000);
- rs=1;
- rw=0;
- e=0;
- P0=dat;
- e=1;
- delay(10);
- e=0;
- /*
- P0=dat<<4;
- e=0;
- */
- rs=0;
- }
- void lcdinit()
- {
- delay(1000);
- /*
- lcdwrc(0x32);
- lcdwrc(0x28);
- lcdwrc(0x28);
- */
- lcdwrc(0x38);
- lcdwrc(0x38);
- lcdwrc(0x38);
- lcdwrc(0x06);
- lcdwrc(0x0c);
- lcdwrc(0x01);
- }
- void int0init()
- {
- EA=1;
- EX0=1;
- IT0=1;
- }
- void time0init()
- {
- TMOD=0X02; //設置定時器0模式2.該模式為自動裝載模式
- TH0=0X00;
- TL0=0X00;//設定計數(shù)初值,每當TL0計數(shù)到255時,TH0將把自己的數(shù)據(jù)給TL0,又重新計數(shù)
- TR0=1;
- ET0=1;
- EA=1;
- }
- void irpros() //紅外接收數(shù)據(jù)處理 ,區(qū)分是數(shù)據(jù)0還是1
- {
- uint8 i,j,value;
- uint8 k=1; //引導碼去掉,所以令k=1;
- for(j=0;j<4;j++) //取出了一幀數(shù)據(jù)中的四個字節(jié)數(shù)據(jù)
- {
- for(i=0;i<8;i++) //取出了一個字節(jié)的數(shù)據(jù)
- {
- value>>=1;
- if(irdata[k]>6)
- {
- value=value|0x80;
- }
- k++;
- }
- ircode[j]=value;
- }
- irprosok=1;
- }
- void irwork() //將四個字節(jié)的數(shù)據(jù)轉換成10進制數(shù)顯示
- {
- irdisp[0]=ircode[0]/16;//顯示高位
- irdisp[1]=ircode[0]%16;//顯示低位
- irdisp[2]=ircode[1]/16;
- irdisp[3]=ircode[1]%16; //同一個遙控器此2個字節(jié)的引導碼數(shù)據(jù)是不會改變的,改變的只是數(shù)據(jù)碼及反碼
- irdisp[4]=ircode[2]/16;
- irdisp[5]=ircode[2]%16;
- irdisp[6]=ircode[3]/16;
- irdisp[7]=ircode[3]%16;
- dat1=irdisp[4];
- dat2=irdisp[5];
- keynum++;
- }
- void display()
- {
- uint8 i;
- lcdwrc(0x00+0x80);
- for(i=0;i<8;i++)
- {
- lcdwrd(d1[i]);
- }
- for(i=4;i<6;i++)
- {
- lcdwrd(num[irdisp[i]]);
- }
- lcdwrc(0x40+0x80);
- for(i=0;i<12;i++)
- {
- lcdwrd(d2[i]);
- }
- if(moto==1) //馬達狀態(tài)顯示
- {
- lcdwrd('O');
- lcdwrd('N');
- }
- else
- {
- lcdwrd('O');
- lcdwrd('F');
- lcdwrd('F');
- }
- }
- void motopros()
- {
- uint8 i;
- uint16 j=200;
- if((dat1==4)&&(dat2==5)&&(keynum==1)) //按下第一次按鍵開馬達
- {
- dat1=0;
- dat2=0;
- moto=1;
- while(j--)
- {
- for(i=0;i<8;i++)
- {
- P1=a[i];
- delay(75);
- }
- }
- }
-
- if((dat1==4)&&(dat2==5)&&(keynum>=2)) //按下第二次此按鍵時關閉馬達
- {
- dat1=0;
- dat2=0;
- keynum=0;
- moto=0;
- P1=0xff;
- }
- }
- void main()
- {
- lcdinit();
- int0init();
- time0init();
- while(1)
- {
- if(irreceok)
- {
- irreceok=0;
- irpros();
- if(irprosok)
- {
- irwork();
- }
- }
- motopros();
- display();
- }
- }
- void time0() interrupt 1
- {
- irtime++;//每進來一次就說明定時時間為256us;
- }
- void init0() interrupt 0
- {
- if(startflag)
- {
- if(irtime>32)//檢測引導碼,求法是用引導碼時間除以一次計數(shù)時間,看看要多少次
- {
- bitnum=0;
- }
- irdata[bitnum]=irtime;
- irtime=0;
- bitnum++;
- if(bitnum==33)
- {
- bitnum=0;
- irreceok=1;//一幀紅外數(shù)據(jù)接收完成標志
- }
- }
- else
- {
- startflag=1;//將開始標志位置1,等到下次進入中斷即可進入if語句
- irtime=0;//將開始之前的計數(shù)器時間清零。等到下次進入中斷的時候才是引導碼真正的時間
- }
- }
復制代碼
所有資料51hei提供下載:
紅外遙控控制馬達.zip
(36.84 KB, 下載次數(shù): 36)
2018-5-10 22:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|