单片机与ADC连接采用IO方式,采用查询方式采集模拟电压(0~5V),送到数码管显示。0~5V的被测电压加到ADC0809芯片的IN3通道,进行A/D转换,输入电压的大小可通过手动调节RV1来实现。生成代码
时间: 2023-12-06 20:45:03 浏览: 27
以下是基于51单片机的ADC0809芯片实现0~5V采集并显示到数码管的代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK = P3^6;
sbit CS = P3^7;
sbit EOC = P3^5;
sbit DIG1 = P1^0;
sbit DIG2 = P1^1;
sbit DIG3 = P1^2;
sbit DIG4 = P1^3;
sbit ADC_OUT = P1^7;
uchar code seg_table[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void delay(int i) { // 延时函数
while(i--);
}
void write_com(uchar com) { // 写入ADC0809控制字
uchar i;
CS = 0;
delay(10);
for(i = 0; i < 8; i++) {
CLK = 0;
delay(10);
if(com & 0x80) {
ADC_OUT = 1;
}
else {
ADC_OUT = 0;
}
com <<= 1;
CLK = 1;
delay(10);
}
CS = 1;
delay(10);
}
uint read_adc() { // 读取ADC0809转换结果
uint dat = 0;
uchar i;
EOC = 1;
delay(10);
EOC = 0;
delay(10);
for(i = 0; i < 8; i++) {
CLK = 0;
delay(10);
CLK = 1;
delay(10);
dat <<= 1;
if(ADC_OUT) {
dat |= 0x01;
}
}
return dat;
}
void display(uchar num) { // 数码管显示函数
DIG1 = DIG2 = DIG3 = DIG4 = 1;
P0 = seg_table[num];
switch(num) {
case 0: DIG1 = 0; break;
case 1: DIG2 = 0; break;
case 2: DIG3 = 0; break;
case 3: DIG4 = 0; break;
}
}
void main() {
uint val;
uchar i, h, l;
while(1) {
write_com(0x88); // 选择IN3通道
delay(10);
write_com(0xcf); // 启动A/D转换
delay(100);
val = read_adc(); // 读取转换结果
h = val / 100; // 取百位数
l = val % 100; // 取十位和个位数
display(h); // 显示百位数
delay(1000); // 延时1秒
for(i = 0; i < 20; i++) { // 闪烁显示十位和个位数
display(10); // 数码管显示空白
delay(50);
display(l / 10); // 显示十位数
delay(50);
display(l % 10); // 显示个位数
delay(50);
}
}
}
```
需要注意的是,ADC0809芯片的IN3通道需要选择为单端输入模式,并且参考电压需要设置为5V。在代码中,通过手动调节RV1来改变输入电压大小,从而实现对被测电压的采集和显示。