問題要求
利用51單片機,外加一個ADC0832模數轉換器,設計一個可以實時測量電壓的電路。測量電壓的范圍是0-5V(允許誤差),要求測出的電壓用數碼管實時顯示,精確到小數點后兩位。
代碼編寫:
//----------------------------------------------------------
// 用ADC0832測量電壓,并將測量值顯示在數碼管上
//----------------------------------------------------------
#include #include #define uchar unsigned char #define uint unsigned int uchar Get_AD_Result(); //模數轉換結果 void ET0_init(); //定時器0中斷 void RT1_init(); //定時器1中斷 //ADC0832引腳定義 sbit CS = P1^0; sbit CLK = P1^1; sbit DIDO = P1^2; //數碼管位選 sbit qian = P2^4; sbit bai = P2^5; sbit shi = P2^6; sbit ge = P2^7; //數碼管位選 unsigned char date[4]; //共陰極七段數碼 unsigned char code tb[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00,0X80}; //------------------------------ // 主函數 //------------------------------- void main() { ET0_init(); //定時器0初始化 RT1_init(); //定時器1初始化 ET0 = 1; TR0 = 1; ET1 = 1; TR1 = 1; EA = 1; //打開總中斷 CLK = 0; //ADC0832初始化 CS = 1; while(1); } //--------------------------------- // 定時器0中斷 //--------------------------------- void ET0_INT() interrupt 1 { static uchar i; TH0 = (65536-2000)/256; // 重裝初值 TL0 = (65536-2000)%256; P2 |= 0xf0; //消影 switch(i) //位選,選擇點亮的數碼管, { case(0): P0 = date[0];qian = 0;break;//顯示千位 case(1): P0 = date[1];bai = 0;break;//顯示百位 case(2): P0 = date[2];shi = 0;break;//顯示十位 case(3): P0 = date[3];ge = 0;break;//顯示個位 } i++; if(i==4) { i=0; } } //--------------------------------------------- // 定時器T1中斷服務程序 //--------------------------------------------- void ET1_INT() interrupt 3 { // float L = 500.0/256.0; uint vt; uchar AD; TH1 = (65536-2000)/256; // 重裝初值 TL1 = (65536-2000)%256; AD = Get_AD_Result(); vt = (500.0/256.0)*AD; //測量電壓值 date[0] =tb[vt/1000]; date[1] =tb[vt/100%10]|0x80; //點亮小數點 date[2] =tb[vt/10%10]; date[3] =tb[vt%10]; } //------------------------------ // 獲取AD轉換結果(0通道) //------------------------------ uchar Get_AD_Result() //包含11個CLK下降沿 { uchar i, dat; CS = 1; //ADC0832未工作時,CS端為高電平,此時芯片禁用 _nop_; //對于延時很短的,要求在us級的,采用“_nop_”函數 CLK =1; CS = 0; DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一個下降沿來到時,DI = 1啟動ADC0832 DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二個下降沿 DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三個下降沿,發送1,0選擇通道cho DIDO = 1; //釋放總線 for(i = 0; i < 8; i++) //第4個下降沿到第11個下降沿 { CLK = 0; //clk處于下降沿,每一個下降沿DO端輸入下一個 _nop_; //對于延時很短的,要求在us級的,采用_nop_函數 if(DIDO) dat |= 0x01; // dat = dat | 0x01,dat和0x01做“或”的運算,意思是最低位置1,其它位保持不變。 CLK = 1; _nop_; //clk處于上升沿 dat <<= 1; //數據左移 } return (dat); CS = 1; //ADC0832停止工作 } //------------------------------ //定時器0初始化 //------------------------------ void ET0_init() { TMOD &= 0xf0; //定時器0 TMOD |= 0x01; TH0 = (65536-2000)/256; //2ms溢出 TL0 = (65536-2000)%256; } //--------------------------------- // 定時器1初始化 //----------------------------------- void RT1_init() { TMOD &= 0x0f; TMOD |= 0x10; TH1 = (65536-2000)/256; //2ms溢出 TL1 = (65536-2000)%256; } 電路設計圖: 仿真結果:
上一篇:#51單片機#A/D模數轉換的初步認識和主要指標
下一篇:模數轉換器ADC
推薦閱讀
史海拾趣
為了保持技術領先地位和市場競爭力,ddm hopt + schuler公司積極開展跨界合作和創新發展。公司與多所知名高校和研究機構建立了產學研合作關系,共同研發新技術、新產品。此外,公司還積極參與國際交流與合作,引進國際先進技術和管理經驗。這些合作不僅為公司帶來了更多的創新資源,也提升了公司的國際影響力和競爭力。
進入21世紀后,ddm hopt + schuler公司緊跟數字化浪潮,積極推動數字化轉型和智能制造。公司引入先進的物聯網、大數據和人工智能技術,對生產線進行智能化改造和升級。通過實時數據監控和分析,公司能夠更準確地預測市場需求、優化生產計劃、提高生產效率。同時,智能制造也為企業帶來了更高的靈活性和更低的成本。
CMDS深知技術創新是企業持續發展的關鍵。因此,公司不斷加大研發投入,積極引進優秀人才和先進技術設備。通過持續的研發投入和人才培養,CMDS不斷推出具有創新性和競爭力的新產品和解決方案。這些新產品不僅滿足了客戶不斷變化的需求,也推動了整個行業的發展和進步。
在電子行業的早期,ENTRELEC UK以其創新的接觸器設計在市場中脫穎而出。隨著技術的進步,公司不斷研發新產品,如過載繼電器和電動機保護開關,這些產品迅速獲得了市場的認可。公司通過持續的研發投入,確保產品始終走在行業前沿,為客戶提供更安全、更可靠的解決方案。
在電子行業的初期,Ambersil公司以其創新的技術和產品迅速嶄露頭角。公司研發團隊成功開發出一種高效的電子清潔劑,能夠去除電路板上的頑固污垢,提高電子設備的性能和穩定性。這一創新產品迅速獲得了市場的認可,Ambersil公司因此獲得了大量的訂單,銷售額逐年攀升。
Altium Designer 6 中,制件的原理圖文件中若有中文字,用自帶的"智能PDF"導出時,則在產生的PDF中顯示不了中文字符.本人用Altium Designer 6.3~Altium Designer 6.9都試過,均有此問題,不知能否解決,請哪位大俠指點,若不能人為修改,是否要等 ...… 查看全部問答∨ |
請教:時序分析警告的1個警告 做時序分析的時候,只有一條路徑不滿足: -0.044 ns 99.56 MHz ( period = 10.044 ns ) 。。。。。。。。 再約束的話效果反而越來越差,我想知道,這樣能否正常運行,出錯的幾率有多大? 謝謝請高手指 ...… 查看全部問答∨ |
下面的六個程序片段主要完成這些事情: 輸出Hello, World混亂C語言的源代碼下面的所有程序都可以在GCC下編譯通過,只有最后一個需要動用C++的編譯器g++才能編程通過。 hello1.c 01 #define _________ } 02 ...… 查看全部問答∨ |
|
請教Modbus高手makesoft:實現Modbus協議一定需要超時檢測嗎? 首先聲明,我對Modbus不熟悉,尤其是如何實現它,最近才從網上下載了協議研究了一下,特此向高手請教。搞清楚這些問題,才能有效地在芯片中實現相應的功能,滿足大家的需要。此帖的目的是繼續另一帖的討論:建議STM32的芯片加上串口超時功能, ...… 查看全部問答∨ |
在STM32的DS里面,管腳介紹的表格中Main function(after reset)一欄中,大部分的IO口都是如PA7樣式 ...… 查看全部問答∨ |
我用CCS編程調試時,出現了“error: identifier \\"sinwt\\" is undefined”的錯誤信息,請請教一下是怎么回事?是不是需要加入某個頭文件?還是我的寫法有問題啊?謝謝大家~~~… 查看全部問答∨ |
在使用CCS的過程中,我發現在有關于有軟件延時的程序中會出現問題,感覺延時沒起到作用,比如一個簡單的例子,讓燈閃爍,使用delay函數(函數體內用兩個for循環嵌套那種),這種延時就不會有效果,而用i=50000; while ...… 查看全部問答∨ |
使用Nios時出現如下問題 No Nios II target connection paths were located.Check connections and that a Nios II .sof is downloaded.點擊refresh connection,也沒有反應???… 查看全部問答∨ |