51单片机_红外线

  1 /**************************************************************************************                                                                                
  2 *                      红外通信实验                                                  *                        
  3 实现现象:下载程序后,数码管显示红外遥控键值数据                                                                                
  4 注意事项:    红外遥控器内的电池绝缘片一定要抽掉                                                                              
  5 ***************************************************************************************/                                                                                
  6                                                                                 
  7 #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器                                                                    
  8                                                                                 
  9                                                                                 
 10 typedef unsigned int u16;      //对数据类型进行声明定义                                                                            
 11 typedef unsigned char u8;                                                                                
 12                                                                                 
 13 sbit LSA=P2^2;                                                                                
 14 sbit LSB=P2^3;                                                                                
 15 sbit LSC=P2^4;                                                                                
 16                                                                                 
 17 sbit IRIN=P3^2;                                                                                
 18 sbit led=P2^0;                                                                                
 19 u8 IrValue[6];                                                                                
 20 u8 Time;                                                                                
 21                                                                                 
 22 u8 DisplayData[8];                                                                                
 23 u8 code smgduan[17]={                                                                                
 24 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                                                                                
 25 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};                                                                                
 26 //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码                                                                                
 27                                                                                 
 28 /*******************************************************************************                                                                                
 29 * 函 数 名         : delay                                                                                
 30 * 函数功能           : 延时函数,i=1时,大约延时10us                                                                        
 31 *******************************************************************************/                                                                                
 32 void delay(u16 i)                                                                                
 33 {                                                                                
 34     while(i--);                                                                            
 35 }                                                                                
 36                                                                                 
 37                                                                                 
 38 /*******************************************************************************                                                                                
 39 * 函数名         :DigDisplay()                                                                                
 40 * 函数功能         :数码管显示函数                                                                        
 41 * 输入           : 无                                                                                
 42 * 输出              : 无                                                                            
 43 *******************************************************************************/                                                                                
 44 void DigDisplay()                                                                                
 45 {                                                                                
 46     u8 i;                                                                            
 47     for(i=0;i<3;i++)                                                                            
 48     {                                                                            
 49         switch(i)     //位选,选择点亮的数码管,                                                                    
 50         {                                                                        
 51             case(0):                                                                    
 52                 LSA=0;LSB=0;LSC=0; break;//显示第0位                                                                
 53             case(1):                                                                    
 54                 LSA=1;LSB=0;LSC=0; break;//显示第1位                                                                
 55             case(2):                                                                    
 56                 LSA=0;LSB=1;LSC=0; break;//显示第2位                                                                
 57         }                                                                        
 58         P0=DisplayData[2-i];//发送数据                                                                        
 59         delay(100); //间隔一段时间扫描                                                                        
 60         P0=0x00;//消隐                                                                        
 61     }                                                                            
 62 }                                                                                
 63                                                                                 
 64                                                                                 
 65 /*******************************************************************************                                                                                
 66 * 函数名         : IrInit()                                                                                
 67 * 函数功能           : 初始化红外线接收                                                                        
 68 * 输入           : 无                                                                                
 69 * 输出              : 无                                                                            
 70 *******************************************************************************/                                                                                
 71                                                                                 
 72 void IrInit()                                                                                
 73 {                                                                                
 74     IT0=1;//下降沿触发                                                                            
 75     EX0=1;//打开中断0允许                                                                            
 76     EA=1;    //打开总中断                                                                        
 77                                                                                 
 78     IRIN=1;//初始化端口                                                                            
 79 }                                                                                
 80                                                                                 
 81                                                                                 
 82 /*******************************************************************************                                                                                
 83 * 函 数 名       : main                                                                                
 84 * 函数功能         : 主函数                                                                        
 85 * 输    入       : 无                                                                                
 86 * 输    出         : 无                                                                            
 87 *******************************************************************************/                                                                                
 88 void main()                                                                                
 89 {                                                                                
 90     IrInit();                                                                            
 91     while(1)                                                                            
 92     {    
 93         if((smgduan[IrValue[2]/16]==4)&&smgduan[IrValue[2]/16]==3)
 94         {
 95            led = ~led;
 96         }                                                                        
 97         DisplayData[0] = smgduan[IrValue[2]/16];                                                                        
 98         DisplayData[1] = smgduan[IrValue[2]%16];                                                                        
 99         DisplayData[2] = smgduan[16];                                                                        
100         DigDisplay();                                                                            
101     }                                                                            
102 }                                                                                
103                                                                                 
104 /*******************************************************************************                                                                                
105 * 函数名         : ReadIr()                                                                                
106 * 函数功能           : 读取红外数值的中断函数                                                                        
107 * 输入           : 无                                                                                
108 * 输出              : 无                                                                            
109 *******************************************************************************/                                                                                
110                                                                                 
111 void ReadIr() interrupt 0                                                                                
112 {                                                                                
113     u8 j,k;                                                                            
114     u16 err;                                                                            
115     Time=0;                                                                             
116     delay(700);    //7ms                                                                        
117     if(IRIN==0)        //确认是否真的接收到正确的信号                                                                    
118     {                                                                             
119                                                                                 
120         err=1000;                //1000*10us=10ms,超过说明接收到错误的信号                                                        
121         /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时                                                                        
122         侯,程序死在这里*/                                                                        
123         while((IRIN==0)&&(err>0))    //等待前面9ms的低电平过去                                                                      
124         {                                                                        
125             delay(1);                                                                    
126             err--;                                                                    
127         }                                                                         
128         if(IRIN==1)            //如果正确等到9ms低电平                                                            
129         {                                                                        
130             err=500;                                                                    
131             while((IRIN==1)&&(err>0))         //等待4.5ms的起始高电平过去                                                            
132             {                                                                    
133                 delay(1);                                                                
134                 err--;                                                                
135             }                                                                    
136             for(k=0;k<4;k++)        //共有4组数据                                                            
137             {                                                                    
138                 for(j=0;j<8;j++)    //接收一组数据                                                            
139                 {                                                                
140                                                                                 
141                     err=60;                                                            
142                     while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去                                                            
143                     {                                                            
144                         delay(1);                                                        
145                         err--;                                                        
146                     }                                                            
147                     err=500;                                                            
148                     while((IRIN==1)&&(err>0))     //计算高电平的时间长度。                                                        
149                     {                                                            
150                         delay(10);     //0.1ms                                                    
151                         Time++;                                                        
152                         err--;                                                        
153                         if(Time>30)                                                        
154                         {                                                        
155                             return;                                                    
156                         }                                                        
157                     }                                                            
158                     IrValue[k]>>=1;     //k表示第几组数据                                                        
159                     if(Time>=8)            //如果高电平出现大于565us,那么是1                                                
160                     {                                                            
161                         IrValue[k]|=0x80;                                                        
162                     }                                                            
163                     Time=0;        //用完时间要重新赋值                                                    
164                 }                                                                
165             }                                                                    
166         }                                                                        
167         if(IrValue[2]!=~IrValue[3])                                                                        
168         {                                                                        
169             return;                                                                    
170         }                                                                        
171     }                                                                            
172 }                                                                                

1.红外线

猜你喜欢

转载自www.cnblogs.com/clam-hao/p/10075874.html