📄 pt2221.lst
字号:
C51 COMPILER V7.06 PT2221 11/09/2008 23:19:36 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PT2221
OBJECT MODULE PLACED IN PT2221.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PT2221.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /********************************************************************
2 name: PT2221 红外解码 C 程序
3 红外一体化接收头 + 89S51
4 用c做延时的32路红外遥控解码程序,程序中提供了两种实现延时的方法:
5 1. 加入 intrins.h 头文件后,用for循环和_nop_ 联合组成的精确延时;
6 2. 用 while(--i); 实现的精确延时
7 红外一体化接收头接P3.2 (INT0)
8 P1.7作工作指示用,解码成功后BZ响一次,同时,若解码值为01的话,会取反P1.5
9 **********************************************************************/
10 #include<reg51.h>
11 #include<intrins.h>
12 #define uchar unsigned char
13 #define uint unsigned int
14 //*************用到的I/O口定义**************
15 sbit P32=P3^2; //INT0,红外信号输入
16 sbit P23=P2^3; //BZ
17 sbit P15=P1^5;
18 sbit P17=P1^7; //工作指示灯
19 //************函数申明*********************
20 void InitCom(void); //串口初始化
21 void ComOutChar(unsigned char OutData); //从串口输出一个字符
22 void delay882us(void); //精确延时882us
23 void delay4740us(void); //精确延时4740us
24 void delay1000us(void); //精确延时1000us
25 //************************主程序***********************************
26 //向串口输出一个字符(非中断方式)
27 //***************************************************************
28 void ComOutChar(unsigned char OutData)
29 {
30 1 SBUF = OutData; //输出字符
31 1 while(!TI); //空语句判断字符是否发完
32 1 TI = 0; //清TI
33 1 }
34 //****************************************************************
35 //串口初始化 晶振为11.0592M 方式1 波特率9600
36 //****************************************************************
37 void InitCom(void)
38 {
39 1 SCON = 0x50; //串口方式1,允许接收
40 1 TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
41 1 TH1 = 0xFd; //设波特率为9600
42 1 TL1 = 0xFd;
43 1 PCON = 0x00; //波特率不加倍控制,SMOD为0
44 1 RI = 0; //清收发标志
45 1 TI = 0;
46 1 TR1 = 1; //启动定时器
47 1 }
48
49 //*****************************************
50 // 用 for 循环和 _nop_ 配合实现的精确延时
51 //*****************************************
52 //****************882us********************
53 void delay882us(void)
54 {
55 1 uchar i;
C51 COMPILER V7.06 PT2221 11/09/2008 23:19:36 PAGE 2
56 1 for(i=0;i<202;i++)
57 1 {
58 2 _nop_();
59 2 }
60 1 }
61 //****************4740us*******************
62 void delay4740us(void)
63 {
64 1 uint j;
65 1 for(j=0;j<670;j++)
66 1 {
67 2 _nop_();
68 2 }
69 1 }
70 //*************1000us**********************
71 void delay1000us(void)
72 {
73 1 uchar k;
74 1 for(k=0;k<230;k++)
75 1 {
76 2 _nop_();
77 2 }
78 1 }
79
80 void main (void)
81 {
82 1 uint di;
83 1 InitCom(); //初始化串口
84 1 EA=1;
85 1 EX0=1; // 设定接受INT0的中断
86 1 IT0=1;
87 1 ComOutChar(1); //向串口发送 1 ,表示串口正常工作
88 1 do
89 1 {
90 2 P17=~P17; //工作指示灯,这个LED闪烁表示主程序在运行
91 2 for(di=0;di<1000;di++)
92 2 {
93 3 delay1000us();
94 3 }
95 2 }while(1);
96 1 }
97 //*******************外部中断0 红外解码程序****************
98 static void decode(void) interrupt 0 using 2
99 {
100 1 unsigned char IRCode[4]={0,0,0,0};
101 1 unsigned char count0,count1,count2;
102 1 unsigned char m;
103 1 EX0 = 0; //外部中断0关闭
104 1 for(count0=0;count0<10;count0++) //起始码前9ms的低电平
105 1 {
106 2 delay882us();
107 2 if(P32) goto exit; //9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
108 2 }
109 1 if(!P32) //低电平没完
110 1 {
111 2 delay4740us(); //9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
112 2 for(count1=0;count1<4;count1++) //开始读数据,4个字节,32位
113 2 {
114 3 for(count2=0;count2<8;count2++) //每个字节8位
115 3 {
116 4 while(!P32); //等待高电平到来
117 4 delay882us();
C51 COMPILER V7.06 PT2221 11/09/2008 23:19:36 PAGE 3
118 4 if(P32) //延时882us后,若P32还是高电平,则为 位1
119 4 {
120 5 IRCode[count1]=IRCode[count1]>>1;
121 5 IRCode[count1]=IRCode[count1]|0x80;
122 5 delay1000us(); //延时1000us,结束高电平
123 5 }
124 4 else //延时882us后,若P32为低电平,则为 位0
125 4 {
126 5 IRCode[count1]=IRCode[count1]>>1;
127 5 IRCode[count1]=IRCode[count1]|0x00;
128 5 }
129 4 }
130 3 } //到这里已读完所有32位数据
131 2 //if ((IRCode[0]==0x00)&&(IRCode[1]==0xff)) //判断用户码和用户反码是否正确
132 2 //if ((IRCode[0]==0x02)&&(IRCode[1]==0xBD)) //判断用户码和用户反码是否正确
133 2 //if ((IRCode[0]==0x01)&&(IRCode[1]==0xff)) //判断用户码和用户反码是否正确
134 2 {
135 3 if (IRCode[2]==~IRCode[3]) //数据校验
136 3 {
137 4 ComOutChar(IRCode[0]);
138 4 ComOutChar(IRCode[1]);
139 4 ComOutChar(IRCode[2]); //串口发送数据码
140 4 ComOutChar(IRCode[3]);
141 4 P23=0; //解码成功后BZ响一次
142 4 for(m=0;m<100;m++)
143 4 {
144 5 delay1000us();
145 5 }
146 4 P23=1;
147 4 if(IRCode[2]==0x01)
148 4 {
149 5 P15=~P15; //这里可加入控制命令,比如这里的当解码为01时取反P1.5
150 5 for(m=0;m<100;m++)
151 5 {
152 6 delay1000us();
153 6 }
154 5 }
155 4 }
156 3 }
157 2 }
158 1 exit:
159 1 EX0 = 1;
160 1 }
161
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 282 ----
CONSTANT SIZE = 4 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
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 + -