桂林电子科技大学单片机-原理与接口技术实验-ad转换用用实验(校内实验箱)
仪器准备杜邦线下载器实验箱。下载学校发的实验箱可能会有问题拿一个下载器接上4根线5V接上p3口的5vGND接GNDTXD和RXD分别接上p30和p31。代码#include reg52.h #include intrins.h // 采集地址引脚定义 sbit ADDA P2^0; sbit ADDB P2^1; sbit ADDC P2^2; // ADC0809控制引脚 //start启动信号上升沿清空寄存器下检沿启动adc转化信号 sbit START P2^7; sbit EOC P2^6; sbit OE P2^5; sbit CLOCK P2^4; // 共阴极数码管段码 0~9 unsigned char led_mod[] { 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f }; unsigned char ad_buf[8]; unsigned char disp_data; unsigned int time_20ms_cnt 0; unsigned int ch_switch_cnt 0; bit led_state 0; unsigned char disp_ch 0; unsigned char led_status 0xFF; unsigned char ad_ch 0; //延时函数用于数码管动态扫描 void Delay_ms(unsigned int ms) { unsigned char i, j; while(ms--) { _nop_(); i 2; j 199; do { while (--j); } while (--i); } } //10ms延时函数adc锁存通道ale用 void Delay10ms() { unsigned char i, j; i 2; j 239; do { while (--j); } while (--i); } //定时器0方式2自动重装中断主要用于生成方波的工作时钟 void timer0() interrupt 1 { CLOCK !CLOCK; } //定时器1方式1中断16位定时 void timer1() interrupt 3 { TH1 0xB8; TL1 0x00; time_20ms_cnt; ch_switch_cnt; // 200ms 翻转闪烁标志闪烁频率稳定 if(time_20ms_cnt 10) { time_20ms_cnt 0; led_state !led_state; } // 修改120ms*501秒仅在CH0、CH1之间循环切换 if(ch_switch_cnt 50) { ch_switch_cnt 0; disp_ch; if(disp_ch 2) // 只循环0、1两路 { disp_ch 0; } } if(disp_data 102) { led_status led_state ? 0xFF : 0x00; } else { led_status 0xFF; } } //ADC采集函数 unsigned char ADC0809convert(unsigned char ch) { unsigned char val; ADDA ch 0x01; ADDB (ch 1) 0x01; ADDC (ch 2) 0x01; START 0; START 1; Delay10ms(); START 0; while(EOC 0); OE 1; val P0; OE 0; return val; } //数码管显示函数 void Display_Scan(unsigned char x) { unsigned int voltage; unsigned char ge, shi, bai; voltage (unsigned long)x * 500 / 255; bai voltage / 100; shi (voltage / 10) % 10; ge voltage % 10; P1 0x00; P3 0x00; // 第一位个位 P3.0 P3 0x01; P1 led_mod[ge]; Delay_ms(1); // 缩短延时减少位选低电平时间 P1 0x00; P3 0x00; // 点亮后立刻关闭位选 // 第二位十位 P3.1 P3 0x02; P1 led_mod[shi]; Delay_ms(1); P1 0x00; P3 0x00; // 第三位百位 P3.2 带小数点 P3 0x04; P1 led_mod[bai] | 0x80; Delay_ms(1); P1 0x00; P3 0x00; // 三位扫描全部结束后仅此处刷新一次LED状态 P3 led_status; } //主函数 void main() { TMOD 0x02; TL0 0xE8; TH0 0xE8; ET0 1; TR0 1; TMOD | 0x10; TH1 0xB8; TL1 0x00; ET1 1; TR1 1; EA 1; while(1) { disp_data ad_buf[disp_ch]; Display_Scan(disp_data); // 修改2仅分时采集CH0、CH1两路 ad_buf[ad_ch] ADC0809convert(ad_ch); ad_ch; if(ad_ch 2) { ad_ch 0; } } }在keli编译成功之后,使用stc-icp软件下载到板子上。接线p1.0p1.7连接J6P3.0~P3.7连接J4P0.0~P0.7连接J22P3.0~P3.7连接J5p2.0~p2.2连接J23的abcp2.4~p2.7连接并行a/d转换的clkx2~startJP2的gnd连接J21的gndJP2的0到5V连接J21的ch0JP1的gnd连接J21的gndJP1的0到5V连接J21的ch1并行a/d转换的右start连接J23的ale现象扭动2个可调电压在数码管看到2个数字循环变动。在电压低于2v时LED灯光闪烁。在大于2v时LED灯管常亮。可能存在的问题1下载不了:可能是下载器的线没接紧如果5v接上p3的5v没有上电的情况下核心板没有电可能是实验箱有问题建议更换。2数码管显示不全:大概率是线接触不良。3数值会不断变化电路本身会产生微小噪声以及adc本身具有误差在采集过程中仅仅只做了单次采样没有采用平均的lvbo验收老师可能会问1ADC0809的芯片是怎样的特点2单片机运行的顺序3使用了几个定时器分别是什么模式和功能4为什么量程是0-5v而不是0-4.98v5解释代码回答18位逐次逼近型adc采用8路模拟输入2电压输入后abc三路选择通道ALE锁存通道地址之后START的上升沿清空寄存器下降沿开始ad转换EOC等待信号OE读取信号。32个定时器0方式2自动重装用于ad模块的时钟;定时器1方式1用于数码管的动态扫描(4) 在数码管显示函数voltage (unsigned long)x * 500 / 255;严谨的公式是电压值等于采样值*500/256但是在工程中会存在误差采用工程近似换算将量程改成0-5v方便好看和忽略微小误差。5......

相关新闻