c51做的電壓表,可切換量程,數(shù)據(jù)發(fā)送到上位機(jī)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
下面是多量程電壓表的設(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ī)源程序如下: - /***************** 多量程電壓表*********************/
- /******** 作者:孫瑋 學(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)擊文件名下載附件
|