红外线遥控直流电机启停源码
单片机源程序如下:
- #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)
|