简易电压表(51)教程

开始制作一个简易电压表:使用到的元器件和模块。

主控芯片采用了 STC89C52RC,时钟电路:12MHz 晶振,30pf 瓷片电容 2 个,显示电路:OLED 7针,复位电路:10uf 电解 电容,100K 电阻。指示灯电路:LED0805,1K电阻。采集电路:ADS1115,1K电阻,3K电阻。以及其余原件若干。

思路:

51内部是没有集成ADC的,如果需要测量外部模拟信号,那么是要用到ADC的,为了保证精度,这边用了ADS1115(16位的ADC)。如果直接用ADS1115进行电压读取,那么读的外部电压最大只有ADS1115的内部基准电压:4.096V。

为了解决这个问题:我才用了简单的电阻分压电路,用来讲测量的电压进行分压。之后乘以两个电阻之间的分压系数。

电路仿真部分:

使用软件:proteus 8.6

RP1使用10K排阻做上拉,因为51P0口的驱动能力不够,需要上拉驱动。

P1.1和P1.2作为ADC的IIC信号口。之后通过R1和R2进行电压的分压部分。

P2.0、2.1、2.2作为液晶的三个控制口。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_20,color_FFFFFF,t_70,g_se,x_16

分析:仿真中通过 LCD1602显示对应的采样电压转换后的值,ADC采用PCF8591作为ADC的采样芯片,因为PCF8591和ADS1115一样都是使用IIC作为协议的一种ADC,因此可以使用PCF8591模拟电压的数值,但是PCF8591是8位(精度有点低,不过凑活也能用,看要求)的ADC不符合,但是可以用来作为电路的仿真,验证电路的实现合理性。

程序设计部分:

代码部分分为:主程序,OLED的驱动部分,以及ADS1115读取数据部分。其中主程序负责进行OLED上的显示部分,数据的计算,滤波和误差处理等,ADS1115负责数据的采样和转换。OLED的显示部分,负责对于OLED进行读写指令来驱动和初始化OLED的显示,在初始化之后,通过对应的函数来进行数字和字母的显示

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_4,color_FFFFFF,t_70,g_se,x_16                            watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_7,color_FFFFFF,t_70,g_se,x_16

 

  仿真验证结果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_12,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_16,color_FFFFFF,t_70,g_se,x_16

 

电路原理图绘制:

使用软件立创EDA(支持国产,立创YYDS)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_20,color_FFFFFF,t_70,g_se,x_16

 PCB布局:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_10,color_FFFFFF,t_70,g_se,x_16                  watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_16,color_FFFFFF,t_70,g_se,x_16

 

实物效果验证:

个人信息部分都打了码。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_9,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_10,color_FFFFFF,t_70,g_se,x_16

测量数据:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Ziy56m65rSe55qE5LuT6byg,size_19,color_FFFFFF,t_70,g_se,x_16

注意事项: 

     从最初的使用当ADS1115采样电压只能达到4.096V时,之后想到通过分压电阻分压的方式来进行数据电压测量的上限,在之后通过进行测量的时候发现了测量电压始终不准,最后发现是因为ADS1115并不是简单的16位的ADC,ADS1115的转换数据是15位,有一位是符号位,因此要除以不是2的16次方,而是2的15次方,其次在进行ADS1115进行测量时发现他的基准电压是4.096V,而且具有4个模式基准电压都是4.096V。

具体程序如下链接:

简易的电压表(ADC1115和OLDE显示).zip-硬件开发文档类资源-CSDN下载

 

 

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用MCS-51单片机来制作一个简易电压表。下面是一个基本的示例代码,用于读取ADC(模拟到数字转换器)的值,并将其转换为电压值: ```c #include <reg51.h> sbit ADC_CS = P1^0; // ADC片选引脚 sbit ADC_CLK = P1^1; // ADC时钟引脚 sbit ADC_DOUT = P1^2; // ADC数据输出引脚 void delay(unsigned int count) { unsigned int i, j; for (i = 0; i < count; i++) { for (j = 0; j < 120; j++) {} } } unsigned int readADC() { unsigned int adcValue = 0; unsigned char i; ADC_CS = 1; // 启动ADC ADC_CLK = 0; // 设置ADC时钟为低电平 delay(10); // 等待一段时间 ADC_CS = 0; // 拉低片选引脚以读取数据 for (i = 0; i < 12; i++) { ADC_CLK = 1; // 设置ADC时钟为高电平 adcValue <<= 1; adcValue |= ADC_DOUT; // 读取数据引脚的值 ADC_CLK = 0; // 设置ADC时钟为低电平 } return adcValue; } float convertToVoltage(unsigned int adcValue) { float voltage = adcValue * (5.0 / 4096.0); // 假设参考电压为5V,ADC分辨率为12位 return voltage; } void main() { unsigned int adcValue; float voltage; while (1) { adcValue = readADC(); // 读取ADC值 voltage = convertToVoltage(adcValue); // 转换为电压值 // 在此处处理电压值,如显示在LCD、发送到串口等 } } ``` 请注意,此代码仅为示例,您可能需要根据您所使用的具体硬件进行适当的调整和修改。此外,您还需要将ADC芯片连接到单片机的正确引脚上,并根据自己的需要进行电压值的处理和显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

防空洞的仓鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值