這是我剛做的一個20~200A大電流檢測電路,通過ADC0809轉換成數字信號,通過LED顯示結果,包括原理圖,仿真文件,源代碼。
將R1的電壓采樣到ADC0809,轉換為數字信號,輸入單片機
AD畫的原理圖(附件中可以可以下載):
0.png (53.65 KB, 下載次數: 146)
下載附件
2017-4-11 18:01 上傳
0.png (39.17 KB, 下載次數: 126)
下載附件
2017-4-11 18:03 上傳
51單片機P0口和其他口內部結構不同
使用單片機P0端口時必須把P0的8個口都接上拉電阻,
使用單要不然P0口只能輸出低電平,不能輸出高電平
proteus仿真原理圖:
0.png (33.1 KB, 下載次數: 154)
下載附件
2017-4-11 18:00 上傳
單片機源程序:
- //------------------------------51單片機頭文件
- #include<reg51.h>
- //各數字的數碼管段碼(共陰)
- unsigned char code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數碼管顯示數組{0,1,2,3,4,5,6,7,8,9}
- sbit CLK=P3^3; //時鐘信號
- sbit ST=P3^6; //啟動信號,由低電平到高電平時間段復位 ,高電平到低電平時間段開始轉換
- sbit EOC=P3^5; //轉換結束信號,當轉換結束時會自動變成高電平
- sbit OE=P3^4; //輸出使能 ,當OE為高電平時開啟輸出端,OE為低電平時禁止輸出
- sbit W1=P2^4; //定義W1表示P2.4位,第一位數碼管控制端, 為0時亮,為1時滅
- sbit W2=P2^3; //定義W2表示P2.3位,第二位數碼管控制端, 為0時亮,為1時滅
- sbit W3=P2^2; //定義W3表示P2.2位,第三位數碼管控制端, 為0時亮,為1時滅
- sbit key=P3^7; //定義按鍵控制key為P3.7
- //----------------------------1ms延時函數
- void Delayms(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- for(i=0;i<120;i++);
- }
- //---------------------------顯示轉換結果(動態掃描模式)
- void Display(unsigned int d)
- {
- d=d*1.0/256*5*40; //將數字量轉換成模擬量的公式為5V*(d/256),采樣電壓值為電流值*100歐姆,所以要獲得實際電流值,即為采樣電壓值*40倍 (n1:n2=4000:1)
- W1=0; //第一個數碼管亮
- P0=DSY_CODE[d%10]; //顯示第一個數碼管的值 為P1的值除以10取余
- Delayms(6); //延時5ms
- W1=1; //第一個數碼管滅
- W2=0;
- P0=DSY_CODE[d%100/10]; //顯示第二個數碼管的值 為P1的值除以100取余 再除以10取整
- Delayms(6);
- W2=1;
-
- W3=0;
- P0=DSY_CODE[d/100]; //顯示第三個數碼管的值 為P1的值除以100取整
- Delayms(6);
- W3=1;
- }
- //-------------------------------------------------主程序
- void main()
- {
- TMOD=0x02; //16位定時器0工作模式設置為2
- TH0=0x14; //設置定時器高8位初值為0x14
- TL0=0x00; //設置定時器低8位初值為0x00
- TR0=1; //開啟定時器0開關
- ET0=1; //開啟定時器0中斷開關
- EA=1; //開啟中斷總開關
- //---------------啟動 A/D 轉換
- //---------開始按鍵-----
- A: while(key==1); //等待按鍵按下
- Delayms(1); //延時1ms
- if(key==0) //延時1ms后按鍵還是按下了,說明按鍵確實按下了(按鍵消抖功能)
- while(key==0); //當按鍵松開時,循環轉換和顯示
- while(1)
- {
- ST=0;
- ST=1;
- ST=0;
-
- while(EOC==0); //等待轉換完成
- OE=1; //開啟輸出端
-
- Display(P1); //將輸出到單片機P1端口上的數字信號在LED顯示出來
- OE=0; //關閉輸出端
-
- //------停止按鍵---------
- if(key==0)
- {
- Delayms(1);
- if(key==0) //延時1ms后按鍵還是按下了,說明按鍵確實按下了(按鍵消抖功能)
- while(key==0); //當按鍵松開時
-
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
-
復制代碼
0.png (74.75 KB, 下載次數: 121)
下載附件
2017-4-11 17:59 上傳
全部資料打包下載:
大電流檢測.zip
(210.71 KB, 下載次數: 257)
2017-4-11 14:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|