標(biāo)題: 單片機(jī)多量程電壓表設(shè)計(仿真+源碼+文檔)全套資料 [打印本頁]
作者: ck138130 時間: 2018-9-7 18:18
標(biāo)題: 單片機(jī)多量程電壓表設(shè)計(仿真+源碼+文檔)全套資料
c51做的電壓表,可切換量程,數(shù)據(jù)發(fā)送到上位機(jī)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (10.48 KB, 下載次數(shù): 45)
下載附件
2018-9-8 03:39 上傳
下面是多量程電壓表的設(shè)計文檔:
1.設(shè)計目的
1.1鞏固和加深對微處理器原理和接口技術(shù)知識的理解;
1.2培養(yǎng)根據(jù)課題需要選學(xué)參考書籍、查閱手冊和文獻(xiàn)資料的能力;
1.3學(xué)會方案論證的比較方法,拓寬知識,初步掌握工程設(shè)計的基本方法;
1.4掌握常用儀器、儀表的正確使用方法,學(xué)會軟、硬件的設(shè)計和調(diào)試方法;
1.5能按設(shè)計的要求編寫設(shè)計文檔,能正確反映設(shè)計和實(shí)驗(yàn)成果,能用計算機(jī)繪制電路圖和流程圖。
2.設(shè)計要求
2.1 使用ADC0832進(jìn)行模數(shù)轉(zhuǎn)換;
2.2 通過串口讀取測量到的電壓值;
2.3 數(shù)碼管顯示測量到的電壓值;
2.4 可測多個量程的電壓。
3. 硬件設(shè)計
3.1 設(shè)計思想
該系統(tǒng)的硬件設(shè)計思路如下:首先,通過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è)計,量程方面我采用了電阻分壓方式,這樣就可以實(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è)計時可以將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è)計
4.1 設(shè)計思想
單片機(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é)論,在小量程的仿真測試中,電壓測量誤差非常小,可忽略不計。

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

圖12
6.設(shè)計心得體會
通過此次設(shè)計,讓我們對所學(xué)的51單片機(jī)更加熟悉了解,對理論學(xué)習(xí)時沒有掌握牢固的一些知識以及一些在學(xué)習(xí)中存在的漏洞進(jìn)行學(xué)習(xí)并加以彌補(bǔ)。在學(xué)習(xí)上光有理論知識那只是“紙上談兵”,還需實(shí)際動手去實(shí)踐。真正把所學(xué)的用到日常生活中,理論聯(lián)系實(shí)際,做出實(shí)物模型。這次單片機(jī)設(shè)計,我設(shè)計的是多量程電壓表設(shè)計,通過這次設(shè)計我感覺到要想做成功,必須花時間多做準(zhǔn)備,查閱大量資料,每個過程都很繁瑣,都要認(rèn)真地分析每一步每一個模塊要實(shí)現(xiàn)大的功能,然后分步進(jìn)行編寫調(diào)試,最后整合成在一起。另外,通過本次設(shè)計,我也學(xué)會了熟練使用proteus進(jìn)行仿真設(shè)計。
在這次設(shè)計,我們知道了基于單片機(jī)的系統(tǒng)設(shè)計,需要從兩個方面入手:一是軟件的實(shí)現(xiàn)即程序的編寫,二是硬件電路的實(shí)現(xiàn)。因此在這次的單片機(jī)設(shè)計中,我不僅鞏固了我所學(xué)的單片機(jī)知識,而且也提高了我的硬件設(shè)計水平和動手能力,使得我的實(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ī)源程序如下:
- /***************** 多量程電壓表*********************/
- /******** 作者:孫瑋 學(xué)號:14200106214**************/
- /*系統(tǒng)主要實(shí)現(xiàn)功能:通過ADC0832將讀取到的模擬量轉(zhuǎn)化*/
- /*為數(shù)字量,并通過單片機(jī)進(jìn)行讀取然后顯示在數(shù)碼管上**/
- /*并且可以通過串行口讀取到所測量的電壓值。此外,該**/
- /*電路通過電阻分壓可以實(shí)現(xiàn)多個量程的測量************/
- #include <reg52.h> //52系列單片機(jī)頭文件定義
- #include <stdio.h> //C語言頭文件定義
- //***************************
- //*******引腳定義************
- //***************************
- //ADC0832控制口定義
- sbit CS =P2^0; //CS:片選使能信號輸出端
- sbit CLK=P2^1; //CLK:時鐘信號輸出端
- sbit DIO=P2^2; //DI/DO信號輸出端(由于D0與D1在通信時不會同時有效,所以共用一個IO口)
- //數(shù)碼管控制引腳定義(數(shù)據(jù)引腳共8個,使用P0)
- sbit S_1=P1^0; //第一個數(shù)碼管陽極控制端
- sbit S_2=P1^1; //第二個數(shù)碼管陽極控制端
- sbit S_3=P1^2; //第三個數(shù)碼管陽極控制端
- sbit S_4=P1^3; //第四個數(shù)碼管陽極控制端
- //量程與繼電器控制引腳定義
- sbit KEY=P1^4; //用于量程的選擇以及繼電器的控制
- //***************************
- //*******常量定義************
- //***************************
- unsigned int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //0~9在共陽數(shù)碼管中所對應(yīng)的十六進(jìn)制值
- //***************************
- //*******延時1000us**********
- //***************************
- void delay_1000us() //簡單延時函數(shù),約延時1000us
- {
- unsigned char i=1000;
- while(i--);
- }
- //***************************
- //*******ADC0832讀取程序*****
- //***************************
- unsigned int ADC0832() //此處編程參考ADC0832英文手冊
- {
- unsigned int i,buff; //緩存數(shù)據(jù)定義
- //一個讀取周期開始
- CS=1; //CS置一,轉(zhuǎn)換開始
- CLK=0; //為第一個時鐘信號做準(zhǔn)備
- CS=0; //芯片使能
- DIO=1; //給發(fā)送DI發(fā)送起始電平
- CLK=1; //第一個時鐘開始
- CLK=0; //第一個時鐘結(jié)束
- DIO=1; //給DI發(fā)送高電平,選擇單通道模式
- CLK=1; //第二個時鐘開始
- CLK=0; //第二個時鐘結(jié)束
- DIO=0; //給DI發(fā)送低電平,選擇通道0
- CLK=1; //第三個時鐘開始
- CLK=0; //第三個時鐘結(jié)束
- DIO=1; //DO置一,準(zhǔn)備讀取數(shù)據(jù)
- for(i=0;i<8;i++) //讀取八位數(shù)據(jù),由高到低讀取
- {
- CLK=1; //時鐘信號拉高
- CLK=0; //下降沿有效,進(jìn)行讀取數(shù)據(jù)
- buff<<=1; //將下面儲存的低位數(shù)據(jù)向右移
- buff|=DIO; //將輸出數(shù)據(jù)DIO通過或運(yùn)算儲存在buff最低位
- }
- CS=1; //測量完畢,將CS拉高,片選無效
- return buff;
- }
- //***************************
- //*******串口初始化程序******
- //***************************
- void UartInit(void) //串行口初始化
- {
- SCON=0x50; //8位數(shù)據(jù),可變波特率
- TMOD=0x20; //設(shè)定定時器1為16位自動重裝方式
- TL1=0xFD; //設(shè)定定時初值
- TH1=0xFD; //設(shè)定定時初值
- ET1=0; //禁止定時器1中斷
- TR1=1; //啟動定時器1
- }
- //***************************
- //*******主程序**************
- //***************************
- void main()
- {
- unsigned int buff,ge,shi,bai; //緩存數(shù)據(jù)定義
- UartInit(); //串口初始化
- while(1) //死循環(huán)
- { //主函數(shù)程序開始
- buff=ADC0832()*100; //讀取AD的值,并進(jìn)行修正
- buff=buff/51; //精度修正,轉(zhuǎn)換為000~500范圍
- bai=buff/100; //保存buff的百位
- shi=(buff%100)/10; //保存buff的十位
- ge=buff%10; //保存buff的個位
- //數(shù)碼管顯示程序
- if(KEY==1) //如果KEY為1,量程設(shè)為0~5V
- {
- S_1=0; //選通第一位數(shù)碼管,顯示第一位數(shù)
- P0=table[0]; //P0口輸出8位數(shù)據(jù)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_1=1; //關(guān)閉第一位數(shù)碼管
- S_2=0; //選通第二位數(shù)碼管,顯示第二位數(shù)
- P0=table[bai]&0x7f; //P0口輸出8位數(shù)據(jù),因?yàn)榱砍虨闉?~5V,所以第一位后顯示小數(shù)點(diǎn)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_2=1; //關(guān)閉第二位數(shù)碼管
- S_3=0; //選通第三位數(shù)碼管,顯示第三位數(shù)
- P0=table[shi]; //P0口輸出8位數(shù)據(jù)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_3=1; //關(guān)閉第三位數(shù)碼管
- S_4=0; //選通第四位數(shù)碼管,顯示第四位數(shù)
- P0=table[ge]; //P0口輸出8位數(shù)據(jù)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_4=1; //關(guān)閉第四位數(shù)碼管
- //串口發(fā)送程序
- TI=1; //TI置一,開始發(fā)送數(shù)據(jù)
- printf("%d.%d%d\n",bai,shi,ge);
- //將buff/100后發(fā)出
- while(!TI); //直到數(shù)據(jù)發(fā)送完畢
- TI=0; //數(shù)據(jù)發(fā)送完畢后,TI置〇
- }
- else //如果KEY為1,量程設(shè)為0~50V
- {
- S_1=0; //選通第一位數(shù)碼管,顯示第一位數(shù)
- P0=table[0]; //P0口輸出8位數(shù)據(jù)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_1=1; //關(guān)閉第一位數(shù)碼管
- S_2=0; //選通第二位數(shù)碼管,顯示第二位數(shù)
- P0=table[bai]; //P0口輸出8位數(shù)據(jù)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_2=1; //關(guān)閉第二位數(shù)碼管
- S_3=0; //選通第三位數(shù)碼管,顯示第三位數(shù)
- P0=table[shi]&0x7f; //P0口輸出8位數(shù)據(jù),因?yàn)榱砍虨闉?~50V,所以第二位后顯示小數(shù)點(diǎn)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_3=1; //關(guān)閉第三位數(shù)碼管
- S_4=0; //選通第四位數(shù)碼管,顯示第四位數(shù)
- P0=table[ge]; //P0口輸出8位數(shù)據(jù)
- delay_1000us(); //短暫延時
- P0=0xff; //數(shù)碼管消隱
- S_4=1; //關(guān)閉第四位數(shù)碼管
- //串口發(fā)送程序
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
資料51hei附件下載:
仿真程序文檔.7z
(1.18 MB, 下載次數(shù): 196)
2022-5-8 19:12 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: 花少廣 時間: 2018-9-13 20:38
666,很強(qiáng)。
作者: 槿年兒 時間: 2019-1-7 15:35
好好學(xué)習(xí)一下
作者: lao4jiadian 時間: 2019-1-8 12:23
好好學(xué)習(xí),天天向上。謝謝樓主提供
作者: 8--- 時間: 2020-5-17 20:33
很厲害
作者: gu1668610939 時間: 2020-6-8 22:59
這個串口是怎么弄的,我怎么點(diǎn)不開
作者: liu188 時間: 2022-5-8 16:07
是因?yàn)槲业陌姹咎狭藛幔课业膸炖锖枚鄸|西找不到
作者: heicad 時間: 2022-5-8 19:14
用Proteus8.8即可 你看
-
51hei.gif
(46.75 KB, 下載次數(shù): 89)
下載附件
2022-5-8 19:13 上傳
作者: hungyu72 時間: 2025-1-11 18:33
好好學(xué)習(xí)一下!
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
神马午夜视频
|
精品视频免费在线观看
|
91片黄在线观看
|
精品一区二区三区三区
|
欧美亚洲国产精品
|
在线不卡一区二区
|
色老板免费视频
|
99视频免费在线观看
|
99精品视频在线观看
|
一区二区三区视频
|
国产色在线
|
国产精品视频网
|
黄色片视频网站
|
国产黄色片在线观看
|
日韩一级黄色片
|
青青草网站
|
欧美在线视频一区
|
欧美九九九
|
第一福利丝瓜av导航
|
亚洲视频国产
|
国产麻豆91|
亚洲国产免费
|
欧美精品在线视频
|
日韩精品一区在线观看
|
www.黄视频
|
色婷婷久久
|
老司机免费福利视频
|
国产一区欧美
|
日韩综合在线
|
男女裸体无遮挡做爰
|
国产999久久久
|
91av在线看|
97久久精品人人澡人人爽
|
国产午夜精品一区二区三区四区
|
俺去俺来也在线www色官网
|
天天爽|
欧美日韩一二三区
|
国产精品入口66mio男同
|
男人天堂网在线
|
色综合久久久久
|
日韩精品第一页
|