|
《單片機(jī)原理及應(yīng)用課程設(shè)計(jì)》報(bào)告
設(shè)計(jì)題目: 電子秤設(shè)計(jì)
專 業(yè):
班 級:
姓 名:
學(xué) 號:
起迄日期: 2017年5月26日2017年6月29日
指導(dǎo)教師:
系(室)主任:
目錄
1 引言..............................................................1
2 設(shè)計(jì)的任務(wù)與要求..................................................1
3 總體方案設(shè)計(jì)......................................................2
3.1 系統(tǒng)總體方案設(shè)計(jì)與論證..........................................2
3.2 硬件的方案設(shè)計(jì)與選型............................................2
3.2.1 壓力傳感器....................................................2
3.2.2 放大器和A/D轉(zhuǎn)換..............................................4
3.2.3 顯示模塊......................................................5
4 硬件電路設(shè)計(jì)....................................................5
4.1 基于51單片機(jī)的主控電路.........................................5
4.1.1 硬件框圖......................................................5
4.1.2 整體電路圖....................................................5
4.2 壓力傳感器電路..................................................6
4.3 A/D轉(zhuǎn)化電路.....................................................7
4.4 顯示電路........................................................8
4.5 晶振電路和復(fù)位電路..............................................9
5 軟件系統(tǒng)設(shè)計(jì)...................................................10
5.1 主程序流程圖...................................................10
5.2 AD轉(zhuǎn)換子程序流程圖.............................................11
5.3 顯示子程序流程圖...............................................11
6 仿真測試.........................................................12
7 總結(jié).............................................................14
8 參考文獻(xiàn).........................................................15
9 程序清單.........................................................16
1 引言
電子秤的發(fā)展過程與其它事物一樣,也經(jīng)歷了由簡單到復(fù)雜,由粗糙到精密、由機(jī)械到機(jī)電結(jié)合再到全電子化、由單一功能到多功能的過程。特別是近30年以來,工藝流程中的現(xiàn)場稱重、配料定量稱重、以及產(chǎn)品質(zhì)量的監(jiān)測等工作,都離不開能輸出電信號的電子衡器。這是由于電子衡器不僅能給出質(zhì)量或重量信號,而且也能作為總系統(tǒng)中的一個(gè)單元承擔(dān)著控制和檢驗(yàn)功能,從而推進(jìn)工業(yè)生產(chǎn)和貿(mào)易交往的自動化和合理化。
經(jīng)過40多年的不斷改進(jìn)與完善,我國電子衡器從最初的機(jī)電結(jié)合型發(fā)展到現(xiàn)在的全電子型和數(shù)字智能型。現(xiàn)今電子衡器制造技術(shù)及應(yīng)用得到了新發(fā)展。電子稱重技術(shù)從靜態(tài)稱重向動態(tài)稱重發(fā)展:計(jì)量方法從模擬測量向數(shù)字測量發(fā)展;測量特點(diǎn)從單參數(shù)測量向多參數(shù)測量發(fā)展,特別是對快速稱重和動態(tài)稱重的研究與應(yīng)用。通過分析近年來電子衡器產(chǎn)品的發(fā)展情況及國內(nèi)外市場的需求,電子衡器總的發(fā)展趨勢是小型化、模塊化、集成化、智能化;其技術(shù)性能趨向是速率高、準(zhǔn)確度高、穩(wěn)定性高、可靠性高;其功能趨向是稱重計(jì)量的控制信息和非控制信息并重的“智能化”功能;其應(yīng)用性能趨向于綜合性和組合性。電子秤是電了衡器中的一種,衡器是國家法定計(jì)量器具,是圍計(jì)民生、國防建設(shè)、科學(xué)研究、內(nèi)外貿(mào)易不可缺少的計(jì)量設(shè)備,衡器產(chǎn)品技術(shù)水平的高低,將直接影響各行各業(yè)的現(xiàn)代化水平和社會經(jīng)濟(jì)效益的提高。
單片機(jī)以其功能強(qiáng),體積小,功耗低,易開發(fā)等很多優(yōu)勢被廣泛應(yīng)用。但單片機(jī)不是萬能的,也存在不適合的場合,我們要充分利用單片機(jī)的內(nèi)部資源和選擇合適的單片機(jī)來完成我們的設(shè)計(jì)。本數(shù)字電子秤的設(shè)計(jì)過程中需要用到A/D轉(zhuǎn)換、液晶顯示、復(fù)位電路的知識,同時(shí)在軟件的設(shè)計(jì)過程中需要用到液晶顯示驅(qū)動、模數(shù)轉(zhuǎn)換程序的設(shè)計(jì),可以很好的將數(shù)電、模電、單片機(jī)知識進(jìn)行綜合應(yīng)用。在綜合應(yīng)用中進(jìn)一步熟悉單片機(jī)設(shè)計(jì)的開發(fā)各個(gè)流程,最終達(dá)到"鞏固基礎(chǔ)、注重設(shè)計(jì)、培養(yǎng)技能、追求創(chuàng)新、走向?qū)嵱?quot;的目的。
2 設(shè)計(jì)的任務(wù)與要求
本課程設(shè)計(jì)基于51單片機(jī)設(shè)計(jì)一個(gè)電子秤,該電子秤能完成稱重和顯示所稱的重量,是一種小型化的電子稱量儀器。當(dāng)被稱物體放置在秤體的秤臺上時(shí),其重量便通過秤體傳遞到稱重傳感器,傳感器隨之產(chǎn)生力電阻應(yīng)變效應(yīng),將物體的重量轉(zhuǎn)換成與被稱物體重量成一定函數(shù)關(guān)系(一般成正比關(guān)系)的電信號(電壓或電流等)。此信號由放大電路進(jìn)行放大、經(jīng)濾波后再由模/數(shù)( A/D)器進(jìn)行轉(zhuǎn)換,數(shù)字信號再送到微處器的CPU處理。運(yùn)算結(jié)果送到內(nèi)存貯器,需要顯示時(shí),CPU發(fā)出指令,從內(nèi)存貯器中讀出送到顯示器顯示。
設(shè)計(jì)要求如下:1、利用壓力傳感器檢測重量信號,經(jīng)放大和A/D轉(zhuǎn)換,并經(jīng)單片機(jī)處理后在LED上顯示出被稱重量值。2、最小顯示單位為1克。
3 總體方案設(shè)計(jì)
3.1 系統(tǒng)總體方案設(shè)計(jì)與論證
根據(jù)電子秤的工作原理可以將電子秤大致能劃分為三大部分,數(shù)據(jù)采集模塊、控制器模塊和人機(jī)交互界面模塊。圖3.1為系統(tǒng)的整體框圖。
數(shù)據(jù)采集模塊由壓力傳感器、信號的前級處理和A/D轉(zhuǎn)換部分組成。測量過程中把被測物體的重量通過傳感器將重量信號轉(zhuǎn)化為電壓信號輸出。信號的前級處理將來自傳感器的微弱信號進(jìn)行濾波和放大,放大后的電壓信號經(jīng)過模數(shù)轉(zhuǎn)換把模擬量轉(zhuǎn)換成數(shù)字量。
控制器模塊將數(shù)據(jù)采集模塊傳來的數(shù)字信號進(jìn)行處理,完成被測物體重量的判斷、顯示等功能。此部分對軟件的設(shè)計(jì)要求比較高,系統(tǒng)的大部分功能都需要軟件來控制。
人機(jī)交互界面模塊主要由顯示器組成。顯示器采用LCD液晶顯示器,可以直觀的顯示物品的重量。
圖3.1系統(tǒng)整體框圖
3.2 硬件的方案設(shè)計(jì)與選型
3.2.1 壓力傳感器
壓力傳感器是電子秤中最主要的一個(gè)元器件。因?yàn)樗P(guān)乎著電子秤的量程、精度等性能。市場上使用和出售的電子秤主要使用的壓力傳感器有電容式、電阻應(yīng)變式和壓電式壓力傳感器等。在稱重傳感器的選型時(shí)應(yīng)該充分考慮其精度、靈敏度、穩(wěn)定性、安全等級、安裝環(huán)境是不是滿足設(shè)計(jì)的要求。再在其中選擇最適合設(shè)計(jì)要求的型號。以下是三種稱重傳感器的比較:
(1)電容式壓力傳感器是把金屬薄膜和一個(gè)固定的電極形成一個(gè)類似電容的結(jié)構(gòu),當(dāng)承受重量時(shí),金屬彈性元件將發(fā)生微小的位移,從而引起電容內(nèi)部的電容量的變化,用外部測量電路得到變化量從而求得重量。這種傳感器的精度和靈敏度高但其壽命一般只有幾年,而且不穩(wěn)定,容易受到外界非人為因素的干擾。
(2)壓電式壓力傳感器時(shí)利用正壓電效應(yīng)制成的,當(dāng)內(nèi)部晶體受到壓力時(shí),內(nèi)部將產(chǎn)生正、負(fù)電荷的相對位移,使晶體的兩端生成不同極性(正極、負(fù)極)的電荷,其密集程度與測量的重量相對應(yīng),從而進(jìn)行測量。這種傳感器不但穩(wěn)定性好而且精度和靈敏度都很高,但是它的缺點(diǎn)是量程小,不能用于大噸位的測量,一般使用于醫(yī)療器械上。
(3)電阻應(yīng)變片式壓力傳感器的原理是黏有電阻應(yīng)變片的彈性元件(一般為金屬)受到重物或者外力而發(fā)生微小形變時(shí)導(dǎo)致電阻值發(fā)生改變,從而用于測量重力。這種傳感器的穩(wěn)定性非常好,可以在比較差的環(huán)境中使用,而且其精度和準(zhǔn)確度也不低。
基于精度、成本等要求,我最終選擇HL-8型的電阻應(yīng)變片式傳感器。
表3.2 傳感器技術(shù)參數(shù)
根據(jù)上表得出HL-8型3KG電阻應(yīng)變片式傳感器的精度3Kg*0.05%=1.5g。
由于使用的是4.5V供電電壓,所以滿量程輸出電壓=4.5V*1mV/V=4.5mV也就是當(dāng)稱重重量為0~3Kg時(shí),對應(yīng)的輸出電壓為0~4.5mV,是一種線性的對應(yīng)關(guān)系。
電阻應(yīng)變片式壓力傳感器是由一塊貼有電阻應(yīng)變片的金屬彈塊和電線成,其內(nèi)部使用的一般是惠更斯電橋。當(dāng)受到所稱量的重物時(shí),金屬彈性塊就會帶動電阻式應(yīng)變片發(fā)生微小的形變,使得貼在上面的電阻式應(yīng)變片R1、R4受到壓力彎曲拉伸,阻值增加;R2、R3被壓縮,阻止減小,從而使電橋失去平衡,產(chǎn)生差動電壓信號,電壓信號與作用在傳感器上的P的大小成正比,將重物的壓力轉(zhuǎn)換成相應(yīng)的電。壓信號輸出,供單片機(jī)進(jìn)行處理。其工作原理圖如下圖所示:
圖3.2 壓力傳感器工作原理
3.2.2 放大器和A/D轉(zhuǎn)換
由于傳感器輸出的電壓很小一般只有幾毫伏,即使通過電橋電路轉(zhuǎn)換后的信號還是不夠被單片機(jī)控制。所以一般都需要放大模塊來放大信號和對信號進(jìn)行A/D轉(zhuǎn)換,轉(zhuǎn)換成數(shù)字信息送入控制器,在控制器的控制下,對數(shù)據(jù)進(jìn)行基本運(yùn)算和邏輯判斷。
方案一:使用差分比例運(yùn)放電路
使用運(yùn)放搭建一個(gè)差分比例運(yùn)放電路,對微小的電壓信號進(jìn)行放大。并需要在后面加一個(gè)A/D轉(zhuǎn)換模塊,把經(jīng)放大器放大后的模擬信號轉(zhuǎn)換為數(shù)字信號,送入單片機(jī)。但是一般的運(yùn)放放大效果不是很好且抗干擾能力較弱,還有電路設(shè)計(jì)比較復(fù)雜。
方案二:使用HX711A/D轉(zhuǎn)換模塊對信號進(jìn)行放大和轉(zhuǎn)換
HX711是一款專為高精度稱重傳感器而設(shè)計(jì)的24位A/D轉(zhuǎn)換器芯片。與同類型其它芯片相比,該芯片集成了包括穩(wěn)壓電源、片內(nèi)時(shí)鐘振蕩器等其它同類型芯片所需要的外圍電路,具有集成度高、響應(yīng)速度快、抗干擾性強(qiáng)等優(yōu)點(diǎn)。降低了電子秤的整機(jī)成本,提高了整機(jī)的性能和可靠性。芯片內(nèi)提供的穩(wěn)壓電源可以直接向外部傳感器和芯片內(nèi)的A/D轉(zhuǎn)換器提供電源,系統(tǒng)板上無需另外的模擬電源。HX711A/D與AT89C51單片機(jī)的接線也比較簡單,可以使用IO口驅(qū)動控制信號,不需再對內(nèi)部的寄存器進(jìn)行編程,使得程序部分更加簡潔。
HX711A/D轉(zhuǎn)換模塊特點(diǎn):
(1)兩路可選擇差分輸入
(2)片內(nèi)低噪聲可編程放大器,可選增益為64 和128
(3)片內(nèi)穩(wěn)壓電路可直接向外部傳感器和芯片內(nèi)A/D 轉(zhuǎn)換器提供電源
(4)片內(nèi)時(shí)鐘振蕩器無需任何外接器件,必要時(shí)也可使用外接晶振時(shí)鐘或上電自動復(fù)位電路
(5)簡單的數(shù)字控制和串口通訊:所有控制由管腳輸入,芯片內(nèi)寄存器無需編程
(6)可選擇10Hz 或80Hz 的輸出數(shù)據(jù)速率
(7)同步抑制50Hz 和60Hz 的電源干擾
(8)耗電量(含穩(wěn)壓電源電路):典型工作電流:<1.7mA, 斷電電流:<1μA
(9)工作電壓范圍:2.6 ~ 5.5V
(10)工作溫度范圍:-20 ~ +85℃
(11)16 管腳的SOP-16 封裝
在程序中選用了128的放大倍數(shù),當(dāng)輸出電壓為滿量程電壓4.5mV時(shí),放大后的電壓為576mV,進(jìn)過AD轉(zhuǎn)換后輸出的24bit的數(shù)字值576mV*2^24/4.5V≈2147484。
3.2.3 顯示模塊
方案一:LED數(shù)碼管顯示
優(yōu)點(diǎn):體積小,能耗低,結(jié)構(gòu)簡單。
缺點(diǎn):接線較多會使電路變復(fù)雜,顯示內(nèi)容少。
方案二:LCD1602液晶顯示屏
優(yōu)點(diǎn):線路簡單,顯示內(nèi)容較多,單片機(jī)可以直接驅(qū)動
由于電子秤設(shè)計(jì)的顯示模塊需要顯示多位數(shù)字和字母,如果采用數(shù)碼管顯示的話會占用多個(gè)單片機(jī)I/O口,使電路變得更為復(fù)雜不美觀。而且本課設(shè)只需要顯示字母和數(shù)字,所以選LCD1602符合全部條件,能夠被使用。
4 硬件電路設(shè)計(jì)
4.1 基于51單片機(jī)的主控電路
4.1.1 硬件框圖
圖4.1 總體硬件框圖
當(dāng)壓力傳感器受到不同重量的壓力后,會產(chǎn)生不同大小的微弱電壓信號,電壓信號經(jīng)過HX711模塊放大128倍和轉(zhuǎn)換為數(shù)字信號后被送入單片機(jī),再經(jīng)過計(jì)算和處理后再在液晶顯示所稱重量。
4.1.2 整體電路圖
圖4.2整體電路圖
因?yàn)閜rotues元件庫里沒有應(yīng)變片式壓力傳感器和HX711A/D模塊,所以我用兩個(gè)滑動變阻器代替4個(gè)橋臂,靠改變滑動變阻器的阻值來模擬傳感器受力形變后阻值的改變,電壓信號再經(jīng)ADC0832轉(zhuǎn)換成數(shù)字信號傳給單片機(jī)。
4.2 壓力傳感器電路
圖4.3實(shí)際應(yīng)變片式壓力傳感器電路圖
電橋的四個(gè)橋臂上接工作應(yīng)變片,都參與機(jī)械形變,同處一個(gè)溫度場,溫度影響互相抵消,電壓輸出靈敏度高。當(dāng)4個(gè)應(yīng)變片的材料、阻值都相同時(shí),可以推導(dǎo)出以下公式:
(4.2)
因?yàn)閜rotues元件庫里沒有應(yīng)變片式壓力傳感器,所以我用兩個(gè)滑動變阻器代替4個(gè)橋臂,靠改變滑動變阻器的阻值來模擬傳感器受力形變后阻值的改變,經(jīng)過電橋轉(zhuǎn)換成電壓信號。
圖4.4 仿真壓力傳感器電路圖
4.3 A/D轉(zhuǎn)換電路
圖4.5 實(shí)際HX711A/D轉(zhuǎn)換電路模塊
串口通訊線由管腳PD_SCK和DOUT組成,用來輸出數(shù)據(jù),選擇輸入通道和增益。當(dāng)數(shù)據(jù)輸出管腳DOUT為高電平時(shí),表明A/D轉(zhuǎn)換器還未準(zhǔn)備好輸出數(shù)據(jù),此時(shí)串口時(shí)鐘輸入信號PD_SCK應(yīng)為低電平。當(dāng)DOUT從高電平變低電平后,PD_SCK應(yīng)輸入25至27個(gè)不等的時(shí)鐘脈沖。其中第一個(gè)時(shí)鐘脈沖的上升沿將讀出輸出24位數(shù)據(jù)的最高位(MSB),直至第24個(gè)時(shí)鐘脈沖完成,24位輸出數(shù)據(jù)從最高位至最低位逐位輸出完成。
因?yàn)閜rotues元件庫里沒有HX711A/D模塊,所以我用ADC0832代替,經(jīng)過電橋轉(zhuǎn)換的電壓信號經(jīng)ADC0832轉(zhuǎn)換成數(shù)字信號傳給單片機(jī)。
圖4.6 仿真AD轉(zhuǎn)換電路
4.4 顯示電路
LCD1602液晶顯示模塊的引腳連線如圖。其中第1、2、3腳為電源;液晶的控制口RS、RW和使能端EN分別接單片機(jī)的P2.0、P2.1、P2.2,用于對狀態(tài)的輸入;數(shù)據(jù)口D0到D7接單片機(jī)的P0.0-P0.7口用于數(shù)據(jù)傳輸,由于單片機(jī)P0沒有上拉電阻,所以再再P0口接一個(gè)10K的排阻RP1。
圖4.7 LCD1602液晶顯示模塊電路
4.5 晶振電路和復(fù)位電路
晶振采用 12MHz。復(fù)位電路采用上電加按鈕復(fù)位。
晶振電路:
圖4.5.1晶振電路
復(fù)位電路:
圖4.8 復(fù)位電路
5 軟件系統(tǒng)設(shè)計(jì)
5.1 主程序流程圖
主程序的功能是調(diào)用子程序和對系統(tǒng)進(jìn)行初始化,本課設(shè)主程序調(diào)用各種子程序來實(shí)現(xiàn)電子秤每半秒進(jìn)行一次稱重的功能,主程序流程圖如下圖所示:
圖5.1主程序流程圖
5.2 A/D轉(zhuǎn)換子程序流程圖
首先,單片機(jī)選A/D轉(zhuǎn)換器,然后發(fā)出信號啟動A/D轉(zhuǎn)換進(jìn)行信號采集,對A/D轉(zhuǎn)換器的數(shù)據(jù)輸出口送來的數(shù)據(jù)進(jìn)行存儲。
圖5.2 AD轉(zhuǎn)換程序流程圖
5.3 顯示子程序流程圖
LCD顯示子程序的設(shè)計(jì)一般要先確定LCD的初始化、光標(biāo)定位、確定顯示字符以及字符串。
圖5.3 顯示子程序流程圖
6 仿真測試
壓力傳感器輸出0V時(shí)電子秤所能稱量的最小重量:0.019Kg
圖6.1 電子秤最小重量仿真圖
壓力傳感器輸出1V時(shí)電子秤顯示的重量:0.996Kg
圖6.2 壓力傳感器輸出1V時(shí)的仿真圖
壓力傳感器輸出3V時(shí)電子秤顯示的重量:2.988Kg
圖6.3 壓力傳感器輸出3V時(shí)的仿真圖
壓力傳感器輸出5V時(shí)電子秤顯示滿量程的重量:4.980Kg
圖6.4 壓力傳感器輸出5V時(shí)的仿真圖
表6.1 傳感器輸出電壓與重量關(guān)系
表6.1是仿真測試時(shí)得出的實(shí)驗(yàn)數(shù)據(jù),從表6.1可以看出傳感器輸出電壓與重量之間是線性關(guān)系,從實(shí)驗(yàn)效果上驗(yàn)證仿真是成功的。
7 總結(jié)
本次課程設(shè)計(jì)做的電子秤,主要利用了AT89C51單片機(jī)、HL-8型電阻應(yīng)變片式稱重傳感器以及HX711A/D轉(zhuǎn)換模型,LCD1602顯示模塊,通過C語言編程來實(shí)現(xiàn)電子秤的顯示與控制。本次設(shè)計(jì)完成了稱重,顯示重量功能,精度達(dá)到要求的1g。剛開始的時(shí)候還在糾結(jié)是用LED數(shù)碼管還是用LCD1602液晶顯示屏,因?yàn)長CD1602的編程沒學(xué)過,而且初始化等程序較多。但后來發(fā)現(xiàn)其實(shí)LCD1602的程序都是模塊化的程序并且能查到每個(gè)模塊程序具體怎么樣使用,所以后來果斷選擇LCD1602來顯示電子秤所秤的重量。
因?yàn)榈谝淮斡脝纹瑱C(jī)做課程設(shè)計(jì)在這之前只在單片機(jī)實(shí)驗(yàn)室用過。以前做仿真用的是Multisim,但Multisim不能仿真單片機(jī)課設(shè),所以自學(xué)了Protues的仿真過程。Protues仿真器真的很強(qiáng)大,可以和Keil聯(lián)調(diào),看來Multisim落伍了。本次課程設(shè)計(jì)使用Keil編寫程序,因?yàn)榇笕蠈W(xué)期在做試驗(yàn)時(shí)學(xué)過怎么使用Keil,所以對于怎么使用Keil并沒有什么問題。因?yàn)镻rotues元件庫里沒有應(yīng)變片式壓力傳感器和HX711A/D模塊,所以一開始不知道要怎么做仿真,后來在網(wǎng)上查資料后發(fā)現(xiàn)可以用兩個(gè)滑動變阻器代替應(yīng)變片式壓力傳感器,再用ADC0832代替HX711A/D模塊。用Keil編寫完程序后就生成HEX文件然后在Protues中把程序?qū)?1單片機(jī)中,調(diào)試時(shí)發(fā)現(xiàn)結(jié)果是什么文件打不開導(dǎo)致仿真出錯(cuò),只好求助萬能的百度,之后設(shè)置了以下電腦屬性里的變量才終于仿真成功了。
通過本次課程設(shè)計(jì),從電路原理圖的設(shè)計(jì)到編程調(diào)試,讓我仔細(xì)的回顧了大學(xué)三年的學(xué)習(xí)知識,包括單片機(jī)、模電、數(shù)電、電工實(shí)習(xí)的重要基礎(chǔ)課程,相信在以后還會用到這些知識。同時(shí)這次課程設(shè)計(jì)還有一些不足之處,比如,精度還差一點(diǎn),規(guī)定是1g,但是結(jié)果只有1.5g。
8 參考文獻(xiàn)
[1]曹巧媛主編. 單片機(jī)原理及應(yīng)用(第二版). 北京:電子工業(yè)出版社,2002
[2]譚浩強(qiáng)著.C程序設(shè)計(jì).北京:清華大學(xué)出版社,2007;
[3]李朝青 單片機(jī)原理及接口技術(shù)(第3版)北京航空航天大學(xué)出版社 2005
[4]程林 超省電型電子秤的設(shè)計(jì)方案[J].福建:福建省科學(xué)技術(shù)研究,2008.
[5]程飛 基于AT89C2051單片機(jī)的電子稱設(shè)計(jì)[J].電腦知識與技術(shù),2009.
[6]張景元 李業(yè)德 一種基于單片機(jī)的多功能電子稱[J].微計(jì)算機(jī)信息,2006.
[7]何立民 單片機(jī)高級教材[M].北京:航空航天大學(xué)出版社,2000
[8]姜志海等. 單片機(jī)的C語言程序設(shè)計(jì)與應(yīng)用(第3版).電子工業(yè)出版社,2015.
9 程序清單
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0x80 //常量定義
#define DATAPORT P0 //單片機(jī)P0口定義
//ADC0832的引腳
sbit ADCS =P3^5; //ADC0832片選信號
sbit ADDI =P3^7; //ADC0832數(shù)據(jù)信號輸入,選擇通道控制
sbit ADDO =P3^7; //ADC0832數(shù)據(jù)信號輸出,轉(zhuǎn)換數(shù)據(jù)輸出
sbit ADCLK =P3^6; //ADC0832芯片時(shí)鐘輸入
sbit LCM_RS=P2^0; //寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器
sbit LCM_RW=P2^1; //讀寫信號線,高電平1時(shí)進(jìn)行讀操作,低電平1時(shí)進(jìn)行寫操作
sbit LCM_EN=P2^2; //使能端,高電平1時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令
uchar ad_data; // //adc采樣值存儲單元
char press_data; //標(biāo)度變換存儲單元
unsigned char press_ge=0; //顯示值百位
unsigned char press_shifen=0; //顯示值十位
unsigned char press_baifen=0; //顯示值個(gè)位
unsigned char press_qianfen=0; //顯示值十分位
uchar code str0[]={"Weight: . Kg "}; //要顯示的內(nèi)容
void delay(uint);
void lcd_wait(void);
void delay_LCM(uint); //LCD延時(shí)子程序
void initLCM( void); //LCD初始化子程序
void lcd_wait(void); //LCD檢測忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //寫指令到ICM子函數(shù)
void WriteDataLCM(uchar WDLCM); //寫數(shù)據(jù)到LCM子函數(shù)
void DisplayOneChar(uchar X,uchar Y, uchar code*DData); //顯示指定坐標(biāo)的一個(gè)字符子函數(shù)
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標(biāo)的一串字符子函數(shù)
void display(void); //系統(tǒng)顯示子函數(shù)
uchar Adc0832(unsigned char channel); //AD轉(zhuǎn)換子函數(shù)
void data_pro(void); //采樣值標(biāo)度變換子函數(shù)
/**********main funcation************/
void main(void)
{
delay(500); //系統(tǒng)延時(shí)500ms啟動
ad_data=0; //采樣值存儲單元初始化為0
initLCM( ); //初始化LCD1602
WriteCommandLCM(0x01,1); //清顯示屏
DisplayListChar(0,0,str0); //顯示"Weight: . Kg "
while(1)
{
ad_data =Adc0832(0); //采樣值存儲單元初始化為0
data_pro(); //采樣值標(biāo)度變換
display(); //顯示重量
}
}
/*********延時(shí)K*1ms,12.000mhz**********/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++)
{;}
}
}
/**********寫指令到ICM子函數(shù)************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM; //P0口輸出高位
LCM_RS=0; // 選中指令寄存器
LCM_RW=0; // 寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/**********寫數(shù)據(jù)到LCM子函數(shù)************/
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //檢測忙信號
DATAPORT=WDLCM;
LCM_RS=1; // 選中數(shù)據(jù)寄存器
LCM_RW=0; // 寫模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********lcm內(nèi)部等待函數(shù)*************/
void lcd_wait(void)
{
DATAPORT=0xff; //讀LCD前若單片機(jī)輸出低電平,而讀出LCD為高電平,則沖突,Proteus仿真會有顯示邏輯黃色
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
_nop_();
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/**********LCM初始化子函數(shù)***********/
void initLCM( )
{
DATAPORT=0;
delay(15);
WriteCommandLCM(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,0);
delay(5);
WriteCommandLCM(0x38,1);//8bit數(shù)據(jù)傳送2行顯示,5*7字型檢測忙信號
WriteCommandLCM(0x08,1); //關(guān)閉顯示,檢測忙信號
WriteCommandLCM(0x01,1); //清屏,檢測忙信號
WriteCommandLCM(0x06,1); //顯示光標(biāo)右移設(shè)置,檢測忙信號
WriteCommandLCM(0x0c,1);//顯示屏打開光標(biāo)不顯示,不閃爍,檢測忙信號
}
/****顯示指定坐標(biāo)的一個(gè)字符子函數(shù)****/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=0x01;
X&=0x0f;
if(Y)X|=0x40; //若y為1(顯示第二行),地址碼+0X40
X|=0x80; //指令碼為地址碼+0X80
WriteCommandLCM(X,1);
WriteDataLCM(DData);
}
/*******顯示指定坐標(biāo)的一串字符子函數(shù)*****/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
/*****************系統(tǒng)顯示子函數(shù)*****************/
void display(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開光標(biāo)不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0); //顯示"Weight: . Kg "
DisplayOneChar(8,0,press_ge+0x30); //顯示值百位
DisplayOneChar(10,0,press_shifen+0x30); //顯示值十位
DisplayOneChar(11,0,press_baifen+0x30); //顯示值個(gè)位
DisplayOneChar(12,0,press_qianfen+0x30); //顯示值十分位
delay(1000); //穩(wěn)定顯示
}
/************讀ADC0832函數(shù)************/
uchar Adc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令結(jié)束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收數(shù)據(jù)
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次時(shí)鐘脈沖
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO; //收數(shù)據(jù)
ADCLK=1;
_nop_();
_nop_();
ADCLK=0; //形成一次時(shí)鐘脈沖
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
dat<<=8;
dat|=ndat;
return(dat); //采樣值A(chǔ)D轉(zhuǎn)換后返回
}
/*********采樣值放大子程序********/
void data_pro(void)
{
unsigned int temp;
float press;
if(0<ad_data<256) //當(dāng)壓力值介于0到5之間時(shí),遵循線性變換
{
int vary=ad_data;
press=(0.0195312*vary);
temp=(int)(press*1000); //放大1000倍,便于后面的計(jì)算
press_ge=temp/1000; //取壓力值百位
press_shifen=(temp%1000)/100; //取壓力值十位
press_baifen=((temp%1000)%100)/10; //取壓力值個(gè)位
press_qianfen=((temp%1000)%100)%10; //取壓力值十分位
}
}
|
|