用51單片機測電壓值程序和仿真圖都在里面
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖20200922105221.png (152.34 KB, 下載次數: 112)
下載附件
2020-9-22 10:52 上傳
注釋很詳細的單片機源程序如下:
- #include "pcf8591.h"
- void pcf8591_init(uchar channel)
- {
- bit flag;
- // channel%=3;
- I2C_start(); //啟動總線,發送起始條件
- write_byte(pcf8591_addr_w);//發送PCF8591器件地址,寫
- flag=check_ack();//讀應答
- write_byte(channel);//發送控制字節.0代表PCF8591控制寄存器,為0000 0000,單端輸入00,A/D,選擇通道0.
- flag=check_ack();//讀應答
- I2C_stop(); //發送結束條件
- }
- uchar pcf8591_adconvert(uchar x)//轉換x次,取平均值
- {
- uchar j;
- bit flag;
- uint sum=0;
- sum=0;
- I2C_start();//重新啟動總線,發送起始條件
- write_byte(pcf8591_addr_r);//發送PCF8591器件地址,讀,啟動A/D轉換
- flag=check_ack();//讀應答
- for(j=0;j<(x-1);j++)//軟件濾波,平均值濾波
- {
- sum+=read_byte();//讀轉換結果
- send_ack(ACK); //發送應答信號
- delayms(10);
- }
- sum+=read_byte();//讀轉換結果
- send_ack(NACK); //讀完最后一個字節后單片機發送非應答信號
- I2C_stop();//發送結束條件
- return(sum/x);
- }
復制代碼- #include <reg52.h>
- #include <intrins.h>
- #include "i2c.h"
- #include "pcf8591.h"
- #include "lcd1602.h"
- #define uchar unsigned char
- #define uint unsigned int
- void delayms(uint x);
- void main()
- {
- uint volt;
- uchar dispbuf[7]={'0','.','0','0','0','V','\0'};
- LCD1602_Init();//液晶顯示模塊1602初始化
- LCD1602_DisplayString(1,1,"Voltage:");
- LCD1602_DisplayString(2,1,"Voltage:");
- while(1)
- {
- pcf8591_init(0);//PCF8591初始化,單端輸入,A/D,選擇通道0
- volt=pcf8591_adconvert(10)*19.608;//實際電壓(mV)=轉換結果*5000/255=轉換
- //結果*19.608。即VS=VREF*5V/255
- dispbuf[0]=0x30+volt/1000;//整數位
- dispbuf[2]=0x30+(volt%1000)/100;//小數點后第1位
- dispbuf[3]=0x30+(volt%100)/10;//小數點后第2位
- dispbuf[4]=0x30+volt%10;//小數點后第3位
- LCD1602_DisplayString(1,9,dispbuf);
- pcf8591_init(1);//PCF8591初始化,單端輸入,A/D,選擇通道0
- volt=pcf8591_adconvert(10)*19.608;//實際電壓(mV)=轉換結果*5000/255=轉換
- //結果*19.608。即VS=VREF*5V/255
- dispbuf[0]=0x30+volt/1000;//整數位
- dispbuf[2]=0x30+(volt%1000)/100;//小數點后第1位
- dispbuf[3]=0x30+(volt%100)/10;//小數點后第2位
- dispbuf[4]=0x30+volt%10;//小數點后第3位
- LCD1602_DisplayString(2,9,dispbuf);
- delayms(500);
- }
- }
- void delayms(uint x)
- {
- unsigned char j;
- while(x--)
- for (j=0;j<122;j++); /*延時約8μs*125=1ms,應根據實驗調整j的上限125*/
- }
復制代碼
51hei截圖20200922105445.png (28.82 KB, 下載次數: 81)
下載附件
2020-9-22 10:55 上傳
所有資料51hei提供下載:
雙通道數字電壓表.zip
(123.33 KB, 下載次數: 199)
2020-9-22 10:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|