📄 51
字号:
149 出口参数:dat
150 *************************************************************/
151 bit DeCode(void)
152 {
153 1
154 1 unsigned char i,j;
155 1 unsigned char temp; //储存解码出的数据
156 1 for(i=0;i<4;i++) //连续读取4个用户码和键数据码
157 1 {
158 2 for(j=0;j<8;j++) //每个码有8位数字
159 2 {
160 3 temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是高位数据
161 3 TH0=0; //定时器清0
162 3 TL0=0; //定时器清0
163 3 TR0=1; //开启定时器T0
164 3 while(IR==0) //如果是低电平就等待
165 3 ; //低电平计时
166 3 TR0=0; //关闭定时器T0
167 3 LowTime=TH0*256+TL0; //保存低电平宽度
168 3 TH0=0; //定时器清0
169 3 TL0=0; //定时器清0
170 3 TR0=1; //开启定时器T0
171 3 while(IR==1) //如果是高电平就等待
172 3 ;
173 3 TR0=0; //关闭定时器T0
174 3 HighTime=TH0*256+TL0; //保存高电平宽度
175 3 if((LowTime<370)||(LowTime>640))
176 3 return 0; //如果低电平长度不在合理范围,则认为出错,停止解码
177 3 if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
178 3 temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0
179 3 if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
C51 COMPILER V8.09 HWJMCS 07/16/2010 10:25:30 PAGE 4
180 3 temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1
181 3 }
182 2 a[i]=temp; //将解码出的字节值储存在a[i]
183 2 }
184 1 if(a[2]=~a[3]) //验证键数据码和其反码是否相等,一般情况下不必验证用户码
185 1 return 1; //解码正确,返回1
186 1 }
187
188 /*------------------二进制码转换为压缩型BCD码,并显示---------------*/
189
190 void two_2_bcd(unsigned char date)
191 {
192 1
193 1 unsigned char temp;
194 1 temp=date;
195 1 date&=0xf0;
196 1 date>>=4; //右移四位得到高四位码
197 1 date&=0x0f; //与0x0f想与确保高四位为0
198 1 if(date<=0x09)
199 1 {
200 2 WriteData(0x30+date); //lcd显示键值高四位
201 2 }
202 1 else
203 1 {
204 2 date=date-0x09;
205 2 WriteData(0x40+date);
206 2 }
207 1 date=temp;
208 1 date&=0x0f;
209 1 if(date<=0x09)
210 1 {
211 2 WriteData(0x30+date); //lcd显示低四位值
212 2 }
213 1 else
214 1 {
215 2 date=date-0x09;
216 2 WriteData(0x40+date);
217 2 }
218 1 WriteData(0x48); //显示字符'H'
219 1 }
220 /************************************************************
221 函数功能:1602LCD显示
222 *************************************************************/
223 void Disp(void)
224 {
225 1 WriteAddress(0x40); // 设置显示位置为第一行的第1个字
226 1 two_2_bcd(a[0]);
227 1 WriteData(0x20);
228 1 two_2_bcd(a[1]);
229 1 WriteData(0x20);
230 1 two_2_bcd(a[2]);
231 1 WriteData(0x20);
232 1 two_2_bcd(a[3]);
233 1
234 1 }
235 /************************************************************
236 函数功能:主函数
237 *************************************************************/
238 void main()
239 {
240 1 unsigned char i;
241 1 LcdInitiate(); //调用LCD初始化函数
C51 COMPILER V8.09 HWJMCS 07/16/2010 10:25:30 PAGE 5
242 1 delay(10);
243 1 WriteInstruction(0x01);//清显示:清屏幕指令
244 1 WriteAddress(0x00); // 设置显示位置为第一行的第1个字
245 1 i = 0;
246 1 while(string[i] != '\0') //'\0'是数组结束标志
247 1 { // 显示字符 WWW.RICHMCU.COM
248 2 WriteData(string[i]);
249 2 i++;
250 2 }
251 1 EA=1; //开启总中断
252 1 EX0=1; //开外中断0
253 1 ET0=1; //定时器T0中断允许
254 1 IT0=1; //外中断的下降沿触发
255 1 TMOD=0x01; //使用定时器T0的模式1
256 1 TR0=0; //定时器T0关闭
257 1 while(1); //等待红外信号产生的中断
258 1
259 1 }
260 /************************************************************
261 函数功能:红外线触发的外中断处理函数
262 *************************************************************/
263 void Int0(void) interrupt 0
264 {
265 1 EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
266 1 TH0=0; //定时器T0的高8位清0
267 1 TL0=0; //定时器T0的低8位清0
268 1 TR0=1; //开启定时器T0
269 1 while(IR==0); //如果是低电平就等待,给引导码低电平计时
270 1 TR0=0; //关闭定时器T0
271 1 LowTime=TH0*256+TL0; //保存低电平时间
272 1 TH0=0; //定时器T0的高8位清0
273 1 TL0=0; //定时器T0的低8位清0
274 1 TR0=1; //开启定时器T0
275 1 while(IR==1); //如果是高电平就等待,给引导码高电平计时
276 1 TR0=0; //关闭定时器T0
277 1 HighTime=TH0*256+TL0; //保存引导码的高电平长度
278 1 if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
279 1 {
280 2 //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
281 2 //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
282 2 if(DeCode()==1) // 执行遥控解码功能
283 2 {
284 3
285 3 Disp();//调用1602LCD显示函数
286 3 beep();//蜂鸣器响一声 提示解码成功
287 3 }
288 2 }
289 1 EX0=1; //开启外中断EX0
290 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 676 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -