紅外線遙控直流電機啟停源碼
單片機源程序如下:
- #include"reg51.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit a=P1^4;
- sbit b=P1^5;
- sbit c=P1^6;
- u8 reddata[6];
- u8 redcom[2];
- u8 time,j,k;
- u16 err;
- sbit stop=P3^2;
- sbit motor=P1^0;
- sbit motoa=P3^4;
- sbit motob=P3^5;
- sbit motoc=P3^6;
- sbit motod=P3^7;
- u16 smg[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0X76};
- /*************************************************************/
- void smgbitswitch(num)
- {
- switch(num) //位選,選擇點亮的數碼管,
- {
- case(0):
- a=0;b=0;c=0; break;//顯示第0位
- case(1):
- a=1;b=0;c=0; break;//顯示第1位
- case(2):
- a=0;b=1;c=0; break;//顯示第2位
- case(3):
- a=1;b=1;c=0; break;//顯示第3位
- case(4):
- a=0;b=0;c=1; break;//顯示第4位
- case(5):
- a=1;b=0;c=1; break;//顯示第5位
- case(6):
- a=0;b=1;c=1; break;//顯示第6位
- case(7):
- a=1;b=1;c=1; break;//顯示第7位
- }
- }
- void delay(u16 num)
- {
- while(num)
- {
- num--;
- }
- }
- void you1(num)
- {
- smgbitswitch(7);
- P0=smg[num];
- delay(10);
- P0=0x00;
- }
- void you2(num)
- {
- smgbitswitch(6);
- P0=smg[num];
- delay(10);
- P0=0x00;
- }
- void you3(num)
- {
- smgbitswitch(5);
- P0=smg[num];
- delay(10);
- P0=0x00;
- }
- void redcomsmg()
- {
- if(reddata[2]==0x16)
- {
- redcom[1]=0;
- }
- if(reddata[2]==0x0c)
- {
- redcom[1]=1;
- }
- if(reddata[2]==0x18)
- {
- redcom[1]=2;
- }
- if(reddata[2]==0x5e)
- {
- redcom[1]=3;
- }
- if(reddata[2]==0x08)
- {
- redcom[1]=4;
- }
- if(reddata[2]==0x1c)
- {
- redcom[1]=5;
- }
- if(reddata[2]==0x5a)
- {
- redcom[1]=6;
- }
- if(reddata[2]==0x42)
- {
- redcom[1]=7;
- }
- if(reddata[2]==0x52)
- {
- redcom[1]=8;
- }
- if(reddata[2]==0x4a)
- {
- redcom[1]=9;
- }
- }
- void inter()
- {
- EX0=1;
- IT0=1;
- EA=1;
- stop=1;
- }
- void main()
- {
- inter();
- delay(1);
- motoa=0;
- motob=0;
- motoc=0;
- motod=0;
- motor=0;
- while(1)
- {
- redcomsmg();
- delay(2000);
- you1(10);
- you2(redcom[1]);
- you3(0);
- if(redcom[1]==0) // 直流電機停止
- {
- motor=0;
- }
- if(redcom[1]==3) // 直流電機啟動
- {
- motor=1;
- }
- if(redcom[1]==2) // 步進電機啟動
- {
- motoa=1;
- motob=0;
- motoa=1;
- motob=1;
- delay(200);
-
- motoa=1;
- motob=1;
- motoa=1;
- motob=0;
- delay(200);
-
-
- motoa=0;
- motob=1;
- motoa=1;
- motob=1;
- delay(200);
-
-
- motoa=1;
- motob=1;
- motoa=0;
- motob=1;
- delay(200);
- }
- if(redcom[1]==4) // 步進電機停止
- {
- motoa=0;
- motob=0;
- motoa=0;
- motob=0;
- }
- }
- }
- void stopservice() interrupt 0
- {
- time=0;
- if(stop==0) //如果按鍵按下
- {
- err=1000;
- while((stop==0)&&(err>0)) // 等待9ms低電平過去
- {
- delay(1);
- err--;
- }
- if(stop==1)
- {
- err=500;
- while((stop==1)&&(err>0)) // 等待4.5ms高電平過去
- {
- delay(1);
- err--;
- }
- for(k=0;k<4;k++)
- {
- for(j=0;j<8;j++)
- {
- err=60;
- while((stop==0)&&(err>0)) // 等待560us低電平過去
- {
- delay(1);
- err--;
- }
- err=50;
- while((stop==1)&&(err>0)) //計算高電平時間
- {
- delay(10);
- time++;
- if(time>30)
- {
- err=0;
- return;
- }
- }
- reddata[k]>>=1; // 因為紅外通信是先傳低位,再傳高位。所以是右移。
- if(time>=8) // 如果大于0.8ms說明是高電平,0.8ms是一個中間值
- {
- reddata[k]|=0x80;
- }
- time=0;
- err=0;
- }
- }
- }
- if(reddata[2]!=~reddata[3])
- {
- return;
- }
- }
-
- }
復制代碼
所有資料51hei提供下載:
紅外遙控直流電機啟停.rar
(525.55 KB, 下載次數: 23)
2018-10-14 22:27 上傳
點擊文件名下載附件
源碼以及PPT等
|