標(biāo)題: C51單片機(jī)的AD PCF5819采集程序 帶Proteus仿真和代碼 [打印本頁(yè)]
作者: qw2597758qw 時(shí)間: 2023-4-27 09:02
標(biāo)題: C51單片機(jī)的AD PCF5819采集程序 帶Proteus仿真和代碼
分享一下做基于C51的AD數(shù)據(jù)采集用的PCF5819 有實(shí)驗(yàn)文檔 還有仿真以及代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (100.57 KB, 下載次數(shù): 50)
下載附件
2023-4-27 17:48 上傳
將AD轉(zhuǎn)換后,轉(zhuǎn)成電壓量(保留2位小數(shù)),顯示于數(shù)碼管,并發(fā)送到PC機(jī)的串口調(diào)試助手上。
二、 儀器用具及材料
Keil、Proteus 8 Professional、串口助手、串口模擬器。
三、 實(shí)驗(yàn)內(nèi)容及原理
1. 電路分析
本次使用的數(shù)碼元器件有八位共陽(yáng)數(shù)碼管,串口,PCF8591以及單片機(jī)STC15W4K32S4。
(具體電路圖見附件一)
2. 軟件編程
(1) 數(shù)碼管
因?yàn)閷?shí)驗(yàn)涉及小數(shù)所以本次顯示數(shù)碼的碼字有兩種,一種是不帶小數(shù)點(diǎn)的,一種是帶小數(shù)點(diǎn)的。不帶小數(shù)點(diǎn)的 “code unsigned char segcode[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};”
帶小數(shù)點(diǎn)的“ code unsigned char segcode1[] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7F};”
數(shù)碼管還涉及到三位數(shù)字的顯示,雖然是一個(gè)整數(shù)和兩個(gè)小數(shù),但本質(zhì)上可以用一個(gè)函數(shù)先將這個(gè)數(shù)直接變成三位數(shù),然后將第一位的數(shù)字加上“.”顯示的效果就是保留兩位小數(shù)的數(shù)字。具體如下
int fenli(float e) //分離函數(shù) 將AD轉(zhuǎn)換以后的小數(shù)變成三位整數(shù)
{
int x,y,z;
x=e*1000;
z=e*100;
y=x%10;
if(y>=5)
{
z=z+1;
}
return z;
}
數(shù)碼管顯示小數(shù)函數(shù)如下:
void shumaguan(int x) //數(shù)碼管顯示函數(shù)顯示被分離的數(shù)字
{
int i,j,ge,shi,bai;
bai=x/100%100%10;
shi=x/10%100%10;
ge=x%1000%10;
P0=segcode[10]; //清除所有位數(shù)
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]; //顯示個(gè)位
P2=0xe0;
P2=0;
P0=0x04;
P2=0xc0;
P2=0;
}
(2) I2C的軟件編程
主要有以下幾個(gè)步驟1.啟動(dòng)信號(hào);2停止信號(hào);3應(yīng)答信號(hào);4等待應(yīng)答信號(hào);5發(fā)送字節(jié);6接收字節(jié);
(3) 串口的編程
本次串口的輸出需要用到文本格式所以需要在頭文件上加上stdio.h,另外還需要改寫char putchar(char c)底層函數(shù)這樣就可以用printf()函數(shù)通過(guò)串口來(lái)發(fā)送文本,代碼如下。
char putchar(char c)
{ ES=0; //關(guān)閉串口中斷
SBUF=c;
while(!TI); //等待發(fā)送完成
TI=0; //清除發(fā)送完成標(biāo)志
ES=1; //開啟串口中斷
return c;
}
(4) PCF8591的串口通信代碼以及采集AD的IO口選擇。
本次實(shí)驗(yàn)主要用到的是AIN0口并不允許模擬電壓輸出模擬輸入方式是4通道輸入,另外不自動(dòng)增加通道號(hào)因此控制字節(jié)為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) 主函數(shù)的編程
流程圖如右圖。
代碼如下
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;
}
}
}
總的代碼見附件二。
四、 實(shí)驗(yàn)過(guò)程與數(shù)據(jù)記錄
1. 將原理圖中的滑動(dòng)變阻器調(diào)成100%啟動(dòng)proteus模擬軟件,串口輸出5.00V如下圖

數(shù)碼管顯示如下圖

將滑動(dòng)變阻器下調(diào)到99%串口輸出如下圖

數(shù)碼管顯示如下

將滑動(dòng)變阻器改成50%串口顯示如下

數(shù)碼管顯示如下圖
9、總結(jié)
這次實(shí)驗(yàn)涉及的內(nèi)容較多有數(shù)碼管的顯示串口以及I2C的通信等,算是個(gè)不大不小的項(xiàng)目,這次實(shí)驗(yàn)也是我鞏固了之前所學(xué)C語(yǔ)言的知識(shí),也對(duì)串口通信以及I2C的通信有了一個(gè)新的了解和認(rèn)知,希望在今后的學(xué)習(xí)中能挑戰(zhàn)更多更有趣的實(shí)驗(yàn)。
51hei.png (6.87 KB, 下載次數(shù): 47)
下載附件
2023-4-27 17:38 上傳
下載:
仿真和文檔.7z
(191.53 KB, 下載次數(shù): 10)
2023-4-27 17:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |