基于STC8G单片机的红外发射接收程序
转载自tslids
题外话:因半导体价格涨幅较大和国外形势,开始考虑尽量使用国产芯片(支持国货),先从单片机开始,目前暂定要求不高的场合选择应用较多的STC系列,其中STC8G和STC8H系列为STC主推的型号。
注:程序大部分来源于网络,并做了较大幅度的修改,原因是不是用于红外数据传输,而是作为光电开关来用。
参考NEC编码做了简化,便于延长发射管寿命。
发射管为IR204、接收头为IRM-H638T/TR2、单片机为STC8G1K08A。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
| #include "STC8.h" #include "intrins.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned int uint16_t; typedef unsigned long uint32_t;
#define T1_START() TL1 = 0xE7; \ TH1 = 0xF3; \ ET1 = 1; \ TR1 = 1
sbit LED=P5^4; sbit IR_IO=P3^3;
bit IR_Flag=0; u8 IR_time=0; u8 IR_data[9]; bit IR_TimeFlag; unsigned char count; #define IR_SENDDATA 0X05 static u8 IR_bit;
void delay(u16 count); void Time0_init(void); void Time1_init(void); void Int0_init(void); u8 IR_decode(void);
void Wait_High(a) { unsigned char k; IR_TimeFlag = 0; count = a; T1_START(); while(!IR_TimeFlag) { _nop_(); _nop_(); k = 23; while (--k); IR_IO = ~IR_IO; } IR_IO = 1; }
void Wait_Low(a) { IR_IO = 1; IR_TimeFlag = 0; count = a; T1_START(); while(!IR_TimeFlag); }
void Send_IR(u8 dat) { unsigned char i,j; Wait_High(2); Wait_Low(4); for(j=0;j<8;j++) { Wait_High(1); if(dat&0x01) { Wait_Low(2); } else { Wait_Low(1); } dat = dat>>1; } Wait_High(1); }
void main(void) { u8 num=0; P3M0 |=0x08; P3M1 &=0xF7; RSTCFG &=0xEF; P5M0 |=0x10; P5M1 &=0xEF; P5M0 &=0xDF; P5M1 &=0xDF; Time0_init(); Time1_init(); Int0_init(); EA = 1; delay(100); IR_IO = 1; while(1) { Send_IR(IR_SENDDATA); delay(20000); if(IR_Flag) { IR_Flag=0; if(IR_decode() == IR_SENDDATA) LED = ~LED; } } }
void delay(u16 count) { while(count--) { _nop_(); } }
void Time0_init(void) { AUXR &= 0x7F; TMOD &= 0xF0; TMOD |= 0x02; TL0 = 0x80; TH0 = 0x80; TF0 = 0; ET0 = 1; TR0 = 1; }
void Time1_init(void) { AUXR |= 0x40; TMOD &= 0x0F; }
void Int0_init(void) { IT0 = 1; EX0 = 1; }
u8 IR_decode(void) { u8 j,k; u8 IR_Value = 0; k=1; for(j=0;j<=7;j++) { if(IR_data[k]>5) IR_Value|=0x80; if(j<7) IR_Value>>=1; k++; } return IR_Value; }
void INT0_ISR() interrupt 0 { if(IR_time>8) IR_bit=0; IR_data[IR_bit]=IR_time; IR_time=0; IR_bit++; if(IR_bit==9) { IR_Flag=1; IR_bit=0; } }
void TIMER0_ISR() interrupt 1 { IR_time++; }
void TIMER1_ISR() interrupt 3 { count--; if(count == 0) { IR_TimeFlag = 1; ET1 = 1; } }
|