一、設(shè)計(jì)題目:
基于單片機(jī)的數(shù)字電流表設(shè)計(jì)
二、設(shè)計(jì)要求:
- 數(shù)字電流表在平常工作環(huán)境中能良好工作
- 能測(cè)0——1000mA電流,至少能達(dá)1%的精度
- 要求掌握I/V信號(hào)轉(zhuǎn)換,A/D轉(zhuǎn)換器的使用和數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)
- 電流表能數(shù)字顯示,且由單片機(jī)處理采集數(shù)據(jù)并驅(qū)動(dòng)LED顯示
。
目 錄
一、功能要求…………………………………………………………………5
二、原理及方案論證…..………………………………………………………5
三、系統(tǒng)硬件電路的設(shè)計(jì)………………………………………………………9
四、系統(tǒng)程序的設(shè)計(jì)…………………………………………………………10
五、調(diào)試及設(shè)計(jì)結(jié)果………………………………………………………….19
參考文獻(xiàn) …………………………………………………………………...20
一、功能要求
1、數(shù)字電流表在平常工作環(huán)境中能良好工作
2、能測(cè)0——1000mA電流,至少能達(dá)1%的精度
3、要求掌握I/V信號(hào)轉(zhuǎn)換,A/D轉(zhuǎn)換器的使用和數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)
4、電流表能數(shù)字顯示,且由單片機(jī)處理采集數(shù)據(jù)并驅(qū)動(dòng)LED顯示
二、原理及方案論證
1、數(shù)字電流表工作原理
1.1采樣電阻網(wǎng)絡(luò)
原理如下圖所示,輸入被測(cè)電流通過(guò)量程轉(zhuǎn)換開關(guān)S1——S4,流經(jīng)采樣電阻R1——R4,由歐姆定律可知:U=I*R,因而轉(zhuǎn)換輸出電壓為0V——0.1V的電壓,輸出電壓可再經(jīng)后續(xù)放大電路放大處理。
1.2高共模抑制比放大電路
如下圖,由雙運(yùn)放組成的同相輸入高共模抑制比放大電路,其閉環(huán)輸出可表示為:
為使共模輸入為0,可令R1/R2=R4/R3,此時(shí)電路的差動(dòng)閉環(huán)增益為Kd=1+R1/R2, U0=Kd(U1-U2); 下圖即Kd=11,U0=11(U1-U2);
1.3通用A/D轉(zhuǎn)換器
ADC0832 是美國(guó)國(guó)家半導(dǎo)體公司生產(chǎn)的一種 8 位分辨率、雙通道 A/D 轉(zhuǎn)換芯片。由于它體積小,兼容性強(qiáng),性價(jià)比高而深受單片機(jī)愛好者及企業(yè)歡迎,其目前已經(jīng)有很高的普及率。
ADC0832 具有以下特點(diǎn):
◆ 8 位分辨率;
◆ 雙通道 A/D轉(zhuǎn)換;
◆ 輸入輸出電平與 TTL/CMOS 相兼容;
◆ 5V 電源供電時(shí)輸入電壓在 0~5V 之間;
◆ 工作頻率為 250KHZ,轉(zhuǎn)換時(shí)間為 32μS;
◆ 一般功耗僅為 15mW;
◆ 8P、14P—DIP(雙列直插)、PICC 多種封裝;
◆ 商用級(jí)芯片溫寬為0°C to +70°C,工業(yè)級(jí)芯片溫寬為- 40°C to +85°C;
芯片接口說(shuō)明
CS_ 片選使能,低電平芯片使能。
CH0 模擬輸入通道 0,或作為 IN+/-使用。
CH1 模擬輸入通道 1,或作為 IN+/-使用。
GND 芯片參考 0 電位(地)。
DI 數(shù)據(jù)信號(hào)輸入,選擇通道控制。
DO 數(shù)據(jù)信號(hào)輸出,轉(zhuǎn)換數(shù)據(jù)輸出。
CLK 芯片時(shí)鐘輸入。
Vcc/REF 電源輸入及參考電壓輸入(復(fù)用)。
1.4 AT89C51單片機(jī)
AT89C51是美國(guó)ATMEL 公司生產(chǎn)的低電壓,高性能CMOS 8 位單片機(jī),片內(nèi)含8k bytes 的可反復(fù)擦寫的只讀程序存 儲(chǔ)器(PEROM)和256 bytes 的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL 公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn), 與標(biāo)準(zhǔn)MCS-51 指令系統(tǒng)及8052 產(chǎn)品引腳兼容,片內(nèi)置通用8 位 央處理器(CPU)和Flash 存儲(chǔ)單元,功能強(qiáng)大AT89C52 單片機(jī)適合于許多較為復(fù)雜控制應(yīng)用場(chǎng)合。
主要性能參數(shù)
·與MCS-51 產(chǎn)品指令和引腳完全兼容
·8k 字節(jié)可 擦寫Flash 閃速存儲(chǔ)器
·1000 次擦寫周期
·全靜態(tài)操作:0Hz-24MHz
·三級(jí)加密程序存儲(chǔ)器
·256 ×8 字節(jié)內(nèi)部RAM
·32 個(gè)可編程I /O 口線
·3 個(gè)16 位定時(shí)/計(jì)數(shù)器
·8 個(gè) 斷源
·可編程串行UART 通道
·低功耗空閑和掉電模式
功能特性概述
AT89C51提供以下標(biāo)準(zhǔn)功能:8k 字節(jié)Flash 閃速存儲(chǔ)器,256 字節(jié)內(nèi)部RAM,32 個(gè)I /O 口線,3 個(gè)16位定時(shí)/計(jì)數(shù)器,一個(gè)6 向量?jī)杉?jí) 斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C52 可降至0Hz 的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式。空閑方式停止CPU 的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM 中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。
2、方案論證
本設(shè)計(jì)采用精密采樣電阻(9歐、0.9歐、0.09歐、0.01歐),電阻精度可達(dá)0.1%可忽略;八位A/D精度為5/256(V);因而除去放大電路增益誤差及線性誤差,電流表精度約為(5/256)/11,約為1.7mA;對(duì)于1000mA的總量程精度可達(dá)0.1%,因而方案可達(dá)設(shè)計(jì)要求。

本設(shè)計(jì)中用到AT89C52單片機(jī)、八位ADC AD0832、發(fā)光二極管、六位八段顯示數(shù)碼管LED,通用運(yùn)放 UA741 、PNP管及必要的電阻、電容元件等。系統(tǒng)原理方框圖電路仿真簡(jiǎn)圖如上圖。

系統(tǒng)方框圖
四、系統(tǒng)程序設(shè)計(jì)

程序流程圖如下
:系統(tǒng)程序流程圖
單片機(jī)源程序如下:
- #include<reg52.h>//包含相應(yīng)的頭文件
- #include<intrins.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar axs[6],azs[6],ac[10],dc[6];
- void ITOAZ(int num,uchar *p);
- void ITOAX(int num,uchar *p);
- float U,U1;
- sbit CS=P3^4;//定義數(shù)模轉(zhuǎn)換器硬件對(duì)應(yīng)引腳
- sbit CLK=P3^5;
- sbit DO=P3^6;
- sbit DI=P3^7;
- /******************讀寫AD0832函數(shù)****************/
- /************************************************/
- unsigned char ReadADC(unsigned char channel)
- {
- unsigned char j;
- unsigned char Temp=0;
- DI=1;
- _nop_();
- _nop_();
- CS=0;//拉低CS端
- _nop_();
- _nop_();
- CLK=1;//拉高CLK端
- _nop_();
- _nop_();
- CLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- CLK=1;//拉高CLK端
- DI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- CLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- CLK=1;//拉高CLK端
- DI=channel&0x1;
- _nop_();
- _nop_();
- CLK=0;//拉低CLK端,形成下降沿3
- DI=1;//控制命令結(jié)束
- _nop_();
- _nop_();
- for(j=0;j<8;j++) //處理讀入8位數(shù)據(jù)
- {
- CLK=0;
- _nop_();
- Temp=(Temp<<1)|DO;
- _nop_();
- CLK=1;
- }
- CS=1;
- CLK=0;
- DI=1;
- return(Temp); //返回轉(zhuǎn)換值
- }
- /************************************************/
- /************************************************/
- /******************顯示轉(zhuǎn)換函數(shù)******************/
- /************************************************/
- //延時(shí)函數(shù)
- void delay(uint n)
- {
- uint a;
- uchar i;
- for(a=n;a>0;a--)
- for(i=0;i<2;i++);
- }
- //將浮點(diǎn)數(shù)轉(zhuǎn)成函數(shù)
- void ITOC(float f,uchar *c)
- {
- float zs,xs;
- int bxs,bzs,i,k=0;
- xs=modf(f,&zs); //分離整數(shù)部分與小數(shù)部分函數(shù)
- if(P3==0XFE)
- bxs=(int)((xs*100)+0.5);
- else
- bxs=(int)((xs*100)+0.5); //小數(shù)點(diǎn)后兩位有效數(shù)字
- ITOAX(bxs,axs); //把小數(shù)部分轉(zhuǎn)換成字符串存入axs數(shù)組
- bzs=(int)zs; //把整數(shù)部分轉(zhuǎn)成整型
- ITOAZ(bzs,azs); //把整數(shù)部分轉(zhuǎn)換成字符串存入azs數(shù)組
- for (i=0;axs[i]!='s';i++) //把最終結(jié)果存入c數(shù)組
- c[i]=axs[i];
- c[i]='.';
- for(k=0,i=i+1;azs[k]!='s';k++,i++)
- c[i]=azs[k];
- if(U<0) c[i]='-';
- else c[i]=0xff;
- c[i+1]='s';
- }
- //將整型數(shù)轉(zhuǎn)換成對(duì)應(yīng)的
- void ITOAZ(int num,uchar *p)
- {
- uchar w,i=0;
- do
- {
- w=num%10; //將整型數(shù)各位分離,并轉(zhuǎn)換成對(duì)應(yīng)的字符存入a中
- p[i]=w;
- num=num/10;
- i++;
- }while(num);
- p[i]='s';
- }
- //將小數(shù)數(shù)部分轉(zhuǎn)換成對(duì)應(yīng)的
- void ITOAX(int num,uchar *p)
- {
- uchar w,i=0;
- do
- {
- w=num%10; //將整型數(shù)各位分離,并轉(zhuǎn)換成對(duì)應(yīng)的字符存入a中
- p[i]=w;
- num=num/10;
- i++;
- }while(num);
- while(i<2)
- {p[i]=0;i++;}
- p[i]='s';
- w=p[i];
- }
- //顯示譯碼函數(shù)
- void decode(uchar *n,uchar *dn)
- {uchar i;
- for(i=0; n[i]!='s';i++)
- {switch( n[i])
- {case 0: dn[i]=0x3F;break;
- case 1: dn[i]=0x06;break;
- case 2: dn[i]=0x5B;break;
- case 9: dn[i]=0x6F;break;
- case 3: dn[i]=0x4F;break;
- case 4: dn[i]=0x66;break;
- case 5: dn[i]=0x6D;break;
- case 6: dn[i]=0x7D;break;
- case 7: dn[i]=0x07;break;
- case 8: dn[i]=0x7F;break;
- case 46: dn[i]=0x80;break;
- case'-':dn[i]=0x40;break;
- default:dn[i]=0x00;break;
- }
- }
- dn[i]='s';
- }
- /************************************************/
- /************************************************/
- /********************主換函數(shù)********************/
- /************************************************/
- void main(void)
- {
- uchar i,j,P2_;
- float A;
- while(1)
- {
- U=ReadADC(0)/256.0;
- switch(P1)
- {case 0xfe:A=U*10*1.025;break;
- case 0xfd:A=U*100/1.09;break;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
- 調(diào)試及設(shè)計(jì)結(jié)果
系統(tǒng)仿真能正常運(yùn)行,達(dá)設(shè)計(jì)所有指標(biāo),仿真部分電路如下:
PROTUSE系統(tǒng)仿真效果圖
2、實(shí)際硬件制作結(jié)果
根據(jù)電路圖自制電路,測(cè)試結(jié)果:能正常測(cè)量10——1000mA電流,達(dá)大部分設(shè)計(jì)要求。
參考文獻(xiàn):
[1] 單片機(jī)原理與應(yīng)用技術(shù),清華大學(xué)出版社。
[2] 電子技術(shù)基礎(chǔ)(模擬部分、數(shù)字部分). 北京:高等教育出版社,2006.01
[3] 大學(xué)生電子設(shè)計(jì)與應(yīng)用.北京:中國(guó)電力出版社,2007.03