標(biāo)題: 單片機(jī)+PCF8591雙通道數(shù)字電壓表Proteus仿真程序 帶注釋 [打印本頁(yè)]

作者: 835841281    時(shí)間: 2020-9-22 10:55
標(biāo)題: 單片機(jī)+PCF8591雙通道數(shù)字電壓表Proteus仿真程序 帶注釋
用51單片機(jī)測(cè)電壓值程序和仿真圖都在里面
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


注釋很詳細(xì)的單片機(jī)源程序如下:
  1. #include "pcf8591.h"
  2. void pcf8591_init(uchar channel)
  3. {
  4.         bit flag;
  5. //        channel%=3;
  6.         I2C_start(); //啟動(dòng)總線,發(fā)送起始條件
  7.         write_byte(pcf8591_addr_w);//發(fā)送PCF8591器件地址,寫
  8.         flag=check_ack();//讀應(yīng)答
  9.         write_byte(channel);//發(fā)送控制字節(jié).0代表PCF8591控制寄存器,為0000 0000,單端輸入00,A/D,選擇通道0.
  10.         flag=check_ack();//讀應(yīng)答
  11.         I2C_stop(); //發(fā)送結(jié)束條件
  12. }
  13. uchar pcf8591_adconvert(uchar x)//轉(zhuǎn)換x次,取平均值
  14. {
  15.         uchar j;
  16.         bit flag;
  17.         uint sum=0;
  18.         sum=0;
  19.         I2C_start();//重新啟動(dòng)總線,發(fā)送起始條件
  20.         write_byte(pcf8591_addr_r);//發(fā)送PCF8591器件地址,讀,啟動(dòng)A/D轉(zhuǎn)換
  21.         flag=check_ack();//讀應(yīng)答
  22.         for(j=0;j<(x-1);j++)//軟件濾波,平均值濾波
  23.         {
  24.                 sum+=read_byte();//讀轉(zhuǎn)換結(jié)果
  25.                 send_ack(ACK);  //發(fā)送應(yīng)答信號(hào)        
  26.                 delayms(10);
  27.         }
  28.         sum+=read_byte();//讀轉(zhuǎn)換結(jié)果
  29.         send_ack(NACK);  //讀完最后一個(gè)字節(jié)后單片機(jī)發(fā)送非應(yīng)答信號(hào)        
  30.         I2C_stop();//發(fā)送結(jié)束條件
  31.         return(sum/x);        
  32. }
復(fù)制代碼
  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;//實(shí)際電壓(mV)=轉(zhuǎn)換結(jié)果*5000/255=轉(zhuǎn)換
  20. //結(jié)果*19.608。即VS=VREF*5V/255
  21.                 dispbuf[0]=0x30+volt/1000;//整數(shù)位
  22.                 dispbuf[2]=0x30+(volt%1000)/100;//小數(shù)點(diǎn)后第1位
  23.                 dispbuf[3]=0x30+(volt%100)/10;//小數(shù)點(diǎn)后第2位
  24.                 dispbuf[4]=0x30+volt%10;//小數(shù)點(diǎn)后第3位
  25.         LCD1602_DisplayString(1,9,dispbuf);

  26.                 pcf8591_init(1);//PCF8591初始化,單端輸入,A/D,選擇通道0        
  27.                 volt=pcf8591_adconvert(10)*19.608;//實(shí)際電壓(mV)=轉(zhuǎn)換結(jié)果*5000/255=轉(zhuǎn)換
  28. //結(jié)果*19.608。即VS=VREF*5V/255
  29.                 dispbuf[0]=0x30+volt/1000;//整數(shù)位
  30.                 dispbuf[2]=0x30+(volt%1000)/100;//小數(shù)點(diǎn)后第1位
  31.                 dispbuf[3]=0x30+(volt%100)/10;//小數(shù)點(diǎn)后第2位
  32.                 dispbuf[4]=0x30+volt%10;//小數(shù)點(diǎn)后第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++); /*延時(shí)約8μs*125=1ms,應(yīng)根據(jù)實(shí)驗(yàn)調(diào)整j的上限125*/
  42. }
復(fù)制代碼


所有資料51hei提供下載:
雙通道數(shù)字電壓表.zip (123.33 KB, 下載次數(shù): 199)


作者: WORI    時(shí)間: 2021-3-12 17:25
怎么我這里無(wú)法顯示?
作者: 51hei團(tuán)團(tuán)    時(shí)間: 2021-3-13 17:17
WORI 發(fā)表于 2021-3-12 17:25
怎么我這里無(wú)法顯示?

用Proteus8.8可以打開,顯示效果如下:

51hei.png (30.5 KB, 下載次數(shù): 89)

51hei.png

作者: usaboy    時(shí)間: 2021-3-15 07:58
great job, thank you!
作者: umer94    時(shí)間: 2021-3-26 23:10
Great Job
你好
任何人都可以使用單個(gè)ic MS83F1602制作伏安表
顯示頂部電壓3位7段和底部Amphere 3位7段




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1