51微控制器_紅外線
阿新 • • 發佈:2018-12-06
1 /************************************************************************************** 2 * 紅外通訊實驗 * 3 實現現象:下載程式後,數碼管顯示紅外遙控鍵值資料4 注意事項: 紅外遙控器內的電池絕緣片一定要抽掉 5 ***************************************************************************************/ 6 7#include "reg52.h" //此檔案中定義了微控制器的一些特殊功能暫存器 8 9 10 typedef unsigned intu16; //對資料型別進行宣告定義 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.紅外線