📄 pt2221.lst
字号:
C51 COMPILER V8.02 PT2221 08/19/2007 14:42:31 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE PT2221
OBJECT MODULE PLACED IN PT2221.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PT2221.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**********************************************************************************************
2 name: PT2221 红外解码 C 程序
3 device: 红外一体化接收头 + 89S51
4 Copyright (c) 2007-2008 张兴电子设计工作室技术开发部
5 author: 张兴
6 web: http://bbsky.ttsite.com
7 date: 2007.8.4--0:00
8 description: 用c做延时的32路红外遥控解码程序,程序中提供了两种实现延时的方法:
9 1. 加入 intrins.h 头文件后,用for循环和_nop_ 联合组成的精确延时;
10 2. 用 while(--i); 实现的精确延时
11
12 红外一体化接收头接P3.2 (INT0)
13 P37作工作指示用,解码成功后P36闪烁一次,同时,若解码值为01的话,会取反P35
14 edition:V1.0
15 ***********************************************************************************************/
16 #include<PT2221.h>
17 //************************主程序***********************************
18 void main (void)
19 {
20 1 uint di;
21 1 InitCom(); //初始化串口
22 1 EA=1;
23 1 EX0=1; // 设定接受INT0的中断
24 1 IT0=1;
25 1 ComOutChar(1); //向串口发送 1 ,表示串口正常工作
26 1 do
27 1 {
28 2 P37=~P37; //工作指示灯,这个LED闪烁表示主程序在运行
29 2 for(di=0;di<1000;di++)
30 2 {
31 3 delay1000us();
32 3 }
33 2 }while(1);
34 1 }
35 //*******************外部中断0 红外解码程序****************************************
36 static void decode(void) interrupt 0 using 2
37 {
38 1 unsigned char IRCode[4]={0,0,0,0};
39 1 unsigned char count0,count1,count2;
40 1 unsigned char m;
41 1 EX0 = 0; //外部中断0关闭
42 1 for(count0=0;count0<10;count0++) //起始码前9ms的低电平
43 1 {
44 2 delay882us();
45 2 if(P32) goto exit; //9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
46 2 }
47 1 if(!P32) //低电平没完
48 1 {
49 2 delay4740us(); //9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
50 2 for(count1=0;count1<4;count1++) //开始读数据,4个字节,32位
51 2 {
52 3 for(count2=0;count2<8;count2++) //每个字节8位
53 3 {
54 4 while(!P32); //等待高电平到来
55 4 delay882us();
C51 COMPILER V8.02 PT2221 08/19/2007 14:42:31 PAGE 2
56 4 if(P32) //延时882us后,若P32还是高电平,则为 位1
57 4 {
58 5 IRCode[count1]=IRCode[count1]>>1;
59 5 IRCode[count1]=IRCode[count1]|0x80;
60 5 delay1000us(); //延时1000us,结束高电平
61 5 }
62 4 else //延时882us后,若P32为低电平,则为 位0
63 4 {
64 5 IRCode[count1]=IRCode[count1]>>1;
65 5 IRCode[count1]=IRCode[count1]|0x00;
66 5 }
67 4 }
68 3 } //到这里已读完所有32位数据
69 2 if ((IRCode[0]==0x00)&&(IRCode[1]==0xff)) //判断用户码和用户反码是否正确
70 2 {
71 3 if (IRCode[2]==~IRCode[3]) //数据校验
72 3 {
73 4 //ComOutChar(IRCode[0]);
74 4 //ComOutChar(IRCode[1]);
75 4 ComOutChar(IRCode[2]); //串口发送数据码
76 4 //ComOutChar(IRCode[3]);
77 4 P36=0; //解码成功后led闪烁一次
78 4 for(m=0;m<100;m++)
79 4 {
80 5 delay1000us();
81 5 }
82 4 P36=1;
83 4 if(IRCode[2]==0x01)
84 4 {
85 5 P35=~P35; //这里可加入控制命令,比如这里的当解码为01时取反P35
86 5 for(m=0;m<100;m++)
87 5 {
88 6 delay1000us();
89 6 }
90 5 }
91 4 }
92 3 }
93 2 }
94 1 exit:
95 1 EX0 = 1;
96 1 }
97
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 259 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -