📄 p87lpc764+万能遥控调光调速器.lst
字号:
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE P87LPC764_万能襙控礯筥礯_倨_
OBJECT MODULE PLACED IN P87LPC764+万能遥控调光调速器.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE P87LPC764+万能遥控调光调速器.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //P87LPC764+万能遥控调光调速器
2 //2006年11月
3
4 //Philips公司的51LPC系列
5 /*
6 一概述
7 本产品能实现白炽灯及各种灯具的控制手控遥控均可实现相同功能
8 其最大特点是不需特定遥控器对任何遥控器的任何按键都可以学习后进行操
9 作所以具有很大的灵活性及实用性
10 二使用说明
11 1 产品设置
12 1 10A 红外线遥控开关CPU 第19 脚接地20 脚悬空可选择可控硅或继电器
13 2 800W 红外线调光开关CPU 第19 20 脚均悬空
14 3 500VA 风机红外线调速CPU 第19 脚悬空20 脚接地
15 2 红外学习
16 1 10A 遥控开关学习方式为持续按下手控按钮4 秒钟进入学习状态指
17 示灯闪烁按下遥控器上的某个指定键指示灯闪烁两下学习成功
18 不按遥控键10 秒后开关进入正常状态
19 2 其他两种产品的学习方式为连续点击两下后持续按住进入学习状态后同
20 3 操作说明
21 1 10A 红外线遥控开关按一次键改变工作状态一次] 即开变关或关变开
22 2 800W 红外线调光开关
23 点动一次关渐亮到上一次调定的亮度亮渐暗到最小亮度后关断
24 连续两次点动关立即达到前一次亮度亮立即熄灭
25 持续按住亮度逐渐增加合适即可放开
26 点动后再持续按住亮度逐渐减小合适即可放开
27 3 500VA 风机红外线调速
28 点动一次关中速启动5 秒后逐渐转变为上次调定的转速转动断电
29 持续按住逐渐增加转速到合适放开按钮
30 点动后再持续按住逐渐减小转速到合适放开按钮
31 */
32
33 #include <REG764.H> //87LPC768寄存器定义头文件
34 #include <stdio.h>
35 #include <intrins.h>
36 #define AngleLimit 300 /*消除相角误差*/
37 #define SpeedLimit 700 /*控制最高和最低速度*/
38 /* 以控制u i 之间的相位差*/
39 sbit SDA=P1^2;
40 sbit SCL=P1^3;
41 sbit Led=P0^7;
42 sbit Key=P1^1;
43 sbit FIRE=P1^6;
44 sbit CtlLamp=P0^1;
45 sbit NO_R_SW=P0^2;
46 sbit SW=P1^0;
47
48 /*预留堆栈*/
49 unsigned char bdata SP1;
50 unsigned char bdata SP2;
51 unsigned char bdata SP3;
52 unsigned char bdata SP4;
53 unsigned char bdata SP5;
54 unsigned char bdata SP6;
55 unsigned char bdata SP7;
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 2
56 unsigned char bdata SP8;
57 unsigned char bdata FLAG;
58 sbit ON=FLAG^0;
59 sbit KeyDown=FLAG^1; /*用于识别按键口线为1 时,是否被按下过*/
60 sbit CONTI=FLAG^2; /*标志键被持续按下*/
61 sbit Task_Ovr=FLAG^3; /*任务处理标志*/
62 sbit FuncSet=FLAG^4; /*功能处理标志*/
63 sbit KeyStart=FLAG^5; /*键识别周期开始标志*/
64 sbit IsStudy=FLAG^6; /*红外学习标志*/
65 sbit StudyOK=FLAG^7; /*红外学习成功标志*/
66 unsigned char bdata FLAG1;
67 sbit RmtOK =FLAG1^0; /*遥控键正确识别标志*/
68 sbit CONTI_R=FLAG1^1; /*遥控键被持续按下*/
69 sbit RKeySt1=FLAG1^2; /*遥控键状态1*/
70 sbit RKeySt2=FLAG1^3; /*遥控键状态2*/
71 sbit RmtStart=FLAG1^4;
72 unsigned char data AGE; /*按键年龄*/
73 unsigned char data SwStyTime; /*开关状态时,按键按下时间*/
74 unsigned char data FuncCode; /*功能代码*/
75 unsigned char data DownTimes; /*按键连击次数*/
76 unsigned int data Fire_Angle;
77 unsigned int data MaxFireAngle; /*交流电半周期值对应的定时器值*/
78 unsigned int Last_FireAngle;
79 unsigned char data IRCLK; /*遥控识别计时时间,在过零中断每10ms 增1*/
80 unsigned char data IKCLK; /*键识别时间,在过零中断每10ms 增1*/
81 unsigned char data Buf[50];
82 unsigned char data Buf1[2];
83 void Delay(unsigned int);
84 int WriteEE(unsigned char SubAdr,unsigned char Num,unsigned char *Wbuf);
85 int ReadEE(unsigned char SubAdr,unsigned char Num,unsigned char *Rbuf);
86
87 unsigned char ReadByte();
88 int SendByte(unsigned char);
89 void Start(void);
90 void Stop(void);
91 void SendACK(void);
92 void SendNoACK(void);
93 void WDFeed(void);
94 void Task_10ms(void);
95 void FuncHandle(void);
96 void Calc_MaxFireAngle(void);
97 void Read_Last_FireAngle(void);
98 void Write_FireAngle(void);
99 void Read_MaxFireAngle(void);
100 void Write_MaxFireAngle(void);
101 unsigned char Get_L_Width();
102 unsigned char Get_H_Width();
103 /*定时器0 中断服务程序,用于可控硅点火*/
104 void Service_Timer0() interrupt 1
105 {
106 1 FIRE=0; /*产生点火脉冲*/
107 1 FIRE=0;
108 1 FIRE=0;
109 1 FIRE=1;
110 1 FIRE=1;
111 1 FIRE=1;
112 1 FIRE=0; /*产生点火脉冲*/
113 1 FIRE=0;
114 1 FIRE=0;
115 1 FIRE=1;
116 1 FIRE=1;
117 1 FIRE=1;
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 3
118 1 FIRE=0; /*产生点火脉冲*/
119 1 FIRE=0;
120 1 FIRE=0;
121 1 FIRE=1;
122 1 FIRE=1;
123 1 FIRE=1;
124 1 TR0=0; /*关闭定时器,禁止中断*/
125 1 ET0=0;
126 1 }
127 /*外部中断1 服务程序,用于遥控操作*/
128 void Service_Int1() interrupt 2
129 {
130 1 unsigned char data i,j,k;
131 1 EX1=0;
132 1 if(IsStudy==0){
133 2 /*遥控识别*/
134 2 if(StudyOK==1) goto Int1_reti;/*等待处理学习结果*/
135 2 if(FuncSet==1) goto Int1_reti;/*等待功能处理*/
136 2 if(CONTI_R==1) goto Int1_reti;/*持续按键,不再进行码识别*/
137 2 while(IRCLK<100){
138 3 WDRST=0X1E;
139 3 WDRST=0XE1; /*清除看门狗*/
140 3 RmtOK=1;
141 3 TH1=TL1=0;
142 3 TR1=1; /*启动定时器*/
143 3 while(INT1!=1);
144 3 TR1=0;
145 3 /*宽度小于0.25ms,是干扰脉冲*/
146 3 if(TH1==0 && TL1<120) {
147 4 if(RmtStart)
148 4 goto Ignore;
149 4 else
150 4 goto Int1_reti;/*干扰脉冲,且为首次,退出中断*/
151 4 }
152 3 j=(TH1*256+TL1 )/250;
153 3 j/=2;
154 3 if(j!=Buf[0]) break;
155 3 k=Get_H_Width();
156 3 if(k!=Buf[1]) break;
157 3 for(i=1;i<25;i++){
158 4 j=Get_L_Width();
159 4 k=Get_H_Width();
160 4 if(k==255) break;/*检测到255,不再比较*/
161 4 if(j!=Buf[2*i]) {RmtOK=0;break;}
162 4 if(k!=Buf[2*i+1]) {RmtOK=0;break;}
163 4 }
164 3
165 3 if(RmtOK==0) break;
166 3 /*是遥控开关,设定状态,退出*/
167 3 if(!NO_R_SW){
168 4 RKeySt1=1;
169 4 RKeySt2=0;
170 4 IRCLK=120;
171 4 i=250; /*延迟250ms*/
172 4 while(i--) for(j=0;j<125;j++);
173 4 break;
174 4 }
175 3 if(RKeySt1==0 && RKeySt2==0)
176 3 {RmtStart=1;IRCLK=0;RKeySt1=1;RKeySt2=0;}/*开始计时*/
177 3 /*接收成功,更新状态*/
178 3 else {RKeySt1=0;RKeySt2=1;}
179 3 /*检测连续按键*/
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 4
180 3 k=0;
181 3 while(k<8){
182 4 TF1=0;
183 4 TH1=TL1=0;
184 4 TR1=1; /*启动定时器*/
185 4 while(INT1!=0){
186 5 WDRST=0X1E;
187 5 WDRST=0XE1; /*清除看门狗*/
188 5 if(TF1==1) break;
189 5 }
190 4 TR1=0;
191 4 if(TF1==1) break;
192 4 j=(TH1*256+TL1)/250;
193 4 if(j<50) continue;/*间隔>25ms,表示为下一帧信号*/
194 4 /*获取低电平宽度(抗干扰)*/
195 4 TH1=TL1=0;
196 4 TR1=1;
197 4 while(INT1!=1);
198 4 TR1=0;
199 4 if(TH1>0 || TL1>120) k++; /*干扰脉冲不计数*/
200 4 }
201 3 if(k>7){
202 4
203 4 CONTI_R=1;
204 4 goto Int1_reti;
205 4 }
206 3 else
207 3 CONTI_R=0;
208 3 Ignore:
209 3 while(INT1){ /*等待INT1 变低*/
210 4 WDRST=0X1E; /*清看门狗*/
211 4 WDRST=0XE1;
212 4 if(IRCLK>120) goto Int1_reti;
213 4 }
214 3 }
215 2 }
216 1 else{
217 2 /*红外学习*/
218 2 if(StudyOK==1) goto Int1_reti;/*等待处理学习结果*/
219 2 EA=0;
220 2 for(i=0;i<25;i++){
221 3 Buf[2*i]=Get_L_Width();
222 3 Buf[2*i+1]=Get_H_Width();
223 3 }
224 2 for(i=0;i<6;i++) WriteEE(i*8,8,Buf+i*8);/*写学习结果*/
225 2 WriteEE(48,2,Buf+48);
226 2 EA=1;
227 2 i=150; /*延迟150ms 滤除后续信号*/
228 2 while(i--) for(j=0;j<125;j++);
229 2 StudyOK=1; /*置完成标志*/
230 2 }
231 1 Int1_reti:
232 1 EX1=1;
233 1 }
234 /*比较器中断,检测过零,作为相移控制的起始点(每10ms 中断一次)*/
235 void Service_Cmp1() interrupt 12
236 {
237 1 CMP1 &= 0xFE; /*清比较器1 中断标志*/
238 1 /*根据触发角设置时间常数*/
239 1 TH0= -(Fire_Angle)/256;
240 1 TL0=-(Fire_Angle)%256;
241 1 if(ON==1){
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 5
242 2 TR0=1; /*启动定时器0,开定时器0 中断*/
243 2 ET0=1;
244 2 }
245 1 else{
246 2 TR0=0;
247 2 ET0=0;
248 2 }
249 1 Task_Ovr=1; /*设置任务进程*/
250 1 if(RmtStart) IRCLK++; /*遥控识别计时时间+*/
251 1 /*以下处理按键*/
252 1 if(KeyStart){
253 2 IKCLK++; /*计时*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -