久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12937|回復(fù): 4
收起左側(cè)

基于51單片機(jī)的車(chē)輛動(dòng)態(tài)稱(chēng)重系統(tǒng)設(shè)計(jì)論文

[復(fù)制鏈接]
ID:330933 發(fā)表于 2018-5-16 00:51 | 顯示全部樓層 |閱讀模式
基于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ō)明

接口

說(shuō)明

CS

片選使能,輸入低電平能使芯片工作

CH1

模擬的輸入通道 1,或作為 IN+/-使用

CH0

模擬的輸入通道 0,或作為 IN+/-使用

GND

接地

DO

轉(zhuǎn)換數(shù)據(jù)輸出,數(shù)據(jù)信號(hào)輸出

DI

選擇通道控制,數(shù)據(jù)信號(hào)輸入

CLK

芯片時(shí)鐘脈沖輸入

Vcc/REF

5V參考電壓輸入和電源輸入

通常情況下的單片機(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)

MUX Address

Channe#

SGL/DIF

ODD/SIGN

0

1

1

0

+


1

1


+

0

0

+

_

0

1

_

+

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ī)程序

  1. #include "reg52.h"
  2. #include "My_type.h"              //數(shù)據(jù)類(lèi)型頭文件
  3. #include <intrins.h>

  4. #define nop() _nop_()
  5. #define uchar unsigned char
  6. #define uint  unsigned int

  7. sbit Lcd_rs=P2^0;
  8. sbit Lcd_rw=P2^1;
  9. sbit Lcd_en=P2^2;

  10. sbit key1 = P3^5;
  11. sbit key2 = P3^6;
  12. sbit key3 = P3^7;

  13. sbit Beep = P2^7;
  14. sbit Led = P2^6;
  15. sbit CS=P1^3;    //使能
  16. sbit CLK=P1^1;   //時(shí)鐘
  17. sbit Do=P1^2;    // 數(shù)據(jù)輸出
  18. sbit Di=P1^2;    //數(shù)據(jù)輸入

  19. #define first_channel   0x02  //通道1
  20. #define second_channel  0x03  //通道2
  21. uchar CH = first_channel;

  22. #define Fclk      11059200UL                            /*使用11.0592M晶體*/
  23. #define BitRate   9600UL                                 /*波特率定義為9600*/
  24. uint8 Sending;                //發(fā)送標(biāo)志

  25. code uint16 AD_Tab[41] = {512, 2048, 2970, 3840, 4659, 5581,
  26.                           6349, 7117, 7782, 8397, 9165, 9830,
  27.                                                                             10291, 11162, 11520, 11981, 12749, 13210,
  28.                           13926, 14490, 15206, 15821, 16538, 17357,
  29.                           17971, 18842, 19814, 20838, 21760, 22477,
  30.                           23091, 23603, 23962, 24371, 24678, 24883,
  31.                                                                             25037, 25190, 25293, 25395, 25600};

  32. uint8 temp_zheng;
  33. float temp_xiao;

  34. uint8 flag10ms = 0;
  35. uint8 flag50ms = 0;
  36. uint8 get10s  = 0;
  37. uint8 flagget10s  = 0;
  38. uint8 Alarmflag = 1;
  39. uint16 sum = 0;
  40. uint8 count5ms = 0;
  41. uint8 Wh = 40;
  42. uint8 Wl = 20;

  43. void  Delay_lcd1602(uint dly)               
  44. {
  45.    uint i;
  46.    for(; dly>0; dly--)
  47.       for(i=0; i<100; i++);
  48. }

  49. bit Lcd_busy()
  50. {
  51.               bit result;
  52.               Lcd_rw = 1;
  53.               Lcd_rs = 0;
  54.               Lcd_en = 1;
  55.               nop();nop();nop();nop();
  56.               result = (bit)(P0&0x80);
  57.               Lcd_en = 0;
  58.               return(result);
  59. }

  60. void Write_com(uchar com)
  61. {
  62.     while(Lcd_busy());      //LCD忙等待
  63.               Lcd_rs = 0;
  64.               Lcd_rw = 0;
  65.               P0 = com;
  66.               Delay_lcd1602(5);
  67.               Lcd_en = 1;
  68.               Delay_lcd1602(5);
  69.               Lcd_en = 0;
  70. }
  71. void Write_data(uchar date)
  72. {
  73.     while(Lcd_busy());      //LCD忙等待
  74.               Lcd_rs = 1;
  75.               Lcd_rw = 0;
  76.               P0 = date;
  77.               Delay_lcd1602(5);
  78.               Lcd_en = 1;
  79.               Delay_lcd1602(5);
  80.               Lcd_en = 0;
  81. }
  82. void Lcd_init()
  83. {
  84.               Lcd_en = 0;
  85.               Write_com(0x38);
  86.               Delay_lcd1602(5);
  87.               Write_com(0x0c);
  88.               Delay_lcd1602(5);
  89.               Write_com(0x04);
  90.               Delay_lcd1602(5);
  91.               Write_com(0x01);
  92.               Delay_lcd1602(5);
  93. }
  94. void Lcd_Pos(uchar yPos,uchar xPos)              //設(shè)置第(xPos,yPos)個(gè)字符的DDRAM地址     
  95. {            
  96.               uchar tmp;
  97.               xPos &= 0x0f;                                        //x位置范圍是0~15,因?yàn)轱@示15列
  98.               yPos &= 0x01;                                           //y位置范圍是0~1,因?yàn)轱@示2行
  99.               if(yPos==0)                                            //顯示第一行
  100.               {
  101.                             tmp = xPos;
  102.               }
  103.               else
  104.               {
  105.                             tmp = xPos + 0x40;          //顯示第二行
  106.               }
  107.               tmp |= 0x80;
  108.               Write_com(tmp);
  109. }

  110. void Write_char(uchar c,uchar xPos,uchar yPos)       //定義Write_Char函數(shù)
  111. {            
  112.               Lcd_Pos(xPos,yPos);
  113.               Write_data(c);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
  114. }



  115. void Write_String(uchar *s,uchar xPos,uchar yPos)   //定義Write_String函數(shù)
  116. {            
  117.               uchar i = 0;
  118.               Lcd_Pos(xPos,yPos);            
  119.               while(*s)
  120.               {            
  121.                             Write_data(*(s++));
  122.                             if(++i>16) break;
  123.               }
  124. }


  125. void InitUART(void)
  126. {
  127.               EA=0;
  128.               TMOD|=0x21;    //定時(shí)器1工作在模式2
  129.               SCON=0x50;     //串口工作在模式1
  130.               TCON=0x05;
  131.               TH1=256-Fclk/(BitRate*12*16);
  132.               TL1=256-Fclk/(BitRate*12*16);

  133.               TH0 = (65535 - 1000)/256;
  134.               TL0 = (65535 - 1000)%256;
  135.               ET0 = 1;
  136.               TR0 = 1;

  137.               PCON=0x80;    //串口波特率加倍
  138.               ES=1;         //串行中斷允許
  139.               TR1=1;        //啟動(dòng)定時(shí)器1
  140.               REN=1;        //允許接收
  141.               EA=1;         //允許中斷
  142. }
  143. void UartISR(void) interrupt 4
  144. {
  145.               if(RI)    //收到數(shù)據(jù)
  146.               {
  147.                             RI=0;   //清中斷請(qǐng)求
  148.               }
  149.               else      //發(fā)送完一字節(jié)數(shù)據(jù)
  150.               {
  151.                             TI=0;
  152.                             Sending=0;  //清正在發(fā)送標(biāo)志
  153.               }
  154. }
  155. void PutChar_to_Uart(uint8 d)
  156. {
  157.               Sending=1;
  158.               SBUF=d;
  159.               while(Sending);
  160. }
  161. void Prints(uint8 *pd)
  162. {
  163.               while((*pd)!='\0')
  164.               {
  165.                             PutChar_to_Uart(*pd);
  166.                             pd++;
  167.               }
  168. }


  169. unsigned char ADconv(void)
  170. {
  171.               unsigned char i;
  172.               unsigned int data_f=0,data_c=0;
  173.               ET0 = 0;
  174.               TR0 = 0;
  175.               Di=1;
  176.               CS=1;
  177.               _nop_();
  178.               CS=0;
  179.               Di=1; ;//芯片使能之前的初始化。第一個(gè)下降沿
  180.               CLK=1;
  181.               _nop_();
  182.               _nop_();

  183.               CLK=0; // 確定通道模式、第2個(gè)下降沿
  184.               _nop_();
  185.               _nop_();
  186.               CLK=1;
  187.               Di=(bit)(0x02&CH); //設(shè)定通道初始化
  188.               _nop_();
  189.               CLK=0;
  190.               _nop_();
  191.               _nop_();
  192.               CLK=1;
  193.               Di=(bit)(0x01&CH); //設(shè)定通道初始化 .第3個(gè)下降沿
  194.               _nop_();
  195.               _nop_();
  196.               CLK=0; //AD轉(zhuǎn)化的初始化完成。
  197.               Di=1;
  198.               CLK=1;
  199.               _nop_();
  200.               _nop_();
  201.               CLK=0;
  202.               _nop_();
  203.               CLK=1;
  204.             
  205.             
  206.               for(i=8;i>0;i--)//得到一個(gè)正常排序的8位數(shù)據(jù)
  207.               {
  208.                             data_f|=Do;
  209.                             data_f<<=1;
  210.                             CLK=1;
  211.                             _nop_();
  212.                             _nop_();
  213.                             CLK=0;
  214.                             _nop_();
  215.               }
  216.               for(i=8;i>0;i--)//得到一個(gè)反序排列的8位數(shù)據(jù)
  217.               {
  218.                             data_c<<=1;
  219.                             data_c|=Do;
  220.                             _nop_();
  221.                             CLK=1;
  222.                             _nop_();
  223.                             _nop_();
  224.                             CLK=0;
  225.                             _nop_();
  226.               }
  227.               CLK=0;
  228.               _nop_();
  229.               _nop_();
  230.               CLK=1;
  231.               _nop_();
  232.               _nop_();
  233.               CLK=0;
  234.               _nop_();
  235.               _nop_();
  236.               CLK=1;
  237.               _nop_();
  238.               CS=1;
  239.               _nop_();
  240.               _nop_();
  241.                             ET0 = 1;
  242.               TR0 = 1;
  243.               return data_f;
  244. }
  245. /*
  246. void delay_ms(unsigned int x)
  247. {
  248.     unsigned int i,j;
  249.     i=0;
  250.     for(i=0;i<x;i++)
  251.     {
  252.        j=108;
  253.        while(j--);
  254.     }
  255. }





  256. */

  257. void DispVal(uint8 pdat, uint8 x, uint8 y)
  258. {
  259.               /*
  260.               PutChar_to_Uart(pdat/100 + 0x30);
  261.               PutChar_to_Uart(pdat%100/10 + 0x30);
  262.               PutChar_to_Uart(pdat%100%10 + 0x30);
  263.               */
  264.               Write_char(pdat/100 + 0x30, x, y);
  265.               Write_char(pdat%100/10 + 0x30, x, y+1);
  266.               Write_char(pdat%100%10 + 0x30, x,  y+2);            
  267. }


  268. void Process10ms(void)
  269. {

  270.               if (flag10ms == 1)
  271.               {
  272.                             flag10ms = 0;
  273.                             count5ms ++;
  274.                             if (count5ms == 5)
  275.                             {
  276.                                           count5ms = 0;
  277.                                           flag50ms = 1;
  278.                             }

  279.                   get10s++;
  280.                             sum = sum + ADconv();
  281.                             if (get10s == 10)
  282.                             {
  283.                                           get10s = 0;
  284.                                           ET0 = 0;
  285.                                           TR0 = 0;
  286.                                           flagget10s = 1;
  287.                                           sum = sum / 10;            
  288.                             }

  289.                             if (key1==0)
  290.                             {
  291.                                 while (!key1);
  292.                                           Wh++;            
  293.                                           if (Wh >=51)
  294.                                           {
  295.                                                         Wh = 40;
  296.                                           }
  297.                             }
  298.                             if (key2==0)
  299.                             {
  300.                                 while (!key2);
  301.                                           Wl++;            
  302.                                           if (Wl >=Wh)
  303.                                           {
  304.                                                         Wl = 20;
  305.                                           }
  306.                             }
  307.                             if (key3==0)
  308.                             {
  309.                                           while (!key3)
  310.                                           Alarmflag = ~Alarmflag;            
  311.                             }
  312.               }            
  313. }

  314. /*
  315. void Process50ms(void)
  316. {
  317.               if (flag50ms == 1)
  318.               {
  319.                             flag50ms = 0;
  320.                                Led = ~Led;            
  321.                            

  322.               }
  323. }
  324. */

  325. void CheckProcess()
  326. {
  327.               uint16 Wig, SetH, SetL;
  328.               Wig =  (uint16)temp_zheng*100 + (uint16)(temp_xiao*100);
  329.               SetH = (uint16)Wh*100;
  330.               SetL = (uint16)Wl*100;
  331.               if ((Wig>SetH) && (Alarmflag==1))
  332.               {
  333.                             Beep = 0;
  334.               }
  335.               else if ((Wig<SetL) && (Alarmflag==1))
  336.               {
  337.                             Beep = 0;
  338.               }
  339.               else if (Alarmflag == 0)
  340.               {
  341.                   Beep = 1;
  342.               }
  343.               else
  344.               {
  345.                             Beep = 1;
  346.               }

  347. }
  348. /*
  349. uchar Get10sAD(void)
  350. {
  351.               uchar i;
  352.               uint sum = 0;

  353.               for (i=0; i<10; i++)
  354.               {
  355.                             sum = sum + ADconv();
  356.                             delay_ms(10);
  357.               }
  358.               sum = sum/10;
  359.               return sum;
  360. }


  361. */
  362. void Get_temp(uint ad_temp)
  363. {
  364.     uint8 n = 0;
  365.               while(1)
  366.               {
  367.                             if ((ad_temp >= AD_Tab[n]) && (ad_temp <= AD_Tab[n+1]))
  368.         {
  369.             temp_zheng = n + 10;
  370.                                           temp_xiao =              (1.0*(ad_temp - AD_Tab[n]))/(AD_Tab[n+1] - AD_Tab[n]);
  371.             break;
  372.         }
  373.         n++;
  374.         if (n>40)
  375.         {
  376.             break;
  377.         }
  378.               }
  379. }

  380. void Disp_Voltage(void)
  381. {
  382.               uchar temp;
  383.               temp = (uchar)(temp_xiao * 100);
  384.               Prints("Weight:");                               //提示語(yǔ)
  385.               PutChar_to_Uart(temp_zheng/100 + 0x30);
  386.               PutChar_to_Uart(temp_zheng%100/10 + 0x30);
  387.               PutChar_to_Uart(temp_zheng%100%10 + 0x30);
  388.               PutChar_to_Uart('.');
  389.               PutChar_to_Uart(temp/10 + 0x30);
  390.               PutChar_to_Uart(temp%10 + 0x30);            
  391.               PutChar_to_Uart('T');
  392.     PutChar_to_Uart(0x0d);              //換行
  393.               PutChar_to_Uart(0x0a);              //換行            
  394.               Write_char(temp_zheng/100 + 0x30, 0, 8);
  395.               Write_char(temp_zheng%100/10 + 0x30, 0, 9);
  396.               Write_char(temp_zheng%100%10 + 0x30, 0, 10);
  397.               Write_char('.', 0, 11);
  398.               Write_char(temp/10 + 0x30, 0, 12);
  399.               Write_char(temp%10 + 0x30, 0, 13);            
  400.               Write_char('T', 0, 14);            
  401. }


  402. void main(void)
  403. {

  404.               InitUART();  //串口初始化
  405.               Lcd_init();
  406.               Write_String("Weight: ", 0, 0);
  407.               Write_String("H=", 1, 0);
  408.               Write_String("L=", 1, 6);            
  409.               Beep = 1;
  410.               while(1)               
  411.               {            
  412.                             Process10ms();            
  413.                                DispVal(Wh, 1, 2);
  414.                             DispVal(Wl, 1, 8);
  415.                                CheckProcess();
  416.                             if (flagget10s == 1)
  417.                             {
  418.                                           flagget10s = 0;            
  419.                                           Get_temp(sum*100);
  420.                                           ET0 = 1;
  421.                                           TR0 = 1;
  422.                                           Disp_Voltage();                //采集電壓并發(fā)送
  423.                             }
  424.                            
  425.               }
  426. }

  427. void Timer0() interrupt 1
  428. {
  429.               static uint8 count1ms = 0;
  430.               TH0 = (65535 - 1000)/256;
  431.               TL0 = (65535 - 1000)%256;
  432.               count1ms ++;
  433.               if (count1ms == 10)
  434.               {
  435.                             count1ms = 0;
  436.                             flag10ms = 1;
  437.               }
  438.             
  439. }
復(fù)制代碼


完整的Word格式文檔51黑下載地址:
基于51單片機(jī)的稱(chēng)重系統(tǒng)設(shè)計(jì).doc (222.28 KB, 下載次數(shù): 96)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:335259 發(fā)表于 2018-5-23 23:43 | 顯示全部樓層
摟住,看不懂
回復(fù)

使用道具 舉報(bào)

ID:335259 發(fā)表于 2018-6-8 21:52 | 顯示全部樓層
有電路圖嗎
回復(fù)

使用道具 舉報(bào)

ID:498861 發(fā)表于 2019-3-27 07:20 來(lái)自觸屏版 | 顯示全部樓層
樓主,我想問(wèn)下關(guān)于這個(gè)系統(tǒng)的問(wèn)題,能加個(gè)扣扣交流下嗎?很急
回復(fù)

使用道具 舉報(bào)

ID:916602 發(fā)表于 2021-5-7 22:05 | 顯示全部樓層
有沒(méi)有protues 的仿真原理圖
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜影院在线观看免费 | 国产亚洲高清视频 | 成人超碰在线 | 久久久精品在线 | 国产成人精品久久二区二区91 | 亚洲精品免费在线观看 | 久久久高清 | 日韩精品免费在线观看 | 欧美a视频| 亚洲精品乱码久久久久久蜜桃 | 久久精品日产第一区二区三区 | av毛片| 国精品一区二区 | 成人在线看片 | av福利网站| 日韩精品一区二区三区视频播放 | 美女福利视频网站 | 最近中文字幕在线视频1 | 色秀网站| 日韩一区在线视频 | 超碰97人人人人人蜜桃 | 国产高清久久久 | 91精品国产综合久久久久蜜臀 | 国产精品美女久久久久久免费 | 国产超碰人人爽人人做人人爱 | 久久日韩精品一区二区三区 | 国产精品一区二区三区四区五区 | 野狼在线社区2017入口 | 91在线一区二区三区 | 日韩国产高清在线观看 | 国产精品毛片av | jizz在线免费观看 | 国产小视频在线 | 国产精品久久久久久久久久久久冷 | 超碰伊人| 国产精品成人久久久久 | 日韩免费视频一区二区 | 伊人网站在线观看 | 欧美性区| 一区二区三区四区国产 | 国产一级片精品 |