📄 23.lst
字号:
155 /********************************************************************/
156
157 void lcd_pos(uchar pos)
158 {
159 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
160 1 }
161
162 /********************************************************************/
163 /* */
164 /* 启动ADC转换 */
165 /* */
166 /********************************************************************/
167
168 void ADC_start()
169 {
170 1 ADC_CS=1; //一个转换周期开始
171 1 _nop_();
172 1 ADC_CLK=0;
173 1 _nop_();
174 1 ADC_CS=0; //CS置0,片选有效
175 1 _nop_();
176 1 ADC_DI=1; //DI置1,起始位
177 1 _nop_();
178 1 ADC_CLK=1; //第一个脉冲
179 1 _nop_();
C51 COMPILER V7.06 23 03/25/2008 09:55:11 PAGE 4
180 1 ADC_DI=0; //在负跳变之前加一个DI反转操作
181 1 _nop_();
182 1 ADC_CLK=0;
183 1 _nop_();
184 1 }
185
186 /********************************************************************/
187 /* */
188 /*AD转换函数 */
189 /*选择输入通道,输入信号的模式《单端输入,或差分输入》 */
190 /*模数转换 */
191 /* */
192 /********************************************************************/
193
194 int ADC_read(uchar mode)
195 {
196 1 uchar i;
197 1 ADC_start(); //启动转换开始
198 1 ACC=mode;
199 1 ADC_DI=ACC1; //输出控制位1,DI=1,单通道输入,DI=0,差分输入。
200 1 ADC_CLK=1; //第二个脉冲
201 1 _nop_();
202 1 ADC_DI=0;
203 1 ADC_CLK=0;
204 1 _nop_();
205 1 ADC_DI=ACC0; //输出控制位0,DI=0,通道0输入,DI=1,通道1输入。
206 1 ADC_CLK=1; //第三个脉冲
207 1 _nop_();
208 1 ADC_DI=1;
209 1 ADC_CLK=0; //输入模式和通道号已经选择完。
210 1
211 1 ADC_CLK=1; //第四个脉冲
212 1 ACC=0;
213 1
214 1 for(i=8;i>0;i--) //读取8位数据
215 1 {
216 2 ADC_CLK=0; //脉冲下降沿
217 2
218 2 ACC=ACC<<1;
219 2 ACC0=ADC_DO; //读取DO端数据
220 2 _nop_();
221 2 _nop_();
222 2 ADC_CLK=1;
223 2 }
224 1 ADC_CS=1; //CS=1,片选无效。
225 1 return(ACC);
226 1 }
227
228 /********************************************************************/
229 /* */
230 /* 数据处理与显示 */
231 /* 将采集到的数据进行16进制转换为ASCLL码,并送显示。 */
232 /* */
233 /********************************************************************/
234
235 show_value(uchar ad_data)
236
237 {
238 1 dis[2]=ad_data/51; //AD值转换为3为BCD码,最大为5.00V。
239 1 dis[2]=dis[2]+0x30;
240 1 dis[3]=ad_data%51; //余数暂存
241 1 dis[3]=dis[3]*10; //计算小数第一位
C51 COMPILER V7.06 23 03/25/2008 09:55:11 PAGE 5
242 1 dis[1]=dis[3]/51;
243 1 dis[1]=dis[1]+0x30;
244 1 dis[3]=dis[3]%51;
245 1 dis[3]=dis[3]*10; //计算小数第二位
246 1 dis[0]=dis[3]/51; //
247 1 dis[0]=dis[0]+0x30;
248 1
249 1 lcd_pos(0x4a);
250 1 lcd_wdat(dis[2]); //整数位显示
251 1 lcd_pos(0x4c);
252 1 lcd_wdat(dis[1]); //第一位小数显示
253 1 lcd_pos(0x4d);
254 1 lcd_wdat(dis[0]); //第二位小数显示
255 1 }
256
257 /********************************************************************/
258 /* */
259 /* 主程序 */
260 /* */
261 /********************************************************************/
262
263 void main()
264 {
265 1 uchar i,n;
266 1 delay(10); //延时
267 1 lcd_init(); //初始化LCD
268 1
269 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
270 1 i = 0;
271 1 while(dis4[i] != '\0')
272 1 { //显示字符"DIGITALVOLTMETER"
273 2 lcd_wdat(dis4[i]);
274 2 i++;
275 2 }
276 1
277 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
278 1 i = 0;
279 1 while(dis5[i] != '\0')
280 1 {
281 2 lcd_wdat(dis5[i]); //显示字符" VOLTAGE: . V "
282 2 i++;
283 2 }
284 1
285 1 while(1)
286 1 {
287 2 n=ADC_read(channel_0); //采集值送入n
288 2 show_value(n); //n中数据处理与显示
289 2
290 2 delay(50); //延时50ms
291 2 }
292 1 }
293
294 /********************************************************************/
295 /* */
296 /*将n=ADC_read(channel_0)改为n=ADC_read(channel_1)即可使用JP6输入 */
297 /* */
298 /********************************************************************/
*** WARNING C316 IN LINE 298 OF 3\23.c: unterminated conditionals
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 448 ----
C51 COMPILER V7.06 23 03/25/2008 09:55:11 PAGE 6
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 1
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -