⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir.c

📁 51单片机驱动2相步进电机程序。 keil 开发软件。
💻 C
字号:
/*******************************************************************************/  
#include  "config.h"   

bit IR_flag0=1;
bit IR_flag1=1;
bit IR_flag2=1;
bit IR_flag3=1;
bit IR_flag4=1;
bit IR_flag5=1;
bit IR_flag6=1;
bit IR_flag7=1; 

/************************************************************/  
extern  uint16 xdata	ABA,ABB,ABC,ABD,ABE,ABF;  
extern  uint8  	display[];  
/************************************************************/    
uint8  xdata  dataIR[5]; 
uint8  xdata  IR_IP0[8];   		//(0-1:IP) (2-3:设定IP)(4-7:设定计划数量)
bit    flag=0;
uint8  CA0=0;
uint8  IR_SET=1;			   //1:(正常)  2:(设定IP)  3-8:(设定1-6) 
uint8  IR_IP;				   // IP

void IR_TASK(void ); 
/************************************************************/

//bit    ir_flag; 
/*     */
#define KEY_0           0x10
#define KEY_1           0x30
#define KEY_2           0xB0
#define KEY_3           0x70
#define KEY_4           0x08
#define KEY_5           0x88
#define KEY_6           0x48
#define KEY_7           0x28
#define KEY_8           0xA8
#define KEY_9           0x68

#define KEY_POWER       0x00
#define KEY_CH_DEC      0x80
#define KEY_CH_ADD      0x40

#define KEY_EQ          0x20
#define KEY_VOL_ADD     0xA0
#define KEY_VOL_DEC     0x60

#define KEY_ZUO         0x90
#define KEY_YOU         0x50  

#define KEY_EMPTY       0xFF    

uchar   Key1;	 
uchar   IpDZ=00;		     //对应遥控器IP地址	 

/********************************************************************
函 数 名:iR_Receive()
功    能:初始化子程序
说    明:
调    用:
入口参数:
出口参数:
***********************************************************************/
void delay_100us(void)
{
   unsigned char i=48;
   while(--i);
}
/********************************************************************
函 数 名:iR_Receive()
功    能:初始化子程序
说    明:
调    用:
入口参数:
出口参数:
***********************************************************************/
/******************************************/
/*********************外部中断0服务程序**/			 
/*****************************************/ 
static void xint0_isr(void) interrupt IE0_VECTOR 
{
    unsigned char width;
    unsigned char i=0;

    width = 0x00; 
    INT0 = 1;
    while(!INT0)  
    {
        delay_100us();
        width++;
    }
    if (width < 65)   
    {
        return;
    }
    
    width = 0x00;
    while(INT0)  
    {
        delay_100us();
        width++;  
    } 
 
    if (width < 30)    
    {
        return;
    }
    // 至此,引导码已校验,以下接收地址码和数据码,一共32位 

    for(i=0; i<32; i++)    
	    {
	        flag = 1;
	        while(!INT0);  
	        width = 0x00;
	        while(INT0)  
	        	{
	            	delay_100us();
	            	width++;  
	        	}
	        dataIR[i/8] <<= 1;
	        if (width > 0x08)dataIR[i/8] |= 0x01;  
	        	 
	        else dataIR[i/8] &= 0XFE; 
	    }
	if ((IpDZ == dataIR[0]) && (dataIR[2] == (~dataIR[3]))) 
		{ 
		  
			switch (dataIR[2]) 
				{
            		case KEY_0 :  
                	case KEY_1 :  
                 	case KEY_2 :  
               		case KEY_3 :  
               		case KEY_4 :   
                    case KEY_5 :  
                  	case KEY_6 :   
					case KEY_7 :  
					case KEY_8 :  
					case KEY_9 :  
//					case KEY_POWER :  
                 	case KEY_CH_DEC: 
					case KEY_CH_ADD: 
					case KEY_EQ     :  
                   	case KEY_VOL_DEC: 
					case KEY_VOL_ADD:  
                   	case KEY_ZUO     : 
					case KEY_YOU     : 
						Key1 = dataIR[2];
                  		break;
                  	default:
                  		Key1 = KEY_EMPTY;
                      	break;
           		} 
			//*******判断运行/设定*****************************************************
			if(dataIR[2]==KEY_POWER)
				{ 
					IR_flag0=~IR_flag0; 
				 	if(IR_flag0==0)
						{ 
							CA0=0;
							IR_SET=1; 
							IR_flag1=0;
						  	T10_K=0;	  	// 遥控接受秘码不对6秒后解除
							T10K=0;
						}
					else  
					    { 		
							T10_K=1;
							T10K=0;			// 遥控接受秘码不对6秒后解除
							IR_flag1=1;
							IR_flag2=1; 
							IR_SET=1;		//运行
							dataIR[0] = 0X00;
				            dataIR[1] = 0X00;
				            dataIR[2] = 0X00;
				            dataIR[3] = 0X00;
				            dataIR[4] = 0X00;	 
						}
				}
			//如果设定+没有输入秘密*************************************************
			if((IR_flag1==0)&&(IR_flag2==1))
				{ 
					 
					 if(CA0>=2)CA0=0;
					 switch (dataIR[2]) 
						{
		            		case KEY_0 :
							 	 IR_IP0[CA0]=0;
								 CA0++;
								break; 
		                	case KEY_1 :
							 	 IR_IP0[CA0]=1;
								 CA0++;
								break;   
		                 	case KEY_2 :
							 	 IR_IP0[CA0]=2;
								 CA0++;
								break;   
		               		case KEY_3 :
							 	 IR_IP0[CA0]=3;
								 CA0++;
								break;   
		               		case KEY_4 :
							 	 IR_IP0[CA0]=4;
								 CA0++;
								break;    
		                    case KEY_5 :
							 	 IR_IP0[CA0]=5;
								 CA0++;
								break;   
		                  	case KEY_6 :
							 	IR_IP0[CA0]=6;
								CA0++;
								break;    
							case KEY_7 :
							 	IR_IP0[CA0]=7;
								CA0++;
								break;   
							case KEY_8 : 
								IR_IP0[CA0]=8;
								 CA0++;
								break;  
							case KEY_9 : 
								IR_IP0[CA0]=9;
								 CA0++;
		                  		break;
		                  	default:
							    
		                  	//	Key1 = KEY_EMPTY;
		                      	break;
		           		} 
				 //判断密码正确
				 if((IR_IP0[2]==IR_IP0[0])&&(IR_IP0[3]==IR_IP0[1]))
				 	{ 
						 
						T10_K=1;
						T10K=0; 	   // 遥控接受秘码正确解除6秒延时
						 

					 	IR_flag1=1;
						IR_flag2=0;	 //密码OK
						CA0=5;		 //进入设定位	
 						IR_SET=3;	 //设定IP
						IR_IP0[0]=0;
						IR_IP0[1]=0; //密码值复位
						
					}
				Key1 = KEY_EMPTY;
				}
		IR_TASK();
		}  
  
}
/***********************************************************************/  
void IR_TASK(void )
{  
	if((Key1!=KEY_EMPTY)&&(IR_flag2==0))
        {  
			flag = 0;  
			if ((IpDZ == dataIR[0]) && (dataIR[2] == (~dataIR[3]))) 
				{
               		T11_K=1;
					T11K=0; 	    
 					 switch (dataIR[2]) 
						 	{
                    			case KEY_0 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=0;
											IR_flag3=0;
											IR_flag4=0; 
										}
									else if(IR_SET==9)Y0=~Y0;  
									break;
                    			case KEY_1 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=1;
											IR_flag3=0;
											IR_flag4=0;
										}
									else if(IR_SET==9)Y1=~Y1;	 
									break;
                    			case KEY_2 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=2;
											IR_flag3=0;
											IR_flag4=0;
										} 
									else if(IR_SET==9)Y2=~Y2;	 
									break;
                    			case KEY_3 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=3;
											IR_flag3=0;
											IR_flag4=0;
										}
									else if(IR_SET==9)Y3=~Y3; 
									break;
                    			case KEY_4 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=4;
											IR_flag3=0;
											IR_flag4=0;
										}
									else if(IR_SET==9)Y4=~Y4;  
									break;
                    			case KEY_5 :  
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=5;
											IR_flag3=0;
											IR_flag4=0;
										}
									else if(IR_SET==9)Y5=~Y5; 
									break;
                    			case KEY_6 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=6;
											IR_flag3=0;
											IR_flag4=0;
										}
									else if(IR_SET==9)Y6=~Y6;  
									break;
                   				
								case KEY_7 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=7;
											IR_flag3=0;
											IR_flag4=0;
										}
									else if(IR_SET==9)Y7=~Y7; 
									break; 
								case KEY_8 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=8;
											IR_flag3=0;
											IR_flag4=0;
										} 
									break;
                    			
								case KEY_9 : 
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
											IR_IP0[CA0]=9;
											IR_flag3=0;
											IR_flag4=0;
										}  
									break;
                    			/**********設定1/设定2/运行**************************************/
							/*	case KEY_POWER : 		 
									if(TOP0==2){TOP0=0;TOP1=0;}
										else TOP0++;

									if(TOP0==1)TOP1=0;
				 					else if(TOP0==2)TOP1=11;
				  					else TOP1=0; 
									break; 
							*/
								/**********设定计划数量-***************************************/
                    			case KEY_CH_DEC   :
 								  		
										if(IR_SET==3)IR_SET=9; 	 //设定计划-
										 else if(IR_SET<3)IR_SET=3;
										 else IR_SET--;
										
								 	  	CA0=5;	    //地址
									break;
							   	/**********设定计划数量+****************************************/ 
								case KEY_CH_ADD   :
									 	if(IR_SET==9)IR_SET=3; 	//设定计划+
										else IR_SET++;
								 	  	CA0=5;	    //地址
									break;
								/***********设定IP**************************************/
 								case KEY_EQ     : 
  									    if(IR_SET==2){IR_SET=9;CA0=0;}
										else {IR_SET=2; CA0=2;}	    //IP //地址 

 									break;
								/************移位-*************************************/	
								case KEY_VOL_DEC :
									 if((IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
 										{
 										 	if(CA0==8)CA0=5;
 											else CA0++;
 							 			 }
									 if(IR_SET==2)
									 	{
 										 	if(CA0==3)CA0=2;
 											else CA0++;
 							 			 } 
									break;  
								/***********移位+*************************************/
                    			case KEY_VOL_ADD  :
  									 if((IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{
										 	if(CA0==4)CA0=8;
											else CA0--;
							 			 }
									 if(IR_SET==2) 
									   	{
										 	if(CA0==2)CA0=3;
											else CA0--;
							 			 }
									break;
                    			
                    			/****》***设定位-****************************************/
								case KEY_ZUO     :
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{ 
 											if(IR_IP0[CA0]==0){IR_IP0[CA0]=9;}
 											else  IR_IP0[CA0]--;
											IR_flag3=0;
											IR_flag4=0;
										} 
									break;
								/***《******设定位+**************************************/
                    			case KEY_YOU     :
									if((IR_SET==2)||(IR_SET==3)||(IR_SET==4)||(IR_SET==5)||(IR_SET==6)||(IR_SET==7)||(IR_SET==8))
										{ 
											if(IR_IP0[CA0]==9){IR_IP0[CA0]=0;}
											else  IR_IP0[CA0]++;
											IR_flag3=0;
											IR_flag4=0;
										}
										 
									break; 
								/*************************************************/
                        			break;
                    			default:
                        	 		Key1 = KEY_EMPTY;
                        			break;
                			} 
						Key1 = KEY_EMPTY;
						if(IR_flag4==0)
						{				
							IR_flag4 = 1; 
							switch (IR_SET)
								{ 
									case 2 :IR_IP=(IR_IP0[2]*10)+IR_IP0[3];break; 
					  				case 3 :ABA=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
									case 4 :ABB=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
									case 5 :ABC=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
									case 6 :ABD=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
									case 7 :ABE=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
									case 8 :ABF=(IR_IP0[5]*1000)+(IR_IP0[6]*100)+(IR_IP0[7]*10)+IR_IP0[8];break;
									default:break;
                				}  
						 }  
            		}  	            
            dataIR[0] = 0X00;
            dataIR[1] = 0X00;
            dataIR[2] = 0X00;
            dataIR[3] = 0X00;
            dataIR[4] = 0X00;	 
        } 
}

 

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -