📄 main.lst
字号:
C51 COMPILER V7.10 MAIN 05/22/2006 14:37:00 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***********************************************************************
2 IRIS05B SOFT 3.3 2005/11/04 BY GAOJIAN
3 此程序下的脉冲驱动方式为脉冲
4 宽度调制,脉冲周期不变,占空比
5 随采样值与目标值的差来确定,
6 差值越大,占空比越大。
7 此程序试用电路版本 V2.1
8 3.3版修改了光圈电机不能时时转动的问题
9 2005-11-08 NDFilter, Iris初始化
10
11 ***********************************************************************/
12 #include <ADUC812.H>
13 #include <math.h>
14
15
16 sbit IRIS_RUN=P2^4;
17 sbit IRIS_DIR=P2^5;
18 sbit FILTER_RUN=P2^6;
19 sbit FILTER_DIR=P2^7;
20 sbit V_IRIS=P1^3;
21 sbit V_ABS=P1^2;
22 sbit ND_INVAL=P3^2;
23 sbit ND_VAL=P3^3;
24
25 #define uchar unsigned char
26 #define RUN 0
27 #define STOP 1
28 #define L_DIR 0
29 #define R_DIR 1
30 #define ADIN_V_ABS 0x02
31 #define ADIN_V_IRIS 0x03
32 #define unWidth 255
33 #define unMinPulse 35
34
35 unsigned int IRIS_TgtPos; //光圈目标位置
36 unsigned int IRIS_CurPos; //光圈当前位置
37 unsigned char Filter_TgtPos; //滤光片目标位置
38 unsigned char L_IRIS_Run_Flag; //光圈电机向左转动标志位 0xFF有效 其他值无效
39 unsigned char R_IRIS_Run_Flag; //光圈电机向右转动标志位 0xFF有效 其他值无效
40 unsigned char Filter_ND_INVAL_Flag;
41 unsigned char Filter_ND_VAL_Flag; //滤光片目标位置标志位
42 unsigned char V_ABS_L,V_ABS_H;
43 unsigned char V_AEC_L,V_AEC_H;
44 unsigned char Counter_Time;
45 unsigned int Cnt; //电机转动定时变量
46 unsigned int Y;
47 unsigned char ABS_M; //ABS输出计算参数
48 unsigned int ABS_N;
49 unsigned char AEC_M;
50 unsigned int AEC_N;
51
52 unsigned char unPulseHigh;
53 unsigned char unPulseLow;
54
55 unsigned int unDelPos;
C51 COMPILER V7.10 MAIN 05/22/2006 14:37:00 PAGE 2
56 unsigned int unDelPos1;
57 unsigned int unDelPos2;
58
59
60
61 void SystemInit();
62 void UpdataCurPos();
63 unsigned int GetADC(unsigned char Channel);
64 void Delay(unsigned int D_time);
65 //void PutDAC(uchar DA0_H,uchar DA0_L,uchar DA1_H,uchar DA1_L);
66 void Serial_Port_Trans(unsigned int Trans_Data);
67 void Serial_Port();
68 void IRIS_Moto_Run();
69 void Filter_Run_L();
70 void Filter_Run_R();
71 void Initial_Filter_Moto();
72 void ABS_Account();
73 void AEC_Account();
74 void Put_ABS(uchar DA0_H,uchar DA0_L);
75 void Put_AEC(uchar DA1_H,uchar DA1_L);
76 void R_Reverse();
77 void L_Reverse();
78 void Delay(unsigned int D_time);
79 void Time0();
80
81 void InitIris(); //2005-11-08,光圈位置初始化
82
83 main()
84 {
85 1 SystemInit();
86 1 UpdataCurPos();
87 1 //-------------------------------------------//
88 1 //2005-11-08 NDFilter, Iris初始化 //
89 1 //-------------------------------------------//
90 1 //Initial_Filter_Moto(); // ND Filter 初始化
91 1 //InitIris(); // 光圈位置初始化
92 1 //----------------- --------------------------//
93 1
94 1 while(1)
95 1 {
96 2 /*UpdataCurPos();
97 2 Serial_Port_Trans(IRIS_CurPos);
98 2 Delay(10000);*/
99 2 if((R_IRIS_Run_Flag!=0xFF)&&(L_IRIS_Run_Flag!=0xFF))
100 2 {
101 3 //ABS_Account();
102 3 AEC_Account();
103 3 }
104 2
105 2 while((R_IRIS_Run_Flag==0xFF)||(L_IRIS_Run_Flag==0xFF))
106 2 {
107 3 IRIS_Moto_Run();
108 3
109 3 //Serial_Port_Trans(IRIS_CurPos); //此处上传的值为停止时刻的IRIS_CurPos数值
110 3 //Delay(30000);
111 3 //UpdataCurPos(); //注意:调试使使用的,最终产品要去掉延时和串口返回
112 3 //Serial_Port_Trans(IRIS_CurPos);
113 3 //IRIS_CurPos=IRIS_TgtPos;
114 3 }
115 2
116 2 }
117 1 }
C51 COMPILER V7.10 MAIN 05/22/2006 14:37:00 PAGE 3
118
119 void SystemInit() //系统初始化函数
120 {
121 1 Filter_ND_INVAL_Flag=0x00;
122 1 Filter_ND_VAL_Flag=0x00;
123 1 L_IRIS_Run_Flag=0x00;
124 1 R_IRIS_Run_Flag=0x00;
125 1 IRIS_TgtPos=0x0700;
126 1 Counter_Time=0x00;
127 1
128 1 ABS_M=0x01;
129 1 ABS_N=0x07F0;
130 1 AEC_M=0x01;
131 1 AEC_N=0x07F0;
132 1 TL2=0xDC;
133 1 TH2=0xFF;
134 1 RCAP2L=0xDC;
135 1 RCAP2H=0xFF;
136 1 T2CON=0x30; //set rate and start
137 1 TR2=1;
138 1 SCON=0x50; //set serial port mode
139 1 ADCCON1=0x7c;
140 1 TMOD=0x01; //定时器0工作在方式1
141 1 TL0=0x00;
142 1 TH0=0x00; //设定定时器初值
143 1
144 1 ES=1; //允许串口中断
145 1 EX1=1;
146 1 EX0=1; //允许外部中断
147 1 ET0=1; //允许定时器0中断
148 1
149 1 IT0=1;
150 1 IT1=1; //设置外部中断为下降沿触发方式
151 1
152 1 PX1=1;
153 1 PX0=1; //设定外部中断优先位
154 1 EA=1;
155 1
156 1 }
157
158 void UpdataCurPos() // 更新当前的光圈位置
159 {
160 1 IRIS_CurPos=GetADC(ADIN_V_IRIS);
161 1
162 1 if(IRIS_CurPos > IRIS_TgtPos)
163 1 {
164 2 unDelPos = (IRIS_CurPos - IRIS_TgtPos)/256;
165 2 if(IRIS_CurPos - IRIS_TgtPos>=0x0600)
166 2 { //根据当前值与目标值的差值大小
167 3 unPulseHigh = unDelPos*12+ unMinPulse; //设定相乘系数
168 3
169 3 }
170 2 else if(IRIS_CurPos - IRIS_TgtPos>=0x0300)
171 2 {
172 3 unPulseHigh = unDelPos*8+ unMinPulse;
173 3 }
174 2 else if(IRIS_CurPos - IRIS_TgtPos>0x0180)
175 2 {
176 3 unPulseHigh = unDelPos*2+ unMinPulse;
177 3 }
178 2 else
179 2 {
C51 COMPILER V7.10 MAIN 05/22/2006 14:37:00 PAGE 4
180 3 unPulseHigh = unDelPos+ unMinPulse;
181 3 }
182 2 }
183 1 else
184 1 {
185 2 unDelPos = (IRIS_TgtPos - IRIS_CurPos)/256;
186 2 if(IRIS_TgtPos - IRIS_CurPos>=0x0600)
187 2 {
188 3 unPulseHigh = unDelPos*12+ unMinPulse;
189 3 }
190 2 else if(IRIS_TgtPos - IRIS_CurPos>=0x0300)
191 2 {
192 3 unPulseHigh = unDelPos*8+ unMinPulse;
193 3 }
194 2 else if(IRIS_CurPos - IRIS_TgtPos>0x0180)
195 2 {
196 3 unPulseHigh = unDelPos*2+ unMinPulse;
197 3 }
198 2 else
199 2 {
200 3 unPulseHigh = unDelPos+ unMinPulse;
201 3 }
202 2
203 2 }
204 1 unPulseLow = unWidth - unPulseHigh;
205 1 IRIS_CurPos=IRIS_CurPos&0xFFF0; //屏蔽ADC输入的低四位
206 1
207 1 }
208 //ADC function and choose ADC0---ADC7 by Channel
209 unsigned int GetADC(unsigned char Channel)
210 {
211 1 unsigned char *p;
212 1 unsigned char variable;
213 1 unsigned int ADC_value; //用指针将2个char类型数合并成一个int型数
214 1
215 1 p=(unsigned char *)&ADC_value;
216 1 ADCCON2=Channel;
217 1 // Delay(100);
218 1 SCONV=1;
219 1 while (SCONV)
220 1 { }
221 1 SCONV=1;
222 1 while (SCONV)
223 1 { }
224 1 variable=0x0F&ADCDATAH; //屏蔽ADC输入的通道标识符号
225 1 *p=variable;
226 1 p++;
227 1 *p=ADCDATAL;
228 1
229 1 //Serial_Port_Trans(ADC_value);
230 1 return(ADC_value);
231 1 }
232
233 void Put_ABS(uchar DA0_H,uchar DA0_L)
234 {
235 1
236 1 DACCON=0x1F;
237 1 DAC0H=DA0_H;
238 1 DAC0L=DA0_L;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -