📄 ad_da.lst
字号:
152 {
153 1 unsigned char temp=0;
154 1 unsigned char temp1=0;
155 1 unsigned char BitCounter=8;
156 1
157 1 Sda=1;
158 1 do
159 1 {
160 2 Scl=0;
161 2 _nop_();
162 2 Scl=1;
163 2 _nop_();
164 2 if(Sda)
165 2 temp=temp|0x01;
166 2 else
167 2 temp=temp&0xfe;
168 2
169 2 if(BitCounter-1)
170 2 {
171 3 temp1=temp<<1;
172 3 temp=temp1;
173 3 }
174 2 BitCounter--;
175 2 }
176 1 while(BitCounter);
177 1 return(temp);
178 1 }
179
C51 COMPILER V8.05a AD_DA 12/06/2010 21:00:25 PAGE 4
180 /*------------------------------------------------
181 写入DA数模转换值
182 ------------------------------------------------*/
183 void DAC(unsigned char Data)
184 {
185 1 Start();
186 1 Send(AddWr); //写入芯片地址
187 1 Ack();
188 1 Send(0x40); //写入控制位,使能DAC输出
189 1 Ack();
190 1 Send(Data); //写数据
191 1 Ack();
192 1 Stop();
193 1
194 1 }
195
196 /*------------------------------------------------
197 读取AD模数转换的值,有返回值
198 ------------------------------------------------*/
199 unsigned char ReadADC(unsigned char Chl)
200 {
201 1 unsigned char Data;
202 1 Start(); //写入芯片地址
203 1 Send(AddWr);
204 1 Ack();
205 1 Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
206 1 //Chl的值分别为0、1、2、3,分别代表1-4通道
207 1 Ack();
208 1 Start();
209 1 Send(AddRd); //读入地址
210 1 Ack();
211 1 Data=Read(); //读数据
212 1 Scl=0;
213 1 NoAck();
214 1 Stop();
215 1 return Data; //返回值
216 1 }
217
218 void fmg(void)//fm关
219 {
220 1 Fm=1; // 关 fm
221 1 }
222 void cmg(void)//数码管锁存函数 关时钟DS1302
223 {
224 1 dula=1;
225 1 P0=0x00;
226 1 dula=0;
227 1 wela=1;
228 1 P0=0x00;
229 1 wela=0;
230 1 RST=0; // 关时钟DS1302
231 1 }
232 /*------------------------------------------------
233 主程序
234 ------------------------------------------------*/
235 void main()
236 {
237 1 unsigned char num; //DA数模输出变量
238 1 unsigned char ADtemp; //定义中间变量
239 1 Init_Timer1();
240 1 cmg();//数码管锁存
241 1 fmg();
C51 COMPILER V8.05a AD_DA 12/06/2010 21:00:25 PAGE 5
242 1 while(1)
243 1 {
244 2
245 2 DAC(num); //DA输出,可以用LED模拟电压变化
246 2 num++; //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
247 2 mDelay(20); //延时用于清晰看出变化
248 2 if(ADFlag) //定时采集输入模拟量
249 2
250 2 {
251 3 ADFlag=0;
252 3
253 3 ADtemp=ReadADC(0);
254 3 Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示
255 3 Display[1]=Datatab[((ReadADC(0))%50)/10];
256 3
257 3 ADtemp=ReadADC(1);
258 3 Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
259 3 Display[3]=Datatab[((ReadADC(1))%50)/10];
260 3
261 3 ADtemp=ReadADC(2);
262 3 Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
263 3 Display[5]=Datatab[((ReadADC(2))%50)/10];
264 3
265 3 ADtemp=ReadADC(3);
266 3 Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
267 3 Display[7]=Datatab[((ReadADC(3))%50)/10];
268 3
269 3
270 3 }
271 2 }
272 1 }
273
274 /*------------------------------------------------
275 定时器中断程序
276 ------------------------------------------------*/
277 void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
278 {
279 1
280 1 static unsigned int count,j;
281 1 TH1=0xfb; //重新赋值
282 1 TL1=0x00;
283 1 j++;
284 1 if(j==300)
285 1 {j=0;ADFlag=1;} //定时置位AD采样标志位
286 1
287 1 P0=Display[count];//用于动态扫描数码管
288 1 P2=count;
289 1 count++;
290 1 if(count==8) //表示扫描8个数码管
291 1 count=0;
292 1
293 1
294 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 503 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 1
IDATA SIZE = ---- ----
C51 COMPILER V8.05a AD_DA 12/06/2010 21:00:25 PAGE 6
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -