?? 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 + -