51单片机_红外线
Posted clam-hao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.红外线
以上是关于51单片机_红外线的主要内容,如果未能解决你的问题,请参考以下文章