找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7960|回復(fù): 8
收起左側(cè)

單片機(jī)多量程電壓表設(shè)計(jì)(仿真+源碼+文檔)全套資料

  [復(fù)制鏈接]
ID:395118 發(fā)表于 2018-9-7 18:18 | 顯示全部樓層 |閱讀模式
c51做的電壓表,可切換量程,數(shù)據(jù)發(fā)送到上位機(jī)

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

下面是多量程電壓表的設(shè)計(jì)文檔:

1.設(shè)計(jì)目的

1.1鞏固和加深對微處理器原理和接口技術(shù)知識的理解;

1.2培養(yǎng)根據(jù)課題需要選學(xué)參考書籍、查閱手冊和文獻(xiàn)資料的能力;

1.3學(xué)會方案論證的比較方法,拓寬知識,初步掌握工程設(shè)計(jì)的基本方法;

1.4掌握常用儀器、儀表的正確使用方法,學(xué)會軟、硬件的設(shè)計(jì)和調(diào)試方法;

1.5能按設(shè)計(jì)的要求編寫設(shè)計(jì)文檔,能正確反映設(shè)計(jì)和實(shí)驗(yàn)成果,能用計(jì)算機(jī)繪制電路圖和流程圖。

2.設(shè)計(jì)要求

2.1 使用ADC0832進(jìn)行模數(shù)轉(zhuǎn)換;

2.2 通過串口讀取測量到的電壓值;

2.3 數(shù)碼管顯示測量到的電壓值;

2.4 可測多個量程的電壓。

3. 硬件設(shè)計(jì)

3.1 設(shè)計(jì)思想

該系統(tǒng)的硬件設(shè)計(jì)思路如下:首先,通過ADC0832對外部電壓進(jìn)行模數(shù)轉(zhuǎn)換,然后通過時鐘線、數(shù)據(jù)線和控制使能線與單片機(jī)相連。而后,單片機(jī)通過八根數(shù)據(jù)線與四個控制線與四位數(shù)碼管進(jìn)行連接,用于顯示測量到的電壓。另外,單片機(jī)通過TX給外部發(fā)送數(shù)據(jù),PC端可以通過USB-TTL模塊直接接收到電壓值。最后,關(guān)于多量程設(shè)計(jì),量程方面我采用了電阻分壓方式,這樣就可以實(shí)現(xiàn)大量程的測量,量程選擇方面我使用了開關(guān)與繼電器實(shí)現(xiàn)。

3.2主要元器件介紹

3.2.1 ADC0832

ADC0832 是美國國家半導(dǎo)體公司生產(chǎn)的一種8位分辨率、雙通道A/D轉(zhuǎn)換芯片。芯片引腳圖如圖1所示。其引腳分別為CS(片選使能)、CH0(模擬輸入通道0)、CH0(模擬輸入通道1)、GND(供電及參考電壓低電位)、DI(數(shù)據(jù)信號輸入)、DO(數(shù)據(jù)信號輸出)、CLK(時鐘信號輸入)以及VCC/VREF(電源及參考電壓輸入)其時序邏輯圖如圖2所示。由圖2可知一般情況下ADC0832與單片機(jī)連接應(yīng)使用四根控制信號線,分別為CS、DO、DI和CLK。但由圖2可知DO與DI其中一個作用時,另一個則不作用,因此在進(jìn)行硬件電路設(shè)計(jì)時可以將DO和DI連接在同一個I/O口上。

ADC0832為8位分辨率A/D轉(zhuǎn)換芯片,其最高分辨可達(dá)256級,可以適應(yīng)一般的模擬量(低精度)轉(zhuǎn)換要求。

圖1

圖2

3.3.2 STC89C52RC

STC89C52RC 單片機(jī)是宏晶科技推出的超強(qiáng)抗干擾、高速、低功耗單片機(jī),指令代碼完全兼容傳統(tǒng)8051單片機(jī)。其最高頻率時鐘為80 MHz, Flash 存儲器為8KB, RAM為512 bit,E2PROM為2KB,可反復(fù)擦寫編程。工作溫度為-40℃~+85℃, 內(nèi)置看門狗電路,內(nèi)部電源供電系統(tǒng)、時鐘電路和復(fù)位電路都經(jīng)過特殊處理!6 時鐘/機(jī)器周期”和“12 時鐘/機(jī)器周期”可在ISP編程時反復(fù)設(shè)置。其DPIP封裝引腳圖如圖3所示。實(shí)物圖如圖4所示。

                                                        圖3                                                                                                                              圖4

