📄 wdj.lst
字号:
C51 COMPILER V8.08 WDJ 03/01/2008 06:27:14 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE WDJ
OBJECT MODULE PLACED IN wdj.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wdj.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <AT892051.h>
2
3 static unsigned char data CS;
4 static unsigned char data IRCode[4],IRCON,IRCON2;
5
6 void main(void)
7 {
8 1 unsigned int de;
9 1 void InitCom(unsigned char BaudRate);
10 1 void ComOutChar(unsigned char OutData);
11 1 void CSToOut(void);
12 1
13 1 InitCom(6); //设置波特率为9600 1-7波特率300-19200
14 1 EA = 1; //允许CPU中断
15 1 ES = 1; //开串口中断
16 1 IT0 = 1; //INT0下降沿有效
17 1 EX0 = 1; //开INT0中断
18 1 CS = 0; //设置CS为0不选任何的音源,如为1则选第1路
19 1 CSToOut();
20 1 do
21 1 {
22 2 if (P1_0 == 0) //取按键值
23 2 {
24 3 CS = 1;
25 3 P1 = 255; //P1口全为高电平,4-7通过反相为低不选任何音源,0-3为高用于
26 3 CSToOut();
27 3 }
28 2 if (P1_1 == 0)
29 2 {
30 3 CS = 2;
31 3 P1 = 255;
32 3 CSToOut();
33 3 }
34 2 if (P1_2 == 0)
35 2 {
36 3 CS = 3;
37 3 P1 = 255;
38 3 CSToOut();
39 3 }
40 2 if (P1_3 == 0)
41 2 {
42 3 CS = 4;
43 3 P1 = 255;
44 3 CSToOut();
45 3 }
46 2 for (de=0; de<4000; de++);
47 2 }
48 1 while(1);
49 1 }
50
51
52 //串口初始化 晶振为11.0592M 方式1 波特率300-57600
53 void InitCom(unsigned char BaudRate)
54 {
55 1 unsigned char THTL;
C51 COMPILER V8.08 WDJ 03/01/2008 06:27:14 PAGE 2
56 1 switch (BaudRate)
57 1 {
58 2 case 1: THTL = 64; break; //波特率300
59 2 case 2: THTL = 160; break; //600
60 2 case 3: THTL = 208; break; //1200
61 2 case 4: THTL = 232; break; //2400
62 2 case 5: THTL = 244; break; //4800
63 2 case 6: THTL = 250; break; //9600
64 2 case 7: THTL = 253; break; //19200
65 2 case 8: THTL = 255; break; //57600
66 2 default: THTL = 208;
67 2 }
68 1 SCON = 0x50; //串口方式1,允许接收
69 1 TMOD = 0x21; //定时器1定时方式2定时器0方式1 用在别处可以不用定时器0,TMOD=0x20
70 1 TCON = 0x40; //设定时器1开始计数
71 1 TH1 = THTL;
72 1 TL1 = THTL;
73 1 PCON = 0x80; //波特率加倍控制,SMOD位
74 1 RI = 0; //清收发标志
75 1 TI = 0;
76 1 TR1 = 1; //启动定时器
77 1 }
78
79 //向串口输出一个字符(非中断方式)
80 void ComOutChar(unsigned char OutData)
81 {
82 1 SBUF = OutData; //输出字符
83 1 while(!TI); //空语句判断字符是否发完
84 1 TI = 0; //清TI
85 1 }
86
87 //串口接收中断
88 void ComInINT(void) interrupt 4 using 1
89 {
90 1 if (RI) //判断是不收完字符
91 1 {
92 2 switch(SBUF)
93 2 {
94 3 case 0x61: CS = 1; break; //根据SBUF设置CS 接收'abcde'调试方便
95 3 case 0x62: CS = 2; break;
96 3 case 0x63: CS = 3; break;
97 3 case 0x64: CS = 4; break;
98 3 case 0x65: CS = 0; break;
99 3 }
100 2 P1 = 255; //P1口全为高电平,4-7通过反相为低不选任何音源,0-3为高用于读取按键
101 2 RI = 0; //RI清零
102 2 CSToOut();
103 2 }
104 1 }
105
106 //定时器0中断处理
107 void timeint(void) interrupt 1 using 2
108 {
109 1 //unsigned char a;
110 1 TH0=0xFD;
111 1 TL0=0x1E; //设定时值为800us
112 1
113 1 if (IRCON<3)
114 1 {
115 2 if (IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
116 2 {
117 3 IRCON2++;
C51 COMPILER V8.08 WDJ 03/01/2008 06:27:14 PAGE 3
118 3 IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
119 3 IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
120 3 }
121 2 else
122 2 {
123 3 IRCON++; //第填满一个字节,指向下一个变量
124 3 IRCON2=0; //计数清零
125 3 }
126 2 }
127 1 else
128 1 {
129 2 TR0 = 0; //关闭定时器
130 2 ET0 = 0; //定时器0中断关闭
131 2 //for (a=0;a<3;a++)
132 2 //ComOutChar(IRCode[a]); //这两句可通过PC串口调试软件看接收到的数据,测试用
133 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0xAB)) //取遥控值,取变量中的2,3字节
134 2 { //第一字节是引导码,第二、三字节是起始位、控制位和系统码
135 3 CS = 1;
136 3 P1 = 255;
137 3 CSToOut();
138 3 }
139 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0xAC))
140 2 {
141 3 CS = 2;
142 3 P1 = 255;
143 3 CSToOut();
144 3 }
145 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0xAD))
146 2 {
147 3 CS = 3;
148 3 P1 = 255;
149 3 CSToOut();
150 3 }
151 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0xB2))
152 2 {
153 3 CS = 4;
154 3 P1 = 255;
155 3 CSToOut();
156 3 }
157 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0xD2)) //关闭
158 2 {
159 3 CS = 0;
160 3 P1 = 255;
161 3 CSToOut();
162 3 }
163 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0xD3)) //静音
164 2 {
165 3 ComOutChar(8);
166 3 }
167 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0x2A)) //音量控制+
168 2 {
169 3 ComOutChar(6);
170 3 }
171 2 if ((IRCode[1] == 0x55) && (IRCode[2] == 0x2B)) //音量控制-
172 2 {
173 3 ComOutChar(7);
174 3 }
175 2 ES = 1; //打开串口中断
176 2 EX0 = 1; //打开
177 2 }
178 1 }
179
C51 COMPILER V8.08 WDJ 03/01/2008 06:27:14 PAGE 4
180 //INT0中断
181 void INT0Fun(void) interrupt 0 using 2
182 {
183 1 ES = 0; //串口中断关闭
184 1 EX0 = 0; //外部中断0关闭
185 1 ET0 = 1; //定时器0中断打开
186 1 TH0=0xFD;
187 1 TL0=0x1E; //设定时值为800us
188 1
189 1 for (IRCON=0; IRCON<3; IRCON++)
190 1 IRCode[IRCON] = 0;
191 1 IRCON = 0;
192 1 IRCON2 = 0; //计数清零
193 1
194 1 TR0 = 1;//开始计数
195 1 }
196
197 //根据全局变量输出相应的控制信号
198 void CSToOut(void)
199 {
200 1 P3_3 = 0;
201 1 P3_4 = 0;
202 1 P3_5 = 0;
203 1 P3_7 = 0; //用P3=0则烧到片上无法运行,原因不明,可能串口P3_0,P3_1有关
204 1 switch(CS)
205 1 {
206 2 case 0:
207 2 P1 = 255; //P1口全为高电平,0-3通过反相为低不选任何音源,4-7为高用于读取按键
208 2 ComOutChar(5); //发0x05到PC
209 2 break;
210 2 case 1:
211 2 P1_4 = 0; //为0反相后高电平选指定的音源
212 2 P3_3 = 1;
213 2 ComOutChar(1);
214 2 break;
215 2 case 2:
216 2 P1_5 = 0;
217 2 P3_4 = 1;
218 2 ComOutChar(2);
219 2 break;
220 2 case 3:
221 2 P1_6 = 0;
222 2 P3_5 = 1;
223 2 ComOutChar(3);
224 2 break;
225 2 case 4:
226 2 P1_7 = 0;
227 2 P3_7 = 1;
228 2 ComOutChar(4);
229 2 break;
230 2 }
231 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 622 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V8.08 WDJ 03/01/2008 06:27:14 PAGE 5
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -