標(biāo)題: 基于51單片機的車輛動態(tài)稱重系統(tǒng)設(shè)計論文 [打印本頁]

作者: MyLily    時間: 2018-5-16 00:51
標(biāo)題: 基于51單片機的車輛動態(tài)稱重系統(tǒng)設(shè)計論文
基于51單片機的稱重系統(tǒng)
動態(tài)稱重

所謂動態(tài)稱重是指通過分析和測量車胎運動中的力,來計算該運動車輛的總重量、軸重、輪重和部分重量數(shù)據(jù)的過程。動態(tài)稱重系統(tǒng)按經(jīng)過車輛行駛的速度劃分,可分為低速動態(tài)稱重系統(tǒng)與高速動態(tài)稱重系統(tǒng)。因為我國高速公路的限速最高是120,所以高速動態(tài)稱重系統(tǒng)在理論上可對5到120之間時速通過稱量裝置的車輛進(jìn)行動態(tài)稱重。而低速動態(tài)稱重系統(tǒng)則一定要限制通過車輛的行駛速度,要想有較高的測量精度,理論要求車輛在5km/h以下時速勻速通過。在我國,車輛動態(tài)稱重一般都使用低速動態(tài)稱重來完成,在很多收費站和車輛檢測站都有應(yīng)用,國家也出臺了相關(guān)的測量標(biāo)準(zhǔn)。

與傳統(tǒng)意義上的靜態(tài)稱重相比,動態(tài)稱重可以在車輛緩慢運動情況下直接進(jìn)行稱重,這樣動態(tài)稱重的高效率、測量時間短、能流暢交通等主要特點就凸顯出來了。動態(tài)稱重的問世,不但使車輛的管理上有了很大的促進(jìn)作用,而且還對我國的公路管理和維護(hù)起到了至關(guān)重要的作用。

系統(tǒng)總體結(jié)構(gòu)及其功能

設(shè)計總體結(jié)構(gòu)是以51單片機為處理器的系統(tǒng),如圖3.1所示。

圖 3.1

本設(shè)計要求能判斷出車輛是否超載,如果車輛超載,本系統(tǒng)能夠提供該車輛的超載信息并發(fā)出警報。本設(shè)計采用STC89C52單片機作為系統(tǒng)的處理核心,利用橋式稱重傳感器采集到車輛重量并轉(zhuǎn)換成電壓信號,然后通過放大電路將電壓信號進(jìn)行放大處理后,傳送到A/D轉(zhuǎn)換器中轉(zhuǎn)換為數(shù)字信號,再經(jīng)過單片機處理、傳輸?shù)浇涌陔娐,最后送到上位機,該數(shù)據(jù)可以與上位機里用鍵盤事先輸入設(shè)定的總重量作比較并判斷出該車輛是否超載,如果超載,則可通過顯示器、蜂鳴器作顯示超載信息并報警,當(dāng)然,鍵盤的作用除了輸入設(shè)定值還可以解除和開啟警報。

動態(tài)稱重系統(tǒng)的組成

動態(tài)稱重系統(tǒng)主要由車輛重量(含超載、偏載檢測)檢測子系統(tǒng)、貨車長、寬、高三維尺寸超限檢測子系統(tǒng)、自動觸發(fā)攝像拍照子系統(tǒng)、車輛類型自動判別子系統(tǒng)、系統(tǒng)配置及系統(tǒng)維護(hù)子系統(tǒng)、行駛車輛速度測量子系統(tǒng)、數(shù)據(jù)統(tǒng)計、報表處理子系統(tǒng)和單據(jù)輸出打印子系統(tǒng)這幾部分組成。該系統(tǒng)組成完善,部件考慮周全,能很好的完成稱重任務(wù)。

動態(tài)稱重系統(tǒng)的主要功能

(1)              動態(tài)檢測出通過車輛的軸數(shù)、軸重、軸距、輪數(shù)、車速等;

(2)              能自動檢測出車輛的高、寬、長等外圍尺寸是否超出最大標(biāo)準(zhǔn),并能給出超出部位的具體位置和具體數(shù)據(jù);

(3)              拍攝機器在車輛經(jīng)過時能自行對要被檢測的車輛進(jìn)行拍照,該機器能對車牌號碼、車輛種類進(jìn)行識別,最終作為圖像證據(jù);

(4)              可以將不合格車輛的處理記錄、超限情況進(jìn)行打印,根據(jù)車輛超限的程度來計算罰款數(shù)額并打印收據(jù)或罰款單;

(5)              檢測到的數(shù)據(jù)全部存入數(shù)據(jù)庫中,并對被監(jiān)測到的數(shù)據(jù)進(jìn)行分析、統(tǒng)計。便于匯總上報、日常管理和進(jìn)行查詢。

單片機的選用

本設(shè)計采用的是INTEL公司研究開發(fā)生產(chǎn)的STC89C52單片機,其內(nèi)部置有256字節(jié)的內(nèi)部數(shù)據(jù)存儲器、8位中央處理單元、8K片內(nèi)程序存儲器、3個16位定時/計數(shù)器、32個雙向I/O口和一個片內(nèi)時鐘振蕩電路,全雙工串行通信口, 5個兩級中斷結(jié)構(gòu)。89C52的引腳圖如圖4.1所示。

圖 4.1 89C52引腳圖

本設(shè)計使用的是單片機的最小系統(tǒng),其中電路包括下載口電路、復(fù)位電路和晶振電路。復(fù)位電路中,電阻在下接地,電容在上接高電平,中間為RST。復(fù)位電路工作原理是:通電時,由于電流很大,從而相當(dāng)于電容被短路,這樣RST引腳上處于高電平,這時的單片機為禁止工作狀態(tài)。如果要使單片機正常工作,就要使RST端電壓慢慢下降并到一定程度,也就是RST端為低電平,這就需要通過電源對電容進(jìn)行充電。

復(fù)位電路復(fù)位的方式有手動復(fù)位、上電復(fù)位兩種。所謂上電復(fù)位,就是通電瞬間,由于電流很大,從而相當(dāng)于電容被短路,這樣RST引腳上處于高電平,自動復(fù)位;相反,通過對改變電容電流,當(dāng)電流很小的時候,我們就可以把電容當(dāng)做開路狀態(tài),RST端就處于低電平,程序就能正常的運行。而手動復(fù)位要在上電復(fù)位的基礎(chǔ)上,按下復(fù)位按鍵,使VCC直接與RST相連,電容處于放電狀態(tài),以高電平形成復(fù)位;松開復(fù)位按鍵,RST仍舊是高電平,這時充電電流作用于電阻上,VCC給電容進(jìn)行充電,還是復(fù)位狀態(tài),充電結(jié)束后,RST為低電平,能夠正常工作。

A/D轉(zhuǎn)換器

A/D轉(zhuǎn)換器根據(jù)輸出的信號格式有并行A/D和串行A/D兩種。ADC0832 是一種具有雙通道 A/D 轉(zhuǎn)換芯片和8 位分辨率。它的優(yōu)點有體積小,兼容性強,性價比高,從而深受個人的歡迎和企業(yè)的認(rèn)可,目前在世界上也已經(jīng)有了較高的使用率。

ADC0832具有能夠進(jìn)行雙通道A/D 轉(zhuǎn)換,分辨率高達(dá)8位;當(dāng)供電電源為5V時,輸入電壓能穩(wěn)定的保持在0~5V 之間;TTL/CMOS與輸出輸入電平兼容;功耗很低,只有15mW;轉(zhuǎn)換工作時間只有 32μS,也就是頻率僅有 250KHZ等特點。其引腳功能圖如圖4.6所示,芯片引腳接口說明如表4所示。

圖4.6 引腳排列
表4 ADC0832引腳說明

接口

說明

CS

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

CH1

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

CH0

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

GND

接地

DO

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

DI

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

CLK

芯片時鐘脈沖輸入

Vcc/REF

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

通常情況下的單片機和ADC0832的接口的數(shù)據(jù)線應(yīng)為4條,分別是 CS、CLK、DO、DI。由于ADC0832的數(shù)據(jù)信號輸入輸出口與單片機具有雙向接口通信,輸入輸出口也不同時使用,所以可以將數(shù)據(jù)信號輸入輸出口并聯(lián)后當(dāng)一條數(shù)據(jù)線進(jìn)行使用。它們的硬件接口電路與單片機連接的原理如圖4.7所示。

最后將以上的惠思登電橋、放大器、ADC0832轉(zhuǎn)換器和STC89C52單片機連接起來,就組成了系統(tǒng)的采集模塊。

圖4.7 ADC0832 與單片機的接口電路
報警模塊

本系統(tǒng)要實現(xiàn)一旦檢測到車輛超載超限,就會立刻鳴笛報警,通過操作人員的檢查處理后,解除報警。本設(shè)計選用蜂鳴器作為發(fā)聲裝置,蜂鳴器可利用三極管來進(jìn)行放大驅(qū)動。該接口電路如圖4.15所示:

圖4.15 報警接口電路
- 1 -



5. 系統(tǒng)的軟件設(shè)計
5.1 主程序設(shè)計

當(dāng)系統(tǒng)上電復(fù)位后,系統(tǒng)開始初始化,包括端口等;初始化完畢后,調(diào)用串口輸出提示語,開始準(zhǔn)備串口輸出電壓;準(zhǔn)備完畢后,調(diào)用串口輸出電壓值,開始從串口輸出電壓值;輸出完畢后,調(diào)用串口輸出換行值;最后開始延時200ms。根據(jù)系統(tǒng)方案,設(shè)計出本設(shè)計的主程序流程,可以用框圖表示。

圖5.1  主程序流程圖
5.3 ADC0832軟件設(shè)計

首先要將芯片開始使能,即CS使能端置于低電平,然后通過DI和DO的同一數(shù)據(jù)輸入端口,可實現(xiàn)通道功能的選擇,再調(diào)用通道初始化程序,初始化完畢后,在8個時鐘邊沿獲得正序和反序8位數(shù)據(jù),最后返回數(shù)據(jù)。根據(jù)此方案,設(shè)計出本設(shè)計中A/D轉(zhuǎn)換程序流程,如圖5.2所示。

當(dāng)兩位數(shù)據(jù)都為0時,CH1作為負(fù)輸入端 IN-,而CH0就作為正輸入端IN+來進(jìn)行相關(guān)輸入。當(dāng)此兩位數(shù)據(jù)都為1時,CH1進(jìn)行單通道轉(zhuǎn)換而CHO不轉(zhuǎn)換。當(dāng)兩位數(shù)據(jù)分別為0和1時,CH1作為正輸入端IN+,CH0作為負(fù)輸入端IN-來進(jìn)行相關(guān)輸入。當(dāng)兩位數(shù)據(jù)為分別為1和0時,CH0進(jìn)行單通道轉(zhuǎn)換而CH1不轉(zhuǎn)換。ADC0832的功能項如表7所示。

圖5.2  ADC0832轉(zhuǎn)換流程圖
表7 AD0832功能項

MUX Address

Channe#

SGL/DIF

ODD/SIGN

0

1

1

0

+


1

1


+

0

0

+

_

0

1

_

+

ADC0832沒有工作時,DO/DI和CLK的電平可高可低,但CS的輸入端口應(yīng)必須顯示高電平,此時芯片處于禁用狀態(tài)。當(dāng)A/D轉(zhuǎn)換進(jìn)行時,CS端口必須處于低電平并且一直將低電平保持到轉(zhuǎn)換全部結(jié)束。當(dāng)芯片轉(zhuǎn)換工作開始,芯片的CLK端口會接收到處理器傳送來的一時鐘脈沖,DO/DI并聯(lián)端口將使用數(shù)據(jù)輸入信號的DI端口。

第一個時鐘脈沖的下沉出現(xiàn)之前,DI端口一定要是高電平,表示啟始信號的發(fā)出,在第二、三個脈沖的下沉出現(xiàn)之前,DI端口要輸入兩位數(shù)據(jù)來選擇通道。第三個脈沖出現(xiàn)下沉之后,DI端口就不再起任何作用,此后 DO/DI并聯(lián)端口則是被DO端口占領(lǐng)進(jìn)行讀取轉(zhuǎn)換數(shù)據(jù)。第四個下沉脈沖出現(xiàn)開始,DO端口輸出最高位的轉(zhuǎn)換數(shù)據(jù)DATA7,接下來每個脈沖下沉之后DO端口都會輸出下一位的轉(zhuǎn)換數(shù)據(jù)。直到發(fā)出最低位數(shù)據(jù)DATA0,也就是由第十一個脈沖發(fā)出的數(shù)據(jù)之后,這樣一個字節(jié)的數(shù)據(jù)輸出就完成了。再從第十一個脈沖下沉開始從DATD0開始輸出下一個相反數(shù)據(jù)字節(jié)。然后一直到第十九個脈沖完成數(shù)據(jù)的輸出,這樣一次A/D 轉(zhuǎn)換才結(jié)束。最后,要想將轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行相關(guān)處理就必須將芯片禁用,也就是將CS端口輸入高電平。

5.4 LCD顯示程序設(shè)計

首先設(shè)置顯示模式,設(shè)置第(x,y)個字符的DDRAM的地址,為15×2顯示,因為液晶顯示為15列,所以x位置的范圍是0到15,同理,因為顯示2行,所以y位置的范圍是0到1。顯示程序如下:

void Lcd_Pos(uchar yPos,uchar xPos)

{            

              uchar tmp;

              xPos &= 0x0f;                                        //x位置范圍是0~15,因為顯示15列

              yPos &= 0x01;                                           //y位置范圍是0~1,因為顯示2行

              if(yPos==0)                                            //顯示第一行

              {

                            tmp = xPos;

              }

              else

              {

                            tmp = xPos + 0x40;          //顯示第二行

              }

              tmp |= 0x80;

              Write_com(tmp);

}

5.5 主函數(shù)

軟件主要分成四個部分:串口配置,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ā)送

                            }

                           

              }

}

  


單片機系統(tǒng)部分硬件原理圖
單片機程序

  1. #include "reg52.h"
  2. #include "My_type.h"              //數(shù)據(jù)類型頭文件
  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;   //時鐘
  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)個字符的DDRAM地址     
  95. {            
  96.               uchar tmp;
  97.               xPos &= 0x0f;                                        //x位置范圍是0~15,因為顯示15列
  98.               yPos &= 0x01;                                           //y位置范圍是0~1,因為顯示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;    //定時器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;        //啟動定時器1
  140.               REN=1;        //允許接收
  141.               EA=1;         //允許中斷
  142. }
  143. void UartISR(void) interrupt 4
  144. {
  145.               if(RI)    //收到數(shù)據(jù)
  146.               {
  147.                             RI=0;   //清中斷請求
  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; ;//芯片使能之前的初始化。第一個下降沿
  180.               CLK=1;
  181.               _nop_();
  182.               _nop_();

  183.               CLK=0; // 確定通道模式、第2個下降沿
  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個下降沿
  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--)//得到一個正常排序的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--)//得到一個反序排列的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:");                               //提示語
  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單片機的稱重系統(tǒng)設(shè)計.doc (222.28 KB, 下載次數(shù): 96)


作者: 牧神記    時間: 2018-5-23 23:43
摟住,看不懂

作者: 牧神記    時間: 2018-6-8 21:52
有電路圖嗎
作者: 1127805482    時間: 2019-3-27 07:20
樓主,我想問下關(guān)于這個系統(tǒng)的問題,能加個扣扣交流下嗎?很急
作者: asdw934686673    時間: 2021-5-7 22:05
有沒有protues 的仿真原理圖




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1