📄 hongwai_2.lst
字号:
C51 COMPILER V7.06 HONGWAI_2 05/12/2008 07:17:31 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE HONGWAI_2
OBJECT MODULE PLACED IN HongWai_2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE HongWai_2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /****************************************************/
2 /*** 题目:基于C8051F020单片机***红外遥控编码***
3 /*** 方法:扫描法
4 /*** 创建:杨占刚
5 /*** 时间:08_04_16
6 /*** 注解;0xAA:0键控制;0xAB:1键控制;0xAC:2键控制;0xAD:3键控制;0xB2:4键控制
7 0xB3:5键控制;0xB4:6键控制;0xB5:7键控制;0xCA:8键控制;0xCB:9键控制
8 *******************************************************/
9
10 #include "c8051f020.h"
11 #include "stdio.h"
12
13 #define BAUDRATE 115200
14 #define SYSCLK 22114800
15 #define uchar unsigned char
16
17 sbit P36=P3^6;
18 static uchar data IRCode[3],IRCON,IRCON2; //定义静态变量
19 static uchar data key_number;
20
21
22 void SYSCLK_Init(void)
23 {
24 1 int i = 0; //定义延时变量
25 1 OSCXCN = 0x67; //启动外部振荡器22.1184MHz晶体
26 1 for (i = 0; i < 3000; i++); // Wait 1ms for initialization
27 1 while ((OSCXCN & 0x80) == 0); //等待晶体振荡器稳定
28 1 OSCICN = 0x88; //使能时钟丢失检测器,检测到时钟丢失时间大于100ms将触发复位,使能外部时钟为系统时钟
29 1 }
30
31 void PORT_Init(void)
32 {
33 1 WDTCN = 0xde;
34 1 WDTCN = 0xad;
35 1 XBR0 = 0x04;
36 1 XBR2 = 0x40;
37 1 }
38
39 void Timer1_Init(void)
40 {
41 1 TMOD = 0x21; //定时T1方式2,为波特率发生器 115200
42 1 TH1 = 0xF4; //按波特率设置初值
43 1 SCON0 = 0X50; //URAT0方式1,允许接收
44 1 CKCON|= 0x10; //
45 1 PCON |= 0X80; //SMOD00=1
46 1 TI0=0;
47 1 }
48
49
50 void Delay(uchar j)
51 {
52 1 unsigned int de,i;
53 1 if(j)//这里起到按键值正确后会有一个延时,防止重复按键
54 1 {
55 2 for(i=0; i<1000; i++)
C51 COMPILER V7.06 HONGWAI_2 05/12/2008 07:17:31 PAGE 2
56 2 for(de=0; de<200; de++);
57 2 j--;
58 2 }
59 1 }
60
61 void main(void)
62 {
63 1 SYSCLK_Init();
64 1 PORT_Init();
65 1 Timer1_Init();
66 1 P5=0X18;
67 1 EA=0;
68 1 key_number=10;
69 1 while(P36==1);
70 1 while(P36==0)
71 1 {
72 2 EA=1;
73 2 ET0 = 1; //定时器0中断打开
74 2 TH0 = 0XFA;
75 2 TL0 = 0X05;//T0 产生800us的定时中断
76 2 for (IRCON=0; IRCON<3; IRCON++)
77 2 IRCode[IRCON] = 0;
78 2 IRCON = 0;
79 2 IRCON2 = 0; //计数清零
80 2 TR0 = 1; //开始计数
81 2 while(1)
82 2 {
83 3 if(key_number!=10)
84 3 break;
85 3 }
86 2 }
87 1 }
88
89
90
91 //定时器0溢出中断
92 void Timer0(void) interrupt 1
93 {
94 1 TR1 = 1; //激活定时1,产生波特率
95 1 TH0 = 0XFA;
96 1 TL0 = 0X05;//T0 产生800us的定时中断
97 1 if(IRCON<3)
98 1 {
99 2 if(IRCON2<8)
100 2 {
101 3 IRCON2++;
102 3 IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
103 3 IRCode[IRCON]=IRCode[IRCON] | P36; //每八次填满一个字节,一个字节存放遥控编码4个位
104 3 }
105 2 else
106 2 {
107 3 IRCON++; //填满一个字节,指向下一个变量[注意: 这里会抛弃一个脉冲周期 不接收 ]
108 3 IRCON2=0; //计数清零
109 3 }
110 2 }
111 1 else
112 1 {
113 2 //第一字节是引导码起始位、控制位等 后两个字节有意义 (IRCode[1]不都是0x55只是现在方便判断) 最后一位是
-编码末尾的前半位
114 2 TR1 = 1;
115 2 TR0 = 0; //关闭定时器
116 2 ET0 = 0; //定时器0中断关闭
C51 COMPILER V7.06 HONGWAI_2 05/12/2008 07:17:31 PAGE 3
117 2 SBUF0=IRCode[2];
118 2 while(TI0!=0);
119 2 TI0=0;
120 2 if((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))
121 2 {
122 3 if(IRCode[1] == 0x55)
123 3 {
124 4 switch(IRCode[2])
125 4 {
126 5 case 0xAA: //0键控制
127 5 key_number=0;
128 5 P5=0X00;
129 5 Delay(1);
130 5 break;
131 5 case 0xAB: //1键控制
132 5 key_number=1;
133 5 P5=0X01;
134 5 Delay(1);
135 5 break;
136 5 case 0xAC: //2键控制
137 5 key_number=2;
138 5 P5=0X02;
139 5 Delay(1);
140 5 break;
141 5 case 0xAD: //3键控制
142 5 P5=0X04;
143 5 key_number=3;
144 5 Delay(1);
145 5 break;
146 5 case 0xB2: //4键控制
147 5 P5=0X08;
148 5 key_number=4;
149 5 Delay(1);
150 5 break;
151 5 case 0xB3: //5键控制
152 5 P5=0X10;
153 5 key_number=5;
154 5 Delay(1);
155 5 break;
156 5 case 0xB4: //6键控制
157 5 P5=0X20;
158 5 key_number=6;
159 5 Delay(1);
160 5 break;
161 5 case 0xB5: //7键控制
162 5 P5=0X40;
163 5 key_number=7;
164 5 Delay(1);
165 5 break;
166 5 case 0xCA: //8键控制
167 5 P5=0X80;
168 5 key_number=8;
169 5 Delay(1);
170 5 break;
171 5 case 0xCB: //9键控制
172 5 key_number=9;
173 5 P5=0XFF;
174 5 Delay(1);
175 5 break;
176 5 default:
177 5 break;
178 5 }
C51 COMPILER V7.06 HONGWAI_2 05/12/2008 07:17:31 PAGE 4
179 4 printf("key_number is:%d",key_number%256);
180 4 printf("\n");
181 4 printf("\n");
182 4 }
183 3 }
184 2 }
185 1 }
186
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 466 ----
CONSTANT SIZE = 19 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
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 + -