|
基于51單片機(jī)的稱(chēng)重系統(tǒng) 一 動(dòng)態(tài)稱(chēng)重所謂動(dòng)態(tài)稱(chēng)重是指通過(guò)分析和測(cè)量車(chē)胎運(yùn)動(dòng)中的力,來(lái)計(jì)算該運(yùn)動(dòng)車(chē)輛的總重量、軸重、輪重和部分重量數(shù)據(jù)的過(guò)程。動(dòng)態(tài)稱(chēng)重系統(tǒng)按經(jīng)過(guò)車(chē)輛行駛的速度劃分,可分為低速動(dòng)態(tài)稱(chēng)重系統(tǒng)與高速動(dòng)態(tài)稱(chēng)重系統(tǒng)。因?yàn)槲覈?guó)高速公路的限速最高是120,所以高速動(dòng)態(tài)稱(chēng)重系統(tǒng)在理論上可對(duì)5到120之間時(shí)速通過(guò)稱(chēng)量裝置的車(chē)輛進(jìn)行動(dòng)態(tài)稱(chēng)重。而低速動(dòng)態(tài)稱(chēng)重系統(tǒng)則一定要限制通過(guò)車(chē)輛的行駛速度,要想有較高的測(cè)量精度,理論要求車(chē)輛在5km/h以下時(shí)速勻速通過(guò)。在我國(guó),車(chē)輛動(dòng)態(tài)稱(chēng)重一般都使用低速動(dòng)態(tài)稱(chēng)重來(lái)完成,在很多收費(fèi)站和車(chē)輛檢測(cè)站都有應(yīng)用,國(guó)家也出臺(tái)了相關(guān)的測(cè)量標(biāo)準(zhǔn)。 與傳統(tǒng)意義上的靜態(tài)稱(chēng)重相比,動(dòng)態(tài)稱(chēng)重可以在車(chē)輛緩慢運(yùn)動(dòng)情況下直接進(jìn)行稱(chēng)重,這樣動(dòng)態(tài)稱(chēng)重的高效率、測(cè)量時(shí)間短、能流暢交通等主要特點(diǎn)就凸顯出來(lái)了。動(dòng)態(tài)稱(chēng)重的問(wèn)世,不但使車(chē)輛的管理上有了很大的促進(jìn)作用,而且還對(duì)我國(guó)的公路管理和維護(hù)起到了至關(guān)重要的作用。 二 系統(tǒng)總體結(jié)構(gòu)及其功能設(shè)計(jì)總體結(jié)構(gòu)是以51單片機(jī)為處理器的系統(tǒng),如圖3.1所示。 圖 3.1 本設(shè)計(jì)要求能判斷出車(chē)輛是否超載,如果車(chē)輛超載,本系統(tǒng)能夠提供該車(chē)輛的超載信息并發(fā)出警報(bào)。本設(shè)計(jì)采用STC89C52單片機(jī)作為系統(tǒng)的處理核心,利用橋式稱(chēng)重傳感器采集到車(chē)輛重量并轉(zhuǎn)換成電壓信號(hào),然后通過(guò)放大電路將電壓信號(hào)進(jìn)行放大處理后,傳送到A/D轉(zhuǎn)換器中轉(zhuǎn)換為數(shù)字信號(hào),再經(jīng)過(guò)單片機(jī)處理、傳輸?shù)浇涌陔娐罚詈笏偷缴衔粰C(jī),該數(shù)據(jù)可以與上位機(jī)里用鍵盤(pán)事先輸入設(shè)定的總重量作比較并判斷出該車(chē)輛是否超載,如果超載,則可通過(guò)顯示器、蜂鳴器作顯示超載信息并報(bào)警,當(dāng)然,鍵盤(pán)的作用除了輸入設(shè)定值還可以解除和開(kāi)啟警報(bào)。 三 動(dòng)態(tài)稱(chēng)重系統(tǒng)的組成動(dòng)態(tài)稱(chēng)重系統(tǒng)主要由車(chē)輛重量(含超載、偏載檢測(cè))檢測(cè)子系統(tǒng)、貨車(chē)長(zhǎng)、寬、高三維尺寸超限檢測(cè)子系統(tǒng)、自動(dòng)觸發(fā)攝像拍照子系統(tǒng)、車(chē)輛類(lèi)型自動(dòng)判別子系統(tǒng)、系統(tǒng)配置及系統(tǒng)維護(hù)子系統(tǒng)、行駛車(chē)輛速度測(cè)量子系統(tǒng)、數(shù)據(jù)統(tǒng)計(jì)、報(bào)表處理子系統(tǒng)和單據(jù)輸出打印子系統(tǒng)這幾部分組成。該系統(tǒng)組成完善,部件考慮周全,能很好的完成稱(chēng)重任務(wù)。 四 動(dòng)態(tài)稱(chēng)重系統(tǒng)的主要功能(1) 動(dòng)態(tài)檢測(cè)出通過(guò)車(chē)輛的軸數(shù)、軸重、軸距、輪數(shù)、車(chē)速等; (2) 能自動(dòng)檢測(cè)出車(chē)輛的高、寬、長(zhǎng)等外圍尺寸是否超出最大標(biāo)準(zhǔn),并能給出超出部位的具體位置和具體數(shù)據(jù); (3) 拍攝機(jī)器在車(chē)輛經(jīng)過(guò)時(shí)能自行對(duì)要被檢測(cè)的車(chē)輛進(jìn)行拍照,該機(jī)器能對(duì)車(chē)牌號(hào)碼、車(chē)輛種類(lèi)進(jìn)行識(shí)別,最終作為圖像證據(jù); (4) 可以將不合格車(chē)輛的處理記錄、超限情況進(jìn)行打印,根據(jù)車(chē)輛超限的程度來(lái)計(jì)算罰款數(shù)額并打印收據(jù)或罰款單; (5) 檢測(cè)到的數(shù)據(jù)全部存入數(shù)據(jù)庫(kù)中,并對(duì)被監(jiān)測(cè)到的數(shù)據(jù)進(jìn)行分析、統(tǒng)計(jì)。便于匯總上報(bào)、日常管理和進(jìn)行查詢(xún)。 五 單片機(jī)的選用本設(shè)計(jì)采用的是INTEL公司研究開(kāi)發(fā)生產(chǎn)的STC89C52單片機(jī),其內(nèi)部置有256字節(jié)的內(nèi)部數(shù)據(jù)存儲(chǔ)器、8位中央處理單元、8K片內(nèi)程序存儲(chǔ)器、3個(gè)16位定時(shí)/計(jì)數(shù)器、32個(gè)雙向I/O口和一個(gè)片內(nèi)時(shí)鐘振蕩電路,全雙工串行通信口, 5個(gè)兩級(jí)中斷結(jié)構(gòu)。89C52的引腳圖如圖4.1所示。 圖 4.1 89C52引腳圖 本設(shè)計(jì)使用的是單片機(jī)的最小系統(tǒng),其中電路包括下載口電路、復(fù)位電路和晶振電路。復(fù)位電路中,電阻在下接地,電容在上接高電平,中間為RST。復(fù)位電路工作原理是:通電時(shí),由于電流很大,從而相當(dāng)于電容被短路,這樣RST引腳上處于高電平,這時(shí)的單片機(jī)為禁止工作狀態(tài)。如果要使單片機(jī)正常工作,就要使RST端電壓慢慢下降并到一定程度,也就是RST端為低電平,這就需要通過(guò)電源對(duì)電容進(jìn)行充電。 復(fù)位電路復(fù)位的方式有手動(dòng)復(fù)位、上電復(fù)位兩種。所謂上電復(fù)位,就是通電瞬間,由于電流很大,從而相當(dāng)于電容被短路,這樣RST引腳上處于高電平,自動(dòng)復(fù)位;相反,通過(guò)對(duì)改變電容電流,當(dāng)電流很小的時(shí)候,我們就可以把電容當(dāng)做開(kāi)路狀態(tài),RST端就處于低電平,程序就能正常的運(yùn)行。而手動(dòng)復(fù)位要在上電復(fù)位的基礎(chǔ)上,按下復(fù)位按鍵,使VCC直接與RST相連,電容處于放電狀態(tài),以高電平形成復(fù)位;松開(kāi)復(fù)位按鍵,RST仍舊是高電平,這時(shí)充電電流作用于電阻上,VCC給電容進(jìn)行充電,還是復(fù)位狀態(tài),充電結(jié)束后,RST為低電平,能夠正常工作。 A/D轉(zhuǎn)換器A/D轉(zhuǎn)換器根據(jù)輸出的信號(hào)格式有并行A/D和串行A/D兩種。ADC0832 是一種具有雙通道 A/D 轉(zhuǎn)換芯片和8 位分辨率。它的優(yōu)點(diǎn)有體積小,兼容性強(qiáng),性?xún)r(jià)比高,從而深受個(gè)人的歡迎和企業(yè)的認(rèn)可,目前在世界上也已經(jīng)有了較高的使用率。 ADC0832具有能夠進(jìn)行雙通道A/D 轉(zhuǎn)換,分辨率高達(dá)8位;當(dāng)供電電源為5V時(shí),輸入電壓能穩(wěn)定的保持在0~5V 之間;TTL/CMOS與輸出輸入電平兼容;功耗很低,只有15mW;轉(zhuǎn)換工作時(shí)間只有 32μS,也就是頻率僅有 250KHZ等特點(diǎn)。其引腳功能圖如圖4.6所示,芯片引腳接口說(shuō)明如表4所示。 圖4.6 引腳排列 表4 ADC0832引腳說(shuō)明 | | | | | | | | | | | 轉(zhuǎn)換數(shù)據(jù)輸出,數(shù)據(jù)信號(hào)輸出 | | 選擇通道控制,數(shù)據(jù)信號(hào)輸入 | | | | |
通常情況下的單片機(jī)和ADC0832的接口的數(shù)據(jù)線(xiàn)應(yīng)為4條,分別是 CS、CLK、DO、DI。由于A(yíng)DC0832的數(shù)據(jù)信號(hào)輸入輸出口與單片機(jī)具有雙向接口通信,輸入輸出口也不同時(shí)使用,所以可以將數(shù)據(jù)信號(hào)輸入輸出口并聯(lián)后當(dāng)一條數(shù)據(jù)線(xiàn)進(jìn)行使用。它們的硬件接口電路與單片機(jī)連接的原理如圖4.7所示。 最后將以上的惠思登電橋、放大器、ADC0832轉(zhuǎn)換器和STC89C52單片機(jī)連接起來(lái),就組成了系統(tǒng)的采集模塊。 圖4.7 ADC0832 與單片機(jī)的接口電路 報(bào)警模塊本系統(tǒng)要實(shí)現(xiàn)一旦檢測(cè)到車(chē)輛超載超限,就會(huì)立刻鳴笛報(bào)警,通過(guò)操作人員的檢查處理后,解除報(bào)警。本設(shè)計(jì)選用蜂鳴器作為發(fā)聲裝置,蜂鳴器可利用三極管來(lái)進(jìn)行放大驅(qū)動(dòng)。該接口電路如圖4.15所示: 圖4.15 報(bào)警接口電路 - 1 -
5. 系統(tǒng)的軟件設(shè)計(jì)
5.1 主程序設(shè)計(jì)當(dāng)系統(tǒng)上電復(fù)位后,系統(tǒng)開(kāi)始初始化,包括端口等;初始化完畢后,調(diào)用串口輸出提示語(yǔ),開(kāi)始準(zhǔn)備串口輸出電壓;準(zhǔn)備完畢后,調(diào)用串口輸出電壓值,開(kāi)始從串口輸出電壓值;輸出完畢后,調(diào)用串口輸出換行值;最后開(kāi)始延時(shí)200ms。根據(jù)系統(tǒng)方案,設(shè)計(jì)出本設(shè)計(jì)的主程序流程,可以用框圖表示。 圖5.1 主程序流程圖 5.3 ADC0832軟件設(shè)計(jì)首先要將芯片開(kāi)始使能,即CS使能端置于低電平,然后通過(guò)DI和DO的同一數(shù)據(jù)輸入端口,可實(shí)現(xiàn)通道功能的選擇,再調(diào)用通道初始化程序,初始化完畢后,在8個(gè)時(shí)鐘邊沿獲得正序和反序8位數(shù)據(jù),最后返回?cái)?shù)據(jù)。根據(jù)此方案,設(shè)計(jì)出本設(shè)計(jì)中A/D轉(zhuǎn)換程序流程,如圖5.2所示。 當(dāng)兩位數(shù)據(jù)都為0時(shí),CH1作為負(fù)輸入端 IN-,而CH0就作為正輸入端IN+來(lái)進(jìn)行相關(guān)輸入。當(dāng)此兩位數(shù)據(jù)都為1時(shí),CH1進(jìn)行單通道轉(zhuǎn)換而CHO不轉(zhuǎn)換。當(dāng)兩位數(shù)據(jù)分別為0和1時(shí),CH1作為正輸入端IN+,CH0作為負(fù)輸入端IN-來(lái)進(jìn)行相關(guān)輸入。當(dāng)兩位數(shù)據(jù)為分別為1和0時(shí),CH0進(jìn)行單通道轉(zhuǎn)換而CH1不轉(zhuǎn)換。ADC0832的功能項(xiàng)如表7所示。 圖5.2 ADC0832轉(zhuǎn)換流程圖 表7 AD0832功能項(xiàng) ADC0832沒(méi)有工作時(shí),DO/DI和CLK的電平可高可低,但CS的輸入端口應(yīng)必須顯示高電平,此時(shí)芯片處于禁用狀態(tài)。當(dāng)A/D轉(zhuǎn)換進(jìn)行時(shí),CS端口必須處于低電平并且一直將低電平保持到轉(zhuǎn)換全部結(jié)束。當(dāng)芯片轉(zhuǎn)換工作開(kāi)始,芯片的CLK端口會(huì)接收到處理器傳送來(lái)的一時(shí)鐘脈沖,DO/DI并聯(lián)端口將使用數(shù)據(jù)輸入信號(hào)的DI端口。 第一個(gè)時(shí)鐘脈沖的下沉出現(xiàn)之前,DI端口一定要是高電平,表示啟始信號(hào)的發(fā)出,在第二、三個(gè)脈沖的下沉出現(xiàn)之前,DI端口要輸入兩位數(shù)據(jù)來(lái)選擇通道。第三個(gè)脈沖出現(xiàn)下沉之后,DI端口就不再起任何作用,此后 DO/DI并聯(lián)端口則是被DO端口占領(lǐng)進(jìn)行讀取轉(zhuǎn)換數(shù)據(jù)。第四個(gè)下沉脈沖出現(xiàn)開(kāi)始,DO端口輸出最高位的轉(zhuǎn)換數(shù)據(jù)DATA7,接下來(lái)每個(gè)脈沖下沉之后DO端口都會(huì)輸出下一位的轉(zhuǎn)換數(shù)據(jù)。直到發(fā)出最低位數(shù)據(jù)DATA0,也就是由第十一個(gè)脈沖發(fā)出的數(shù)據(jù)之后,這樣一個(gè)字節(jié)的數(shù)據(jù)輸出就完成了。再?gòu)牡谑粋(gè)脈沖下沉開(kāi)始從DATD0開(kāi)始輸出下一個(gè)相反數(shù)據(jù)字節(jié)。然后一直到第十九個(gè)脈沖完成數(shù)據(jù)的輸出,這樣一次A/D 轉(zhuǎn)換才結(jié)束。最后,要想將轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行相關(guān)處理就必須將芯片禁用,也就是將CS端口輸入高電平。 5.4 LCD顯示程序設(shè)計(jì)首先設(shè)置顯示模式,設(shè)置第(x,y)個(gè)字符的DDRAM的地址,為15×2顯示,因?yàn)橐壕э@示為15列,所以x位置的范圍是0到15,同理,因?yàn)轱@示2行,所以y位置的范圍是0到1。顯示程序如下: void Lcd_Pos(uchar yPos,uchar xPos) { uchar tmp; xPos &= 0x0f; //x位置范圍是0~15,因?yàn)轱@示15列 yPos &= 0x01; //y位置范圍是0~1,因?yàn)轱@示2行 if(yPos==0) //顯示第一行 { tmp = xPos; } else { tmp = xPos + 0x40; //顯示第二行 } tmp |= 0x80; Write_com(tmp); } 5.5 主函數(shù)軟件主要分成四個(gè)部分:串口配置,ADC0832的初始化,等待接受數(shù)據(jù)和輸出數(shù)據(jù)。程序如下: void main(void) { InitUART(); //串口初始化 Lcd_init(); Write_String("Weight: ", 0, 0); Write_String("H=", 1, 0); Write_String("L=", 1, 6); Beep = 1; while(1) { Process10ms(); DispVal(Wh, 1, 2); DispVal(Wl, 1, 8); CheckProcess(); if (flagget10s == 1) { flagget10s = 0; Get_temp(sum*100); ET0 = 1; TR0 = 1; Disp_Voltage(); //采集電壓并發(fā)送 } } }
單片機(jī)系統(tǒng)部分硬件原理圖單片機(jī)程序
- #include "reg52.h"
- #include "My_type.h" //數(shù)據(jù)類(lèi)型頭文件
- #include <intrins.h>
-
- #define nop() _nop_()
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit Lcd_rs=P2^0;
- sbit Lcd_rw=P2^1;
- sbit Lcd_en=P2^2;
-
- sbit key1 = P3^5;
- sbit key2 = P3^6;
- sbit key3 = P3^7;
-
- sbit Beep = P2^7;
- sbit Led = P2^6;
- sbit CS=P1^3; //使能
- sbit CLK=P1^1; //時(shí)鐘
- sbit Do=P1^2; // 數(shù)據(jù)輸出
- sbit Di=P1^2; //數(shù)據(jù)輸入
-
- #define first_channel 0x02 //通道1
- #define second_channel 0x03 //通道2
- uchar CH = first_channel;
-
- #define Fclk 11059200UL /*使用11.0592M晶體*/
- #define BitRate 9600UL /*波特率定義為9600*/
- uint8 Sending; //發(fā)送標(biāo)志
-
- code uint16 AD_Tab[41] = {512, 2048, 2970, 3840, 4659, 5581,
- 6349, 7117, 7782, 8397, 9165, 9830,
- 10291, 11162, 11520, 11981, 12749, 13210,
- 13926, 14490, 15206, 15821, 16538, 17357,
- 17971, 18842, 19814, 20838, 21760, 22477,
- 23091, 23603, 23962, 24371, 24678, 24883,
- 25037, 25190, 25293, 25395, 25600};
-
- uint8 temp_zheng;
- float temp_xiao;
-
- uint8 flag10ms = 0;
- uint8 flag50ms = 0;
- uint8 get10s = 0;
- uint8 flagget10s = 0;
- uint8 Alarmflag = 1;
- uint16 sum = 0;
- uint8 count5ms = 0;
- uint8 Wh = 40;
- uint8 Wl = 20;
-
- void Delay_lcd1602(uint dly)
- {
- uint i;
- for(; dly>0; dly--)
- for(i=0; i<100; i++);
- }
-
- bit Lcd_busy()
- {
- bit result;
- Lcd_rw = 1;
- Lcd_rs = 0;
- Lcd_en = 1;
- nop();nop();nop();nop();
- result = (bit)(P0&0x80);
- Lcd_en = 0;
- return(result);
- }
-
- void Write_com(uchar com)
- {
- while(Lcd_busy()); //LCD忙等待
- Lcd_rs = 0;
- Lcd_rw = 0;
- P0 = com;
- Delay_lcd1602(5);
- Lcd_en = 1;
- Delay_lcd1602(5);
- Lcd_en = 0;
- }
- void Write_data(uchar date)
- {
- while(Lcd_busy()); //LCD忙等待
- Lcd_rs = 1;
- Lcd_rw = 0;
- P0 = date;
- Delay_lcd1602(5);
- Lcd_en = 1;
- Delay_lcd1602(5);
- Lcd_en = 0;
- }
- void Lcd_init()
- {
- Lcd_en = 0;
- Write_com(0x38);
- Delay_lcd1602(5);
- Write_com(0x0c);
- Delay_lcd1602(5);
- Write_com(0x04);
- Delay_lcd1602(5);
- Write_com(0x01);
- Delay_lcd1602(5);
- }
- void Lcd_Pos(uchar yPos,uchar xPos) //設(shè)置第(xPos,yPos)個(gè)字符的DDRAM地址
- {
- uchar tmp;
- xPos &= 0x0f; //x位置范圍是0~15,因?yàn)轱@示15列
- yPos &= 0x01; //y位置范圍是0~1,因?yàn)轱@示2行
- if(yPos==0) //顯示第一行
- {
- tmp = xPos;
- }
- else
- {
- tmp = xPos + 0x40; //顯示第二行
- }
- tmp |= 0x80;
- Write_com(tmp);
- }
-
- void Write_char(uchar c,uchar xPos,uchar yPos) //定義Write_Char函數(shù)
- {
- Lcd_Pos(xPos,yPos);
- Write_data(c);
- }
-
-
-
- void Write_String(uchar *s,uchar xPos,uchar yPos) //定義Write_String函數(shù)
- {
- uchar i = 0;
- Lcd_Pos(xPos,yPos);
- while(*s)
- {
- Write_data(*(s++));
- if(++i>16) break;
- }
- }
-
-
- void InitUART(void)
- {
- EA=0;
- TMOD|=0x21; //定時(shí)器1工作在模式2
- SCON=0x50; //串口工作在模式1
- TCON=0x05;
- TH1=256-Fclk/(BitRate*12*16);
- TL1=256-Fclk/(BitRate*12*16);
-
- TH0 = (65535 - 1000)/256;
- TL0 = (65535 - 1000)%256;
- ET0 = 1;
- TR0 = 1;
-
- PCON=0x80; //串口波特率加倍
- ES=1; //串行中斷允許
- TR1=1; //啟動(dòng)定時(shí)器1
- REN=1; //允許接收
- EA=1; //允許中斷
- }
- void UartISR(void) interrupt 4
- {
- if(RI) //收到數(shù)據(jù)
- {
- RI=0; //清中斷請(qǐng)求
- }
- else //發(fā)送完一字節(jié)數(shù)據(jù)
- {
- TI=0;
- Sending=0; //清正在發(fā)送標(biāo)志
- }
- }
- void PutChar_to_Uart(uint8 d)
- {
- Sending=1;
- SBUF=d;
- while(Sending);
- }
- void Prints(uint8 *pd)
- {
- while((*pd)!='\0')
- {
- PutChar_to_Uart(*pd);
- pd++;
- }
- }
-
-
- unsigned char ADconv(void)
- {
- unsigned char i;
- unsigned int data_f=0,data_c=0;
- ET0 = 0;
- TR0 = 0;
- Di=1;
- CS=1;
- _nop_();
- CS=0;
- Di=1; ;//芯片使能之前的初始化。第一個(gè)下降沿
- CLK=1;
- _nop_();
- _nop_();
-
- CLK=0; // 確定通道模式、第2個(gè)下降沿
- _nop_();
- _nop_();
- CLK=1;
- Di=(bit)(0x02&CH); //設(shè)定通道初始化
- _nop_();
- CLK=0;
- _nop_();
- _nop_();
- CLK=1;
- Di=(bit)(0x01&CH); //設(shè)定通道初始化 .第3個(gè)下降沿
- _nop_();
- _nop_();
- CLK=0; //AD轉(zhuǎn)化的初始化完成。
- Di=1;
- CLK=1;
- _nop_();
- _nop_();
- CLK=0;
- _nop_();
- CLK=1;
-
-
- for(i=8;i>0;i--)//得到一個(gè)正常排序的8位數(shù)據(jù)
- {
- data_f|=Do;
- data_f<<=1;
- CLK=1;
- _nop_();
- _nop_();
- CLK=0;
- _nop_();
- }
- for(i=8;i>0;i--)//得到一個(gè)反序排列的8位數(shù)據(jù)
- {
- data_c<<=1;
- data_c|=Do;
- _nop_();
- CLK=1;
- _nop_();
- _nop_();
- CLK=0;
- _nop_();
- }
- CLK=0;
- _nop_();
- _nop_();
- CLK=1;
- _nop_();
- _nop_();
- CLK=0;
- _nop_();
- _nop_();
- CLK=1;
- _nop_();
- CS=1;
- _nop_();
- _nop_();
- ET0 = 1;
- TR0 = 1;
- return data_f;
- }
- /*
- void delay_ms(unsigned int x)
- {
- unsigned int i,j;
- i=0;
- for(i=0;i<x;i++)
- {
- j=108;
- while(j--);
- }
- }
-
-
-
-
-
- */
-
- void DispVal(uint8 pdat, uint8 x, uint8 y)
- {
- /*
- PutChar_to_Uart(pdat/100 + 0x30);
- PutChar_to_Uart(pdat%100/10 + 0x30);
- PutChar_to_Uart(pdat%100%10 + 0x30);
- */
- Write_char(pdat/100 + 0x30, x, y);
- Write_char(pdat%100/10 + 0x30, x, y+1);
- Write_char(pdat%100%10 + 0x30, x, y+2);
- }
-
-
- void Process10ms(void)
- {
-
- if (flag10ms == 1)
- {
- flag10ms = 0;
- count5ms ++;
- if (count5ms == 5)
- {
- count5ms = 0;
- flag50ms = 1;
- }
-
- get10s++;
- sum = sum + ADconv();
- if (get10s == 10)
- {
- get10s = 0;
- ET0 = 0;
- TR0 = 0;
- flagget10s = 1;
- sum = sum / 10;
- }
-
- if (key1==0)
- {
- while (!key1);
- Wh++;
- if (Wh >=51)
- {
- Wh = 40;
- }
- }
- if (key2==0)
- {
- while (!key2);
- Wl++;
- if (Wl >=Wh)
- {
- Wl = 20;
- }
- }
- if (key3==0)
- {
- while (!key3)
- Alarmflag = ~Alarmflag;
- }
- }
- }
-
- /*
- void Process50ms(void)
- {
- if (flag50ms == 1)
- {
- flag50ms = 0;
- Led = ~Led;
-
-
- }
- }
- */
-
- void CheckProcess()
- {
- uint16 Wig, SetH, SetL;
- Wig = (uint16)temp_zheng*100 + (uint16)(temp_xiao*100);
- SetH = (uint16)Wh*100;
- SetL = (uint16)Wl*100;
- if ((Wig>SetH) && (Alarmflag==1))
- {
- Beep = 0;
- }
- else if ((Wig<SetL) && (Alarmflag==1))
- {
- Beep = 0;
- }
- else if (Alarmflag == 0)
- {
- Beep = 1;
- }
- else
- {
- Beep = 1;
- }
-
- }
- /*
- uchar Get10sAD(void)
- {
- uchar i;
- uint sum = 0;
-
- for (i=0; i<10; i++)
- {
- sum = sum + ADconv();
- delay_ms(10);
- }
- sum = sum/10;
- return sum;
- }
-
-
- */
- void Get_temp(uint ad_temp)
- {
- uint8 n = 0;
- while(1)
- {
- if ((ad_temp >= AD_Tab[n]) && (ad_temp <= AD_Tab[n+1]))
- {
- temp_zheng = n + 10;
- temp_xiao = (1.0*(ad_temp - AD_Tab[n]))/(AD_Tab[n+1] - AD_Tab[n]);
- break;
- }
- n++;
- if (n>40)
- {
- break;
- }
- }
- }
-
- void Disp_Voltage(void)
- {
- uchar temp;
- temp = (uchar)(temp_xiao * 100);
- Prints("Weight:"); //提示語(yǔ)
- PutChar_to_Uart(temp_zheng/100 + 0x30);
- PutChar_to_Uart(temp_zheng%100/10 + 0x30);
- PutChar_to_Uart(temp_zheng%100%10 + 0x30);
- PutChar_to_Uart('.');
- PutChar_to_Uart(temp/10 + 0x30);
- PutChar_to_Uart(temp%10 + 0x30);
- PutChar_to_Uart('T');
- PutChar_to_Uart(0x0d); //換行
- PutChar_to_Uart(0x0a); //換行
- Write_char(temp_zheng/100 + 0x30, 0, 8);
- Write_char(temp_zheng%100/10 + 0x30, 0, 9);
- Write_char(temp_zheng%100%10 + 0x30, 0, 10);
- Write_char('.', 0, 11);
- Write_char(temp/10 + 0x30, 0, 12);
- Write_char(temp%10 + 0x30, 0, 13);
- Write_char('T', 0, 14);
- }
-
-
- void main(void)
- {
-
- InitUART(); //串口初始化
- Lcd_init();
- Write_String("Weight: ", 0, 0);
- Write_String("H=", 1, 0);
- Write_String("L=", 1, 6);
- Beep = 1;
- while(1)
- {
- Process10ms();
- DispVal(Wh, 1, 2);
- DispVal(Wl, 1, 8);
- CheckProcess();
- if (flagget10s == 1)
- {
- flagget10s = 0;
- Get_temp(sum*100);
- ET0 = 1;
- TR0 = 1;
- Disp_Voltage(); //采集電壓并發(fā)送
- }
-
- }
- }
-
- void Timer0() interrupt 1
- {
- static uint8 count1ms = 0;
- TH0 = (65535 - 1000)/256;
- TL0 = (65535 - 1000)%256;
- count1ms ++;
- if (count1ms == 10)
- {
- count1ms = 0;
- flag10ms = 1;
- }
-
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
|
評(píng)分
-
查看全部評(píng)分
|