3.2.3 四位共陽極數(shù)碼管

圖5所示即為該系統(tǒng)所采用的共陽極數(shù)碼管。該數(shù)碼管共有12個引腳,其中8個為數(shù)據(jù)引腳,4個為控制引腳。數(shù)據(jù)引腳作用為向數(shù)碼管輸入要顯示的數(shù)據(jù),控制引腳作用為分別控制四個數(shù)碼的亮和滅。圖6所示及為其內(nèi)部電路圖。

圖5

圖6

3.3 原理圖及功能電路介紹

整體原理圖如圖7所示。該電路可以分為三個部分,分別為:模數(shù)轉(zhuǎn)換部分、顯示部分和數(shù)據(jù)處理部分。

圖7

3.3.1 顯示部分

圖8

圖8所示即為顯示部分電路圖。該部分實(shí)現(xiàn)的功能是顯示測量到的樹值。數(shù)碼管的八個的數(shù)據(jù)引腳引出接到單片機(jī)的P0上,用于接受顯示數(shù)據(jù)。四個控制引腳分別接在四個PNP管的集電極上,然后PNP管的基極連接單片機(jī)的四個I/O口,發(fā)射極接VCC。這里控制引腳不直接接單片機(jī)上的原因是:單片機(jī)I/O無法提供大電流,不能作為共陽極數(shù)碼管的控制信號,因此需要接三極管方大電流。

3.2.2模數(shù)轉(zhuǎn)換部分

圖9

圖9所示即為模數(shù)轉(zhuǎn)換部分電路圖。該部分的主要作用是測量電壓值并以數(shù)字量傳輸?shù)絾纹瑱C(jī)中。該部分可以分為兩個子部分,分別為測量部分和量程控制部分。測量部分由ADC0832組成,它通過三根線將CS、CLK、DO與DI與單片機(jī)相連。另外,其CH0接到量程控制部分讀取電壓。量程控制部分主要由繼電器、開關(guān)和電阻組成。開關(guān)連接一個I/O口和繼電器。繼電器選擇接入CH0的信號,當(dāng)為導(dǎo)通時,量程為0~5V,外部無其他電路,當(dāng)為不導(dǎo)通時,量程為0~50V,外部接一個電阻分壓電路。

3.2.3 數(shù)據(jù)處理部分

中央數(shù)據(jù)處理部分由89C52RC構(gòu)成。該部分將上述兩部分整合并控制。MCU的P0口接數(shù)碼管的數(shù)據(jù)線;P1.0~P1.3接數(shù)碼管控制部分(三極管的基極);P1.4接量程控制部分的開關(guān),作用是讀取當(dāng)前量程選擇情況;P2.0~P2.2分別接ADC0832的CS、CLK和DO/DI;TX接外部通信設(shè)備,接受當(dāng)前的電壓測量值。

4. 軟件設(shè)計(jì)

4.1 設(shè)計(jì)思想

單片機(jī)啟動后,先初始化串口,并定義緩存變量,然后進(jìn)行while死循環(huán)。在死循環(huán)中,先調(diào)用AD轉(zhuǎn)換函數(shù)讀一次“電壓值”,但這時得到的并不是真正的電壓值,所以需要進(jìn)行精度修正,將范圍0~255的范圍修正為0~500。再判斷當(dāng)前量程選擇情況,根據(jù)它來判斷顯示與串口數(shù)據(jù)的小數(shù)點(diǎn)位置,最后將數(shù)據(jù)顯示并通過串口發(fā)送。

4.2軟件流程圖

圖10



5. 調(diào)試運(yùn)行

5.1 小量程測量結(jié)果

圖11為小量程電壓的仿真測量結(jié)果。左下方電壓表為ADC0832輸入的電壓,為4.32V。而圖中數(shù)碼管讀到的值為4.33V,串口發(fā)送的數(shù)據(jù)也為4.33V。因此,可以得出結(jié)論,在小量程的仿真測試中,電壓測量誤差非常小,可忽略不計(jì)。

圖11

5.1大量程測量結(jié)果

圖12為大量程電壓的仿真測量結(jié)果。左下方第一個電壓表為ADC0832輸入的電壓,為4.52V,第二個電壓表為所測激勵源的電壓,為45.2。而圖中數(shù)碼管讀到的值為45.2V,串口發(fā)送的數(shù)據(jù)也為45.2V。因此,可以得出結(jié)論,在大量程的仿真測試中,電壓測量誤差幾乎沒有。

