分享一下做基于C51的AD數據采集用的PCF5819 有實驗文檔 還有仿真以及代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
將AD轉換后,轉成電壓量(保留2位小數),顯示于數碼管,并發送到PC機的串口調試助手上。 二、 儀器用具及材料 Keil、Proteus 8 Professional、串口助手、串口模擬器。 三、 實驗內容及原理 1. 電路分析 本次使用的數碼元器件有八位共陽數碼管,串口,PCF8591以及單片機STC15W4K32S4。 (具體電路圖見附件一) 2. 軟件編程 (1) 數碼管 因為實驗涉及小數所以本次顯示數碼的碼字有兩種,一種是不帶小數點的,一種是帶小數點的。不帶小數點的 “code unsigned char segcode[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};” 帶小數點的“ code unsigned char segcode1[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7F};” 數碼管還涉及到三位數字的顯示,雖然是一個整數和兩個小數,但本質上可以用一個函數先將這個數直接變成三位數,然后將第一位的數字加上“.”顯示的效果就是保留兩位小數的數字。具體如下
int fenli(float e) //分離函數 將AD轉換以后的小數變成三位整數 { int x,y,z; x=e*1000; z=e*100; y=x%10; if(y>=5) { z=z+1; } return z; } 數碼管顯示小數函數如下: void shumaguan(int x) //數碼管顯示函數顯示被分離的數字 { int i,j,ge,shi,bai; bai=x/100%100%10; shi=x/10%100%10; ge=x%1000%10; P0=segcode[10]; //清除所有位數 P2=0xe0; P2=0; P0=0xFF; P2=0xc0; P2=0; P0=segcode1[bai]; // 顯示百位 P2=0xe0; P2=0; P0=0x01; P2=0xc0; P2=0; for(i=0;i<1;i++) for(j=0;j<1;j++); P0=segcode[shi]; //顯示十位 P2=0xe0; P2=0; P0=0x02; P2=0xc0; P2=0; P0=segcode[ge]; //顯示個位 P2=0xe0; P2=0; P0=0x04; P2=0xc0; P2=0; } (2) I2C的軟件編程 主要有以下幾個步驟1.啟動信號;2停止信號;3應答信號;4等待應答信號;5發送字節;6接收字節; (3) 串口的編程 本次串口的輸出需要用到文本格式所以需要在頭文件上加上stdio.h,另外還需要改寫char putchar(char c)底層函數這樣就可以用printf()函數通過串口來發送文本,代碼如下。 char putchar(char c) { ES=0; //關閉串口中斷 SBUF=c; while(!TI); //等待發送完成 TI=0; //清除發送完成標志 ES=1; //開啟串口中斷 return c; } (4) PCF8591的串口通信代碼以及采集AD的IO口選擇。 本次實驗主要用到的是AIN0口并不允許模擬電壓輸出模擬輸入方式是4通道輸入,另外不自動增加通道號因此控制字節為0x00;具體代碼如下: unsigned char PCF8591_Adc(void) { unsigned char temp; IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x00); IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91); IIC_WaitAck(); temp=IIC_RecByte(); IIC_SendAck(1); IIC_Stop(); return temp; } (5) 主函數的編程 流程圖如右圖。
代碼如下 int main() { int a,b; float c=255,e; int x,n=1;
while(1) { while(n) { PCF8591_Adc(); a=PCF8591_Adc(); e=a/c*5; x=fenli(e); UartInit(); printf("%.2fV\n",e); shumaguan(x);
n=0; } PCF8591_Adc(); b=PCF8591_Adc(); if(b!=a) { n=1; } } } 總的代碼見附件二。 四、 實驗過程與數據記錄 1. 將原理圖中的滑動變阻器調成100%啟動proteus模擬軟件,串口輸出5.00V如下圖

數碼管顯示如下圖 
將滑動變阻器下調到99%串口輸出如下圖 
數碼管顯示如下 
將滑動變阻器改成50%串口顯示如下

數碼管顯示如下圖
9、總結 這次實驗涉及的內容較多有數碼管的顯示串口以及I2C的通信等,算是個不大不小的項目,這次實驗也是我鞏固了之前所學C語言的知識,也對串口通信以及I2C的通信有了一個新的了解和認知,希望在今后的學習中能挑戰更多更有趣的實驗。
下載:
仿真和文檔.7z
(191.53 KB, 下載次數: 10)
2023-4-27 17:38 上傳
點擊文件名下載附件
|