找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3921|回复: 4
收起左侧

单片机+PCF8591双通道数字电压表Proteus仿真程序 带注释

[复制链接]
ID:807238 发表于 2020-9-22 10:55 | 显示全部楼层 |阅读模式
用51单片机测电压值程序和仿真图都在里面
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei截图20200922105221.png

注释很详细的单片机源程序如下:
  1. #include "pcf8591.h"
  2. void pcf8591_init(uchar channel)
  3. {
  4.         bit flag;
  5. //        channel%=3;
  6.         I2C_start(); //启动总线,发送起始条件
  7.         write_byte(pcf8591_addr_w);//发送PCF8591器件地址,写
  8.         flag=check_ack();//读应答
  9.         write_byte(channel);//发送控制字节.0代表PCF8591控制寄存器,为0000 0000,单端输入00,A/D,选择通道0.
  10.         flag=check_ack();//读应答
  11.         I2C_stop(); //发送结束条件
  12. }
  13. uchar pcf8591_adconvert(uchar x)//转换x次,取平均值
  14. {
  15.         uchar j;
  16.         bit flag;
  17.         uint sum=0;
  18.         sum=0;
  19.         I2C_start();//重新启动总线,发送起始条件
  20.         write_byte(pcf8591_addr_r);//发送PCF8591器件地址,读,启动A/D转换
  21.         flag=check_ack();//读应答
  22.         for(j=0;j<(x-1);j++)//软件滤波,平均值滤波
  23.         {
  24.                 sum+=read_byte();//读转换结果
  25.                 send_ack(ACK);  //发送应答信号        
  26.                 delayms(10);
  27.         }
  28.         sum+=read_byte();//读转换结果
  29.         send_ack(NACK);  //读完最后一个字节后单片机发送非应答信号        
  30.         I2C_stop();//发送结束条件
  31.         return(sum/x);        
  32. }
复制代码
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "i2c.h"
  4. #include "pcf8591.h"
  5. #include "lcd1602.h"
  6. #define  uchar  unsigned  char
  7. #define  uint  unsigned  int
  8. void  delayms(uint  x);
  9. void main()
  10. {
  11.         uint volt;
  12.     uchar dispbuf[7]={'0','.','0','0','0','V','\0'};

  13.         LCD1602_Init();//液晶显示模块1602初始化
  14.         LCD1602_DisplayString(1,1,"Voltage:");
  15.         LCD1602_DisplayString(2,1,"Voltage:");
  16.         while(1)
  17.         {        
  18.                 pcf8591_init(0);//PCF8591初始化,单端输入,A/D,选择通道0        
  19.                 volt=pcf8591_adconvert(10)*19.608;//实际电压(mV)=转换结果*5000/255=转换
  20. //结果*19.608。即VS=VREF*5V/255
  21.                 dispbuf[0]=0x30+volt/1000;//整数位
  22.                 dispbuf[2]=0x30+(volt%1000)/100;//小数点后第1位
  23.                 dispbuf[3]=0x30+(volt%100)/10;//小数点后第2位
  24.                 dispbuf[4]=0x30+volt%10;//小数点后第3位
  25.         LCD1602_DisplayString(1,9,dispbuf);

  26.                 pcf8591_init(1);//PCF8591初始化,单端输入,A/D,选择通道0        
  27.                 volt=pcf8591_adconvert(10)*19.608;//实际电压(mV)=转换结果*5000/255=转换
  28. //结果*19.608。即VS=VREF*5V/255
  29.                 dispbuf[0]=0x30+volt/1000;//整数位
  30.                 dispbuf[2]=0x30+(volt%1000)/100;//小数点后第1位
  31.                 dispbuf[3]=0x30+(volt%100)/10;//小数点后第2位
  32.                 dispbuf[4]=0x30+volt%10;//小数点后第3位
  33.                 LCD1602_DisplayString(2,9,dispbuf);
  34.                 delayms(500);
  35.         }
  36. }
  37. void  delayms(uint  x)
  38. {
  39.         unsigned  char j;
  40.         while(x--)
  41.         for (j=0;j<122;j++); /*延时约8μs*125=1ms,应根据实验调整j的上限125*/
  42. }
复制代码

51hei截图20200922105445.png
所有资料51hei提供下载:
双通道数字电压表.zip (123.33 KB, 下载次数: 196)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:335380 发表于 2021-3-12 17:25 | 显示全部楼层
怎么我这里无法显示?
回复

使用道具 举报

ID:328014 发表于 2021-3-13 17:17 | 显示全部楼层
WORI 发表于 2021-3-12 17:25
怎么我这里无法显示?

用Proteus8.8可以打开,显示效果如下:
51hei.png
回复

使用道具 举报

ID:28992 发表于 2021-3-15 07:58 | 显示全部楼层
great job, thank you!
回复

使用道具 举报

ID:285526 发表于 2021-3-26 23:10 | 显示全部楼层
Great Job
你好
任何人都可以使用单个ic MS83F1602制作伏安表
显示顶部电压3位7段和底部Amphere 3位7段
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表