圖12

6.設(shè)計(jì)心得體會

通過此次設(shè)計(jì),讓我們對所學(xué)的51單片機(jī)更加熟悉了解,對理論學(xué)習(xí)時沒有掌握牢固的一些知識以及一些在學(xué)習(xí)中存在的漏洞進(jìn)行學(xué)習(xí)并加以彌補(bǔ)。在學(xué)習(xí)上光有理論知識那只是“紙上談兵”,還需實(shí)際動手去實(shí)踐。真正把所學(xué)的用到日常生活中,理論聯(lián)系實(shí)際,做出實(shí)物模型。這次單片機(jī)設(shè)計(jì),我設(shè)計(jì)的是多量程電壓表設(shè)計(jì),通過這次設(shè)計(jì)我感覺到要想做成功,必須花時間多做準(zhǔn)備,查閱大量資料,每個過程都很繁瑣,都要認(rèn)真地分析每一步每一個模塊要實(shí)現(xiàn)大的功能,然后分步進(jìn)行編寫調(diào)試,最后整合成在一起。另外,通過本次設(shè)計(jì),我也學(xué)會了熟練使用proteus進(jìn)行仿真設(shè)計(jì)。

在這次設(shè)計(jì),我們知道了基于單片機(jī)的系統(tǒng)設(shè)計(jì),需要從兩個方面入手:一是軟件的實(shí)現(xiàn)即程序的編寫,二是硬件電路的實(shí)現(xiàn)。因此在這次的單片機(jī)設(shè)計(jì)中,我不僅鞏固了我所學(xué)的單片機(jī)知識,而且也提高了我的硬件設(shè)計(jì)水平和動手能力,使得我的實(shí)踐能力進(jìn)一步增強(qiáng)。

參考書目
[1] 肖金球. 單片機(jī)原理與接口技術(shù).[M].北京:清華大學(xué)出版社,2004.12
[2] 郭天祥. 新概念51單片機(jī)C語言教程: 入門、提高、開發(fā)、拓展全攻略[M]. 電子工業(yè)出版社, 2009.
[3] 康華光. 電子技術(shù)基礎(chǔ). 模擬部分[M]. 高等教育出版社, 1999.

單片機(jī)源程序如下:
  1. /***************** 多量程電壓表*********************/
  2. /******** 作者:孫瑋 學(xué)號:14200106214**************/
  3. /*系統(tǒng)主要實(shí)現(xiàn)功能:通過ADC0832將讀取到的模擬量轉(zhuǎn)化*/
  4. /*為數(shù)字量,并通過單片機(jī)進(jìn)行讀取然后顯示在數(shù)碼管上**/
  5. /*并且可以通過串行口讀取到所測量的電壓值。此外,該**/
  6. /*電路通過電阻分壓可以實(shí)現(xiàn)多個量程的測量************/

  7. #include <reg52.h>                  //52系列單片機(jī)頭文件定義
  8. #include <stdio.h>                  //C語言頭文件定義

  9. //***************************
  10. //*******引腳定義************
  11. //***************************
  12. //ADC0832控制口定義
  13. sbit    CS =P2^0;                   //CS:片選使能信號輸出端
  14. sbit    CLK=P2^1;                   //CLK:時鐘信號輸出端
  15. sbit    DIO=P2^2;                   //DI/DO信號輸出端(由于D0與D1在通信時不會同時有效,所以共用一個IO口)

  16. //數(shù)碼管控制引腳定義(數(shù)據(jù)引腳共8個,使用P0)
  17. sbit    S_1=P1^0;                   //第一個數(shù)碼管陽極控制端
  18. sbit    S_2=P1^1;                   //第二個數(shù)碼管陽極控制端
  19. sbit    S_3=P1^2;                   //第三個數(shù)碼管陽極控制端
  20. sbit    S_4=P1^3;                   //第四個數(shù)碼管陽極控制端

  21. //量程與繼電器控制引腳定義
  22. sbit    KEY=P1^4;                   //用于量程的選擇以及繼電器的控制

  23. //***************************
  24. //*******常量定義************
  25. //***************************
  26. unsigned int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  27.                                     //0~9在共陽數(shù)碼管中所對應(yīng)的十六進(jìn)制值
  28. //***************************
  29. //*******延時1000us**********
  30. //***************************
  31. void delay_1000us()                 //簡單延時函數(shù),約延時1000us
  32. {               
  33.         unsigned char i=1000;
  34.         while(i--);
  35. }

  36. //***************************
  37. //*******ADC0832讀取程序*****
  38. //***************************
  39. unsigned int ADC0832()              //此處編程參考ADC0832英文手冊
  40. {   
  41.     unsigned int i,buff;            //緩存數(shù)據(jù)定義
  42.                                     //一個讀取周期開始
  43.     CS=1;                           //CS置一,轉(zhuǎn)換開始
  44.     CLK=0;                          //為第一個時鐘信號做準(zhǔn)備
  45.     CS=0;                           //芯片使能
  46.     DIO=1;                          //給發(fā)送DI發(fā)送起始電平
  47.     CLK=1;                          //第一個時鐘開始
  48.     CLK=0;                          //第一個時鐘結(jié)束
  49.     DIO=1;                          //給DI發(fā)送高電平,選擇單通道模式
  50.     CLK=1;                          //第二個時鐘開始
  51.     CLK=0;                          //第二個時鐘結(jié)束
  52.     DIO=0;                          //給DI發(fā)送低電平,選擇通道0
  53.     CLK=1;                          //第三個時鐘開始
  54.     CLK=0;                          //第三個時鐘結(jié)束
  55.     DIO=1;                          //DO置一,準(zhǔn)備讀取數(shù)據(jù)
  56.     for(i=0;i<8;i++)                //讀取八位數(shù)據(jù),由高到低讀取
  57.     {
  58.         CLK=1;                      //時鐘信號拉高
  59.         CLK=0;                      //下降沿有效,進(jìn)行讀取數(shù)據(jù)
  60.         buff<<=1;                   //將下面儲存的低位數(shù)據(jù)向右移
  61.             buff|=DIO;                  //將輸出數(shù)據(jù)DIO通過或運(yùn)算儲存在buff最低位
  62.     }
  63.     CS=1;                           //測量完畢,將CS拉高,片選無效
  64.     return buff;
  65. }

  66. //***************************
  67. //*******串口初始化程序******
  68. //***************************
  69. void UartInit(void)                            //串行口初始化
  70. {
  71.         SCON=0x50;                                //8位數(shù)據(jù),可變波特率  
  72.         TMOD=0x20;                                //設(shè)定定時器1為16位自動重裝方式
  73.         TL1=0xFD;                                //設(shè)定定時初值
  74.         TH1=0xFD;                                //設(shè)定定時初值
  75.         ET1=0;                                    //禁止定時器1中斷
  76.         TR1=1;                                    //啟動定時器1
  77. }

  78. //***************************
  79. //*******主程序**************
  80. //***************************
  81. void main()
  82. {
  83.     unsigned int buff,ge,shi,bai;   //緩存數(shù)據(jù)定義
  84.     UartInit();                     //串口初始化   
  85.     while(1)                        //死循環(huán)
  86.     {                               //主函數(shù)程序開始
  87.         buff=ADC0832()*100;         //讀取AD的值,并進(jìn)行修正
  88.         buff=buff/51;               //精度修正,轉(zhuǎn)換為000~500范圍
  89.         bai=buff/100;               //保存buff的百位
  90.         shi=(buff%100)/10;          //保存buff的十位
  91.         ge=buff%10;                 //保存buff的個位
  92.                                     //數(shù)碼管顯示程序
  93.         if(KEY==1)                  //如果KEY為1,量程設(shè)為0~5V
  94.         {
  95.         S_1=0;                      //選通第一位數(shù)碼管,顯示第一位數(shù)
  96.         P0=table[0];                //P0口輸出8位數(shù)據(jù)
  97.         delay_1000us();             //短暫延時
  98.         P0=0xff;                    //數(shù)碼管消隱
  99.         S_1=1;                      //關(guān)閉第一位數(shù)碼管

  100.         S_2=0;                      //選通第二位數(shù)碼管,顯示第二位數(shù)
  101.         P0=table[bai]&0x7f;         //P0口輸出8位數(shù)據(jù),因?yàn)榱砍虨闉?~5V,所以第一位后顯示小數(shù)點(diǎn)
  102.         delay_1000us();             //短暫延時
  103.         P0=0xff;                    //數(shù)碼管消隱
  104.         S_2=1;                      //關(guān)閉第二位數(shù)碼管

  105.         S_3=0;                      //選通第三位數(shù)碼管,顯示第三位數(shù)
  106.         P0=table[shi];              //P0口輸出8位數(shù)據(jù)
  107.         delay_1000us();             //短暫延時
  108.         P0=0xff;                    //數(shù)碼管消隱
  109.         S_3=1;                      //關(guān)閉第三位數(shù)碼管

  110.         S_4=0;                      //選通第四位數(shù)碼管,顯示第四位數(shù)
  111.         P0=table[ge];               //P0口輸出8位數(shù)據(jù)
  112.         delay_1000us();             //短暫延時
  113.         P0=0xff;                    //數(shù)碼管消隱
  114.         S_4=1;                      //關(guān)閉第四位數(shù)碼管
  115.                                     //串口發(fā)送程序
  116.         TI=1;                       //TI置一,開始發(fā)送數(shù)據(jù)     
  117.         printf("%d.%d%d\n",bai,shi,ge);        
  118.                                     //將buff/100后發(fā)出
  119.         while(!TI);                 //直到數(shù)據(jù)發(fā)送完畢
  120.         TI=0;                       //數(shù)據(jù)發(fā)送完畢后,TI置〇
  121.         }
  122.         else                        //如果KEY為1,量程設(shè)為0~50V
  123.         {
  124.         S_1=0;                      //選通第一位數(shù)碼管,顯示第一位數(shù)
  125.         P0=table[0];                //P0口輸出8位數(shù)據(jù)
  126.         delay_1000us();             //短暫延時
  127.         P0=0xff;                    //數(shù)碼管消隱
  128.         S_1=1;                      //關(guān)閉第一位數(shù)碼管

  129.         S_2=0;                      //選通第二位數(shù)碼管,顯示第二位數(shù)
  130.         P0=table[bai];              //P0口輸出8位數(shù)據(jù)
  131.         delay_1000us();             //短暫延時
  132.         P0=0xff;                    //數(shù)碼管消隱
  133.         S_2=1;                      //關(guān)閉第二位數(shù)碼管

  134.         S_3=0;                      //選通第三位數(shù)碼管,顯示第三位數(shù)
  135.         P0=table[shi]&0x7f;         //P0口輸出8位數(shù)據(jù),因?yàn)榱砍虨闉?~50V,所以第二位后顯示小數(shù)點(diǎn)
  136.         delay_1000us();             //短暫延時
  137.         P0=0xff;                    //數(shù)碼管消隱
  138.         S_3=1;                      //關(guān)閉第三位數(shù)碼管

  139.         S_4=0;                      //選通第四位數(shù)碼管,顯示第四位數(shù)
  140.         P0=table[ge];               //P0口輸出8位數(shù)據(jù)
  141.         delay_1000us();             //短暫延時
  142.         P0=0xff;                    //數(shù)碼管消隱
  143.         S_4=1;                      //關(guān)閉第四位數(shù)碼管
  144.                                     //串口發(fā)送程序
  145. ……………………

  146. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

資料51hei附件下載:
仿真程序文檔.7z (1.18 MB, 下載次數(shù): 196)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:314651 發(fā)表于 2018-9-13 20:38 | 顯示全部樓層
666,很強(qiáng)。
回復(fù)

使用道具 舉報(bào)

ID:272434 發(fā)表于 2019-1-7 15:35 | 顯示全部樓層
好好學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:452539 發(fā)表于 2019-1-8 12:23 | 顯示全部樓層
好好學(xué)習(xí),天天向上。謝謝樓主提供
回復(fù)

使用道具 舉報(bào)

ID:754272 發(fā)表于 2020-5-17 20:33 | 顯示全部樓層
很厲害
回復(fù)

使用道具 舉報(bào)

ID:574346 發(fā)表于 2020-6-8 22:59 | 顯示全部樓層
這個串口是怎么弄的,我怎么點(diǎn)不開
回復(fù)

使用道具 舉報(bào)

ID:1024802 發(fā)表于 2022-5-8 16:07 | 顯示全部樓層
是因?yàn)槲业陌姹咎狭藛?我的庫里好多東西找不到
回復(fù)

使用道具 舉報(bào)

ID:262 發(fā)表于 2022-5-8 19:14 | 顯示全部樓層
liu188 發(fā)表于 2022-5-8 16:07
是因?yàn)槲业陌姹咎狭藛?我的庫里好多東西找不到

用Proteus8.8即可 你看
51hei.gif
回復(fù)

使用道具 舉報(bào)

ID:1142899 發(fā)表于 2025-1-11 18:33 | 顯示全部樓層

好好學(xué)習(xí)一下!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表