久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7850|回復: 8
收起左側

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

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

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

下面是多量程電壓表的設計文檔:

1.設計目的

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

1.2培養根據課題需要選學參考書籍、查閱手冊和文獻資料的能力;

1.3學會方案論證的比較方法,拓寬知識,初步掌握工程設計的基本方法;

1.4掌握常用儀器、儀表的正確使用方法,學會軟、硬件的設計和調試方法;

1.5能按設計的要求編寫設計文檔,能正確反映設計和實驗成果,能用計算機繪制電路圖和流程圖。

2.設計要求

2.1 使用ADC0832進行模數轉換;

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

2.3 數碼管顯示測量到的電壓值;

2.4 可測多個量程的電壓。

3. 硬件設計

3.1 設計思想

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

3.2主要元器件介紹

3.2.1 ADC0832

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

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

圖1

圖2

3.3.2 STC89C52RC

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

                                                        圖3                                                                                                                              圖4

3.2.3 四位共陽極數碼管

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

圖5

圖6

3.3 原理圖及功能電路介紹

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

圖7

3.3.1 顯示部分

圖8

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

3.2.2模數轉換部分

圖9

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

3.2.3 數據處理部分

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

4. 軟件設計

4.1 設計思想

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

4.2軟件流程圖

圖10



5. 調試運行

5.1 小量程測量結果

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

圖11

5.1大量程測量結果

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

圖12

6.設計心得體會

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

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

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

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

  7. #include <reg52.h>                  //52系列單片機頭文件定義
  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. //數碼管控制引腳定義(數據引腳共8個,使用P0)
  17. sbit    S_1=P1^0;                   //第一個數碼管陽極控制端
  18. sbit    S_2=P1^1;                   //第二個數碼管陽極控制端
  19. sbit    S_3=P1^2;                   //第三個數碼管陽極控制端
  20. sbit    S_4=P1^3;                   //第四個數碼管陽極控制端

  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在共陽數碼管中所對應的十六進制值
  28. //***************************
  29. //*******延時1000us**********
  30. //***************************
  31. void delay_1000us()                 //簡單延時函數,約延時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;            //緩存數據定義
  42.                                     //一個讀取周期開始
  43.     CS=1;                           //CS置一,轉換開始
  44.     CLK=0;                          //為第一個時鐘信號做準備
  45.     CS=0;                           //芯片使能
  46.     DIO=1;                          //給發送DI發送起始電平
  47.     CLK=1;                          //第一個時鐘開始
  48.     CLK=0;                          //第一個時鐘結束
  49.     DIO=1;                          //給DI發送高電平,選擇單通道模式
  50.     CLK=1;                          //第二個時鐘開始
  51.     CLK=0;                          //第二個時鐘結束
  52.     DIO=0;                          //給DI發送低電平,選擇通道0
  53.     CLK=1;                          //第三個時鐘開始
  54.     CLK=0;                          //第三個時鐘結束
  55.     DIO=1;                          //DO置一,準備讀取數據
  56.     for(i=0;i<8;i++)                //讀取八位數據,由高到低讀取
  57.     {
  58.         CLK=1;                      //時鐘信號拉高
  59.         CLK=0;                      //下降沿有效,進行讀取數據
  60.         buff<<=1;                   //將下面儲存的低位數據向右移
  61.             buff|=DIO;                  //將輸出數據DIO通過或運算儲存在buff最低位
  62.     }
  63.     CS=1;                           //測量完畢,將CS拉高,片選無效
  64.     return buff;
  65. }

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

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

  100.         S_2=0;                      //選通第二位數碼管,顯示第二位數
  101.         P0=table[bai]&0x7f;         //P0口輸出8位數據,因為量程為為0~5V,所以第一位后顯示小數點
  102.         delay_1000us();             //短暫延時
  103.         P0=0xff;                    //數碼管消隱
  104.         S_2=1;                      //關閉第二位數碼管

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

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

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

  134.         S_3=0;                      //選通第三位數碼管,顯示第三位數
  135.         P0=table[shi]&0x7f;         //P0口輸出8位數據,因為量程為為0~50V,所以第二位后顯示小數點
  136.         delay_1000us();             //短暫延時
  137.         P0=0xff;                    //數碼管消隱
  138.         S_3=1;                      //關閉第三位數碼管

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

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

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

評分

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

查看全部評分

回復

使用道具 舉報

ID:314651 發表于 2018-9-13 20:38 | 顯示全部樓層
666,很強。
回復

使用道具 舉報

ID:272434 發表于 2019-1-7 15:35 | 顯示全部樓層
好好學習一下
回復

使用道具 舉報

ID:452539 發表于 2019-1-8 12:23 | 顯示全部樓層
好好學習,天天向上。謝謝樓主提供
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:1024802 發表于 2022-5-8 16:07 | 顯示全部樓層
是因為我的版本太老了嗎?我的庫里好多東西找不到
回復

使用道具 舉報

ID:262 發表于 2022-5-8 19:14 | 顯示全部樓層
liu188 發表于 2022-5-8 16:07
是因為我的版本太老了嗎?我的庫里好多東西找不到

用Proteus8.8即可 你看
51hei.gif
回復

使用道具 舉報

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

好好學習一下!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区三级 | 国产黄色在线 | 国产精品免费视频一区 | 天天拍天天射 | 国产一区二区三区在线 | 91精品国产乱码久久久久久久 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 天天夜夜操 | 久久综合一区二区三区 | 在线a视频| 亚洲视频 欧美视频 | 成人影院在线视频 | 久久一 | 亚洲精品中文字幕 | 欧美日韩成人影院 | 国产成人亚洲精品自产在线 | 欧美日韩在线观看一区 | 色婷婷久久久亚洲一区二区三区 | 亚洲人成网站777色婷婷 | 精品视频一区二区在线观看 | 色在线视频网站 | 日韩在线中文字幕 | 黄色大片网 | 日韩欧美在线不卡 | 亚洲一区二区三区四区五区中文 | 久操av在线 | av性色 | 日韩欧美一级精品久久 | 在线观看成年视频 | 九九九精品视频 | 色欧美片视频在线观看 | 免费在线成人网 | 日日干夜夜草 | 视频1区2区 | 伊人春色在线观看 | 亚洲一二三区免费 | 国产乱码精品一区二区三区忘忧草 | 日本特黄特色aaa大片免费 | 成人免费视频 | 精品一区二区三区在线观看国产 | 中文字幕在线播放第一页 |