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