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

本設計中用到AT89C52單片機、八位ADC AD0832、發光二極管、六位八段顯示數碼管LED,通用運放 UA741 、PNP管及必要的電阻、電容元件等。系統原理方框圖電路仿真簡圖如上圖。

系統方框圖
四、系統程序設計

程序流程圖如下
:系統程序流程圖
單片機源程序如下:
- #include<reg52.h>//包含相應的頭文件
- #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;//定義數模轉換器硬件對應引腳
- sbit CLK=P3^5;
- sbit DO=P3^6;
- sbit DI=P3^7;
- /******************讀寫AD0832函數****************/
- /************************************************/
- 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;//控制命令結束
- _nop_();
- _nop_();
- for(j=0;j<8;j++) //處理讀入8位數據
- {
- CLK=0;
- _nop_();
- Temp=(Temp<<1)|DO;
- _nop_();
- CLK=1;
- }
- CS=1;
- CLK=0;
- DI=1;
- return(Temp); //返回轉換值
- }
- /************************************************/
- /************************************************/
- /******************顯示轉換函數******************/
- /************************************************/
- //延時函數
- void delay(uint n)
- {
- uint a;
- uchar i;
- for(a=n;a>0;a--)
- for(i=0;i<2;i++);
- }
- //將浮點數轉成函數
- void ITOC(float f,uchar *c)
- {
- float zs,xs;
- int bxs,bzs,i,k=0;
- xs=modf(f,&zs); //分離整數部分與小數部分函數
- if(P3==0XFE)
- bxs=(int)((xs*100)+0.5);
- else
- bxs=(int)((xs*100)+0.5); //小數點后兩位有效數字
- ITOAX(bxs,axs); //把小數部分轉換成字符串存入axs數組
- bzs=(int)zs; //把整數部分轉成整型
- ITOAZ(bzs,azs); //把整數部分轉換成字符串存入azs數組
- for (i=0;axs[i]!='s';i++) //把最終結果存入c數組
- 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';
- }
- //將整型數轉換成對應的
- void ITOAZ(int num,uchar *p)
- {
- uchar w,i=0;
- do
- {
- w=num%10; //將整型數各位分離,并轉換成對應的字符存入a中
- p[i]=w;
- num=num/10;
- i++;
- }while(num);
- p[i]='s';
- }
- //將小數數部分轉換成對應的
- void ITOAX(int num,uchar *p)
- {
- uchar w,i=0;
- do
- {
- w=num%10; //將整型數各位分離,并轉換成對應的字符存入a中
- p[i]=w;
- num=num/10;
- i++;
- }while(num);
- while(i<2)
- {p[i]=0;i++;}
- p[i]='s';
- w=p[i];
- }
- //顯示譯碼函數
- 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';
- }
- /************************************************/
- /************************************************/
- /********************主換函數********************/
- /************************************************/
- 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;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
系統仿真能正常運行,達設計所有指標,仿真部分電路如下:
PROTUSE系統仿真效果圖
2、實際硬件制作結果
根據電路圖自制電路,測試結果:能正常測量10——1000mA電流,達大部分設計要求。
參考文獻:
[1] 單片機原理與應用技術,清華大學出版社。
[2] 電子技術基礎(模擬部分、數字部分). 北京:高等教育出版社,2006.01
[3] 大學生電子設計與應用.北京:中國電力出版社,2007.03