单路电压表c语言编程,基于ADC0809和AT89S52单片机的数字电压表的设计

1.引言

本设计待测的输入电压为8路,电压范围为0~5V,使用目前广泛使用的AT89S52来做控制系统,用ADC0809来进行模拟电压的采集及模数转换,实现采集8路数据,并将结果在四位一体数码管上进行滚动显示或单独显示的功能,测量的最小分辨率为0.019V.

2 硬件设计

2 . 1 系统构成

该系统主要包括几大模块:数据采集模块、A/D转换模块、控制模块、显示模块、按键模块等。采用AT89S52作为控制模块,A/DC0 8 0 9作为A/D转换模块的核心,ADC0809本身具有8路模拟量输入端口,通过C、B、A,3位地址输入端,能从8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管的显示采用软件译码动态显示,通过按键模块的操作可以选择8路循环显示,也可以选择某条单路显示。

2 . 2 数据采集电路

数据采集电路是系统的主要组成部分,ADC0 8 09具有8路模拟量输入通道IN0~IN7,通过3位地址输入端C、B、A(引脚23~25)进行选择。引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚输入的地址锁存于ADC0809内部锁存器中,经内部译码电路译码选中相应的模拟通道。引脚6为启动转换控制端START,当输入一个2 μ s宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。引脚7为A/D转换器,当开始转换时,EOC信号为低电平,经过一段时间,转换结束,转换结束信号EOC输出高电平,转换结果存放于ADC0809内部的输出数据寄存器中。引脚9脚为A/D转换数据输出允许控制端OE,当OE为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线D0~D7输出。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一份参考代码,实现AT89C51单片机数字电压表功能。首先,您需要使用ADC0804模数转换器将模拟电压转换为数字信号,然后将数字信号通过AT89C51单片机转换为电压值并在LCD1602液晶屏上显示。 下面是一份示例代码,仅供参考: ``` #include <reg51.h> //AT89C51专用头文件 #include <intrins.h> //需要用到 _nop_()函数 #define uchar unsigned char #define uint unsigned int sbit RS = P2^0; //液晶屏RS引脚接P2.0 sbit RW = P2^1; //液晶屏RW引脚接P2.1 sbit EN = P2^2; //液晶屏EN引脚接P2.2 sbit ADC_CS = P1^0; //ADC0804的片选引脚接P1.0 uchar code table[] = "Voltage:"; //定义字符数组,用于显示 void delay(uint i) //延时函数 { while(i--); } void LCD_init() //LCD1602液晶屏初始化 { RW = 0; delay(50); P0 = 0x38; //8位数据线,2行显示,5x7点阵 EN = 1; _nop_(); EN = 0; delay(5); P0 = 0x0c; //显示开,光标关,光标闪烁关 EN = 1; _nop_(); EN = 0; delay(5); P0 = 0x01; //清屏 EN = 1; _nop_(); EN = 0; delay(5); P0 = 0x06; //光标右移,文字不移动 EN = 1; _nop_(); EN = 0; delay(5); } void LCD_write_cmd(uchar cmd) //LCD1602液晶屏发送命令 { RW = 0; P0 = cmd; EN = 1; _nop_(); EN = 0; delay(5); } void LCD_write_data(uchar dat) //LCD1602液晶屏发送数据 { RW = 0; RS = 1; P0 = dat; EN = 1; _nop_(); EN = 0; delay(5); } uchar ADC0804_read() //ADC0804模数转换器读取电压值 { uchar voltage = 0; ADC_CS = 0; //使能ADC0804 delay(5); P1 = 0x80; //选择A/D转换通道0 delay(5); P1 = 0x00; //开始转换 delay(5); while(P1_7); //等待转换完成 voltage = P1; //读取转换结果 ADC_CS = 1; //禁止ADC0804 return voltage; } void main() { uchar voltage = 0; uchar voltage_high = 0; uchar voltage_low = 0; LCD_init(); //LCD1602液晶屏初始化 while(1) { voltage = ADC0804_read(); //读取电压值 voltage_high = voltage / 10; //高位 voltage_low = voltage % 10; //低位 LCD_write_cmd(0x80); //光标移到第一行第一列 LCD_write_data(table[0]); //显示字符串“Voltage:” LCD_write_data(table[1]); LCD_write_data(table[2]); LCD_write_data(table[3]); LCD_write_data(table[4]); LCD_write_data(table[5]); LCD_write_data(table[6]); LCD_write_data(table[7]); LCD_write_data(voltage_high + 0x30); //显示电压高位 LCD_write_data(voltage_low + 0x30); //显示电压低位 delay(100); //延时一段时间 } } ``` 以上代码仅供参考,您需要根据自己的实际情况进行修改和调试。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值