|
用51單片機(jī)測(cè)電壓值程序和仿真圖都在里面
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
注釋很詳細(xì)的單片機(jī)源程序如下:
- #include "pcf8591.h"
- void pcf8591_init(uchar channel)
- {
- bit flag;
- // channel%=3;
- I2C_start(); //啟動(dòng)總線,發(fā)送起始條件
- write_byte(pcf8591_addr_w);//發(fā)送PCF8591器件地址,寫
- flag=check_ack();//讀應(yīng)答
- write_byte(channel);//發(fā)送控制字節(jié).0代表PCF8591控制寄存器,為0000 0000,單端輸入00,A/D,選擇通道0.
- flag=check_ack();//讀應(yīng)答
- I2C_stop(); //發(fā)送結(jié)束條件
- }
- uchar pcf8591_adconvert(uchar x)//轉(zhuǎn)換x次,取平均值
- {
- uchar j;
- bit flag;
- uint sum=0;
- sum=0;
- I2C_start();//重新啟動(dòng)總線,發(fā)送起始條件
- write_byte(pcf8591_addr_r);//發(fā)送PCF8591器件地址,讀,啟動(dòng)A/D轉(zhuǎn)換
- flag=check_ack();//讀應(yīng)答
- for(j=0;j<(x-1);j++)//軟件濾波,平均值濾波
- {
- sum+=read_byte();//讀轉(zhuǎn)換結(jié)果
- send_ack(ACK); //發(fā)送應(yīng)答信號(hào)
- delayms(10);
- }
- sum+=read_byte();//讀轉(zhuǎn)換結(jié)果
- send_ack(NACK); //讀完最后一個(gè)字節(jié)后單片機(jī)發(fā)送非應(yīng)答信號(hào)
- I2C_stop();//發(fā)送結(jié)束條件
- return(sum/x);
- }
復(fù)制代碼- #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;//實(shí)際電壓(mV)=轉(zhuǎn)換結(jié)果*5000/255=轉(zhuǎn)換
- //結(jié)果*19.608。即VS=VREF*5V/255
- dispbuf[0]=0x30+volt/1000;//整數(shù)位
- dispbuf[2]=0x30+(volt%1000)/100;//小數(shù)點(diǎn)后第1位
- dispbuf[3]=0x30+(volt%100)/10;//小數(shù)點(diǎn)后第2位
- dispbuf[4]=0x30+volt%10;//小數(shù)點(diǎn)后第3位
- LCD1602_DisplayString(1,9,dispbuf);
- pcf8591_init(1);//PCF8591初始化,單端輸入,A/D,選擇通道0
- volt=pcf8591_adconvert(10)*19.608;//實(shí)際電壓(mV)=轉(zhuǎn)換結(jié)果*5000/255=轉(zhuǎn)換
- //結(jié)果*19.608。即VS=VREF*5V/255
- dispbuf[0]=0x30+volt/1000;//整數(shù)位
- dispbuf[2]=0x30+(volt%1000)/100;//小數(shù)點(diǎn)后第1位
- dispbuf[3]=0x30+(volt%100)/10;//小數(shù)點(diǎn)后第2位
- dispbuf[4]=0x30+volt%10;//小數(shù)點(diǎn)后第3位
- LCD1602_DisplayString(2,9,dispbuf);
- delayms(500);
- }
- }
- void delayms(uint x)
- {
- unsigned char j;
- while(x--)
- for (j=0;j<122;j++); /*延時(shí)約8μs*125=1ms,應(yīng)根據(jù)實(shí)驗(yàn)調(diào)整j的上限125*/
- }
復(fù)制代碼
所有資料51hei提供下載:
雙通道數(shù)字電壓表.zip
(123.33 KB, 下載次數(shù): 199)
2020-9-22 10:53 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|