标题: 单片机+PCF8591双通道数字电压表Proteus仿真程序 带注释 [打印本页]

作者: 835841281    时间: 2020-9-22 10:55
标题: 单片机+PCF8591双通道数字电压表Proteus仿真程序 带注释
用51单片机测电压值程序和仿真图都在里面
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


注释很详细的单片机源程序如下:
  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提供下载:
双通道数字电压表.zip (123.33 KB, 下载次数: 199)


作者: WORI    时间: 2021-3-12 17:25
怎么我这里无法显示?
作者: 51hei团团    时间: 2021-3-13 17:17
WORI 发表于 2021-3-12 17:25
怎么我这里无法显示?

用Proteus8.8可以打开,显示效果如下:

51hei.png (30.5 KB, 下载次数: 89)

51hei.png

作者: usaboy    时间: 2021-3-15 07:58
great job, thank you!
作者: umer94    时间: 2021-3-26 23:10
Great Job
你好
任何人都可以使用单个ic MS83F1602制作伏安表
显示顶部电压3位7段和底部Amphere 3位7段




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1