ADC0809实现电压的测量和显示 要求:使用ADC0809进行AD转化:变阻器分得的电压由ADC0809的通道3输入,转换得到的数字量要换算为十进制的电压值后,用液晶显示器显示该电压值(电压值保留小数点后两位)。
时间: 2023-12-02 19:05:20 浏览: 211
通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。同时,将模拟电压转换数值存储在外部RAM中
5星 · 资源好评率100%
好的,这里提供一种基于单片机控制的ADC0809实现电压测量和显示的方法,具体步骤如下:
1. 连接ADC0809和单片机,具体连接方式可以参考ADC0809的数据手册。这里以使用单片机的8个IO口作为ADC0809的控制信号和数据信号,其中P1口连接ADC0809的地址信号A0~A2,P3.4口作为ADC0809的转换启动信号,P3.5~P3.7口作为ADC0809的数据信号D0~D2。
2. 连接变阻器电路,并将变阻器输出电压连接到ADC0809的第三个通道输入端。
3. 在单片机程序中初始化ADC0809的控制信号和数据信号,并设置ADC0809的转换模式为单次转换模式。
4. 循环执行以下操作:设置ADC0809的通道选择信号为通道3,启动ADC0809的转换,等待转换完成,读取ADC0809的转换结果,并进行数字处理将其转换为电压值,最后将电压值通过液晶显示器进行显示。
下面是一份示例代码,供参考:
```
#include <reg52.h>
#include <stdio.h>
// 定义ADC0809的控制信号和数据信号端口
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit START = P3^4;
sbit D0 = P3^5;
sbit D1 = P3^6;
sbit D2 = P3^7;
// 定义LCD1602的控制信号和数据信号端口
sbit RS = P2^0;
sbit EN = P2^1;
sbit D4 = P2^2;
sbit D5 = P2^3;
sbit D6 = P2^4;
sbit D7 = P2^5;
// 声明函数
void init_lcd();
void write_command(unsigned char com);
void write_data(unsigned char dat);
void delay_ms(unsigned int ms);
float get_voltage();
// 主函数
void main() {
float voltage = 0.0;
char str[16];
init_lcd();
while(1) {
voltage = get_voltage();
sprintf(str, "Voltage: %.2fV", voltage);
write_command(0x80); // 光标移动到第一行第一列
for(int i=0; i<16; i++) {
if(str[i] != '\0') {
write_data(str[i]);
} else {
break;
}
}
delay_ms(1000); // 延时1秒
}
}
// 初始化LCD1602
void init_lcd() {
write_command(0x38); // 8位数据总线,2行显示,5x7点阵字符
write_command(0x0c); // 显示开,光标关,光标闪烁关
write_command(0x06); // 光标移动时,整体移动,不移动光标
write_command(0x01); // 清屏
delay_ms(10); // 延时10ms
}
// 向LCD1602写入指令
void write_command(unsigned char com) {
RS = 0;
EN = 1;
D7 = (com>>7) & 0x01;
D6 = (com>>6) & 0x01;
D5 = (com>>5) & 0x01;
D4 = (com>>4) & 0x01;
EN = 0;
delay_ms(1);
EN = 1;
D7 = (com>>3) & 0x01;
D6 = (com>>2) & 0x01;
D5 = (com>>1) & 0x01;
D4 = com & 0x01;
EN = 0;
delay_ms(1);
}
// 向LCD1602写入数据
void write_data(unsigned char dat) {
RS = 1;
EN = 1;
D7 = (dat>>7) & 0x01;
D6 = (dat>>6) & 0x01;
D5 = (dat>>5) & 0x01;
D4 = (dat>>4) & 0x01;
EN = 0;
delay_ms(1);
EN = 1;
D7 = (dat>>3) & 0x01;
D6 = (dat>>2) & 0x01;
D5 = (dat>>1) & 0x01;
D4 = dat & 0x01;
EN = 0;
delay_ms(1);
}
// 延时函数,延时ms毫秒
void delay_ms(unsigned int ms) {
unsigned int i, j;
for(i=0; i<ms; i++) {
for(j=0; j<112; j++);
}
}
// 获取ADC0809转换结果对应的电压值
float get_voltage() {
float voltage = 0.0;
unsigned char result = 0;
ADDR0 = 1;
ADDR1 = 1;
ADDR2 = 1; // 通道3
START = 1; // 启动转换
while(START); // 等待转换完成
START = 0;
result = (D2<<2) | (D1<<1) | D0; // 读取转换结果
voltage = (float)result / 255.0 * 5.0; // 转换为电压值
return voltage;
}
```
这样就可以实现ADC0809实现电压的测量和显示了。需要注意的是,液晶显示器的驱动方式和参数需要根据具体的型号进行设置。
阅读全文