找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9424|回复: 3
收起左侧

单片机读取DS18B20内部温度上传到上位机(电脑)

[复制链接]
ID:110653 发表于 2016-3-29 01:20 | 显示全部楼层 |阅读模式

DS18B20是一种很常用的数字温度传感器,温度检测范围是-55~+125度,手册 说明在-10~+85度范围内检测误差为±0.5度,作者在自己的产品中随机抽样验证 了几只传感器,在-25度误差0.1度,+25度与+50度误差小于0.1度,可见这种传感 器实际精度是很高的,传感器引脚如图19-1所示,工作电压范围是3.0~5.5V,通 常使用+5V,电源接反或接错一般是不会损坏传感器的,对于单只DS18B20的使用,我们按图19-2连接即可。






上位机vb电脑程序: 0.png
电路和介绍详见:http://www.51hei.com/bbs/dpj-47286-1.html(在这贴附件中可下载上位机vb及下位机单片机的完整的源码压缩包)
单片机下位机主程序如下(部分预览):
  1. /****************《51单片机轻松入门-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51单片机轻松入门-基于STC15W4K系列》 一书已经由北航出版社正式出版发行。
  4.   作者亲手创作的与教材配套的51双核实验板(2个MCU)对程序下载、调试、仿真方便,不需要外部
  5.   仿真器与编程器,这种设计方式彻底解决了系统中多个最高优先级谁也不能让谁的中断竞争问题。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         验证信息:STC15单片机
  8.   邮箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. //**************************************************************               
  11. //运行环境:STC51 1T单片机 11.0592M晶振
  12. //程序说明:此程序读取P1口(P1.0、P1.1、P1.2、P1.3)4只DS18B20代码并发送给计算机                     
  13. //**************************************************************        
  14. #include "STC15W4K.H"  
  15. #include "DS18B20.H"
  16. #include "myfun.H"
  17. unsigned char Pin;                                // 0000 0001    0000 0010    0000 0100   0000 1000
  18.                                                                    // 0001 0000    0010 0000    0100 0000   1000 0000
  19.                                                                 // 用于选择操作P1口上的多个位  
  20. unsigned char RomCode0[8] ;                // 存放第1路DS18B20代码
  21. unsigned char RomCode1[8] ;                // 存放第2路DS18B20代码
  22. unsigned char RomCode2[8] ;                // 存放第3路DS18B20代码
  23. unsigned char RomCode3[8] ;                // 存放第4路DS18B20代码

  24. /*****************  crc8_f反序校验(法1:快速)    *********************/
  25. unsigned char  crc8_f1(unsigned char *ptr, unsigned char len)
  26. {
  27.         unsigned char i;               
  28.         unsigned char crc=0;
  29.         while(len--)
  30.         {
  31.                 crc^=*ptr++;
  32.                 for(i=0;i<8;i++)
  33.                 {
  34.                         if(crc&0x01)
  35.                         {   
  36.                                 crc>>=1;
  37.                                 crc^=0x8c;
  38.                         }
  39.                         else
  40.                         {
  41.                                 crc>>=1;
  42.                         }
  43.                 }         
  44.         }
  45.         return(crc);
  46. }  

  47. //请用实际行动支持宏晶STC大陆本土MCU统一全球市场
  48. void UartInit(void)                //9600bps@11.0592MHz
  49. {
  50.         //下面代码设置定时器1
  51.         TMOD = 0x20;        // 0010 0000 定时器1工作于方式2(8位自动重装方式)
  52.         TH1  = 0xFD;        // 波特率:9600 /11.0592MHZ
  53.         TL1  = 0xFD;        // 波特率:9600 /11.0592MHZ
  54.         TR1  = 1;
  55.         //下面代码设置定串口
  56.         AUXR = 0x00;             // 很关键,使用定时器1作为波特率发生器,S1ST2=0
  57.         SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)
  58. }
  59. void main()
  60. {
  61.         unsigned char i;
  62.         unsigned char  crc;
  63.         UartInit();  
  64.         while(1)
  65.         {
  66.                 Pin =0x01;                       // 将要操作 P1.0口18B20
  67.                 Read_RomCode(0x00);    // 参数0x00:读得的64位代码存数组RomCode0
  68.                                                            //     0x01:读得的64位代码存数组RomCode1
  69.                                                            //          0x02:读得的64位代码存数组RomCode2
  70.                                                            //          0x03:读得的64位代码存数组RomCode3               
  71.                 crc=crc8_f1(RomCode0,8);   // CRC效验,数组名代表数组首地址,长度8字节
  72.                 if(crc==0)             // CRC效验正确
  73.                 {  
  74.                    SBUF= 0x01;                   // 表示第1路18B20数据
  75.                       while(1)
  76.                    {
  77.                                 if (TI)
  78.                                 {
  79.                                         TI=0;
  80.                                         break;
  81.                                 }
  82.                    }   
  83.                
  84.                    for (i=0;i<8;i++)        // 发送8字节ROM代码
  85.                    {  
  86.                            SBUF= RomCode0[i];
  87.                            while(1)
  88.                            {
  89.                                         if (TI)
  90.                                         {
  91.                                                 TI=0;
  92.                                                 break;
  93.                                         }
  94.                            }
  95.                    }
  96.                 }
  97.                 else                           // 校验失败,发回8个0xaa
  98.                 {
  99.                         SBUF= 0x01;           // 表示第1路18B20数据
  100.                         while(1)
  101.                         {
  102.                                 if (TI)
  103.                                 {
  104.                                         TI=0;
  105.                                         break;
  106.                                 }
  107.                         }   
  108.                
  109.                    for (i=0;i<8;i++)
  110.                    {  
  111.                            SBUF= 0xaa;
  112.                            while(1)
  113.                            {
  114.                                         if (TI)
  115.                                         {
  116.                                                 TI=0;
  117.                                                 break;
  118.                                         }
  119.                            }
  120.                    }
  121.                 }
  122.                                 
  123.                 Pin =0x02;                            // 将要操作 P0.1口18B20
  124.                 Read_RomCode(0x01);    // 0x01:读得的64位代码存数组RomCode1
  125.                 crc=crc8_f1(RomCode1,8);      //CRC效验
  126.                 if(crc==0)             // CRC效验正确
  127.                 {
  128.                         SBUF= 0x02;                   // 表示第2路18B20数据
  129.                         while(1)
  130.                         {
  131.                                 if (TI)
  132.                                 {
  133.                                         TI=0;
  134.                                         break;
  135.                                 }
  136.                         }                    
  137.                
  138.                            for (i=0;i<8;i++)          // 发送8字节ROM代码
  139.                         {                           
  140.                            SBUF= RomCode1[i];
  141.                            while(1)
  142.                            {
  143.                                         if (TI)
  144.                                         {
  145.                                                 TI=0;
  146.                                                 break;
  147.                                         }
  148.                            }
  149.                         }
  150.                 }
  151.                 else                         // 校验失败,发回8个0xaa
  152.                 {
  153.                         SBUF= 0x02;
  154.                         while(1)
  155.                         {
  156.                                 if (TI)
  157.                                 {
  158.                                         TI=0;
  159.                                         break;
  160.                                 }
  161.                         }   
  162.                
  163.                    for (i=0;i<8;i++)
  164.                    {  
  165.                            SBUF= 0xaa;
  166.                            while(1)
  167.                            {
  168.                                         if (TI)
  169.                                         {
  170.                                                 TI=0;
  171.                                                 break;
  172.                                         }
  173.                            }
  174.                    }
  175.                 }
  176.                
  177.                 Pin =0x04;                     // 将要操作 P0.2口18B20
  178.                 Read_RomCode(0x02);    // 0x02:读得的64位代码存数组RomCode2
  179.                 crc=crc8_f1(RomCode2,8);      //CRC效验
  180.                 if(crc==0)             // CRC效验正确
  181.                 {
  182.                         SBUF= 0x03;                   // 表示第3路18B20数据
  183.                         while(1)
  184.                         {
  185.                                 if (TI)
  186.                                 {
  187.                                         TI=0;
  188.                                         break;
  189.                                 }
  190.                         }
  191.                   
  192.                         for (i=0;i<8;i++)
  193.                         {                     
  194.                                 SBUF= RomCode2[i];
  195.                                 while(1)
  196.                                 {
  197.                                         if (TI)
  198.                                         {
  199.                                                 TI=0;
  200.                                                 break;
  201.                                         }
  202.                                 }
  203.                         }
  204.                 }
  205.                 else                         // 校验失败,发回8个0xaa
  206.                 {
  207.                         SBUF= 0x03;
  208.                         while(1)
  209.                         {
  210.                                 if (TI)
  211.                                 {
  212.                                         TI=0;
  213.                                         break;
  214.                                 }
  215.                         }   
  216.                
  217.                    for (i=0;i<8;i++)
  218.                    {  
  219.                            SBUF= 0xaa;
  220.                            while(1)
  221.                            {
  222.                                         if (TI)
  223.                                         {
  224.                                                 TI=0;
  225.                                                 break;
  226.                                         }
  227.                            }
  228.                    }
  229.                 }
  230.                
  231.                 Pin =0x08;                      // 将要操作 P0.3口18B20
  232.                 Read_RomCode(0x03);    // 0x03:读得的64位代码存数组RomCode3
  233.                 crc=crc8_f1(RomCode3,8);      // CRC效验
  234.                 if(crc==0)             // CRC效验正确
  235.                 {  
  236.                         SBUF=0x04;                   // 表示第4路18B20数据
  237.                         while(1)
  238.                         {
  239.                                 if (TI)
  240.                                 {
  241.                                         TI=0;
  242.                                         break;
  243.                                 }
  244.                         }
  245.                   
  246.                         for (i=0;i<8;i++)
  247.                         {                     
  248.                            SBUF= RomCode3[i];
  249.                            while(1)
  250.                            {
  251.                                         if (TI)
  252.                                         {
  253.                                                 TI=0;
  254.                                                 break;
  255.                                         }
  256.                            }
  257.                         }  
  258.                 }
  259.                 else                         //校验失败,发回8个0
  260.                 {
  261.                         SBUF= 0x04;
  262.                         while(1)
  263.                         {
  264.                                 if (TI)
  265.                                 {
  266.                                         TI=0;
  267.                                         break;
  268.                                 }
  269.                         }   
  270.                
  271.                    for (i=0;i<8;i++)
  272.                    {  
  273.                            SBUF= 0xaa;
  274.                            while(1)
  275.                            {
  276.                                         if (TI)
  277.                                         {
  278.                                                 TI=0;
  279.                                                 break;
  280.                                         }
  281.                            }
  282.                    }
  283.                 }
  284.                 delay1s();         
  285.          }               
  286. }
复制代码

上位机电脑vb程序:

  1. Attribute VB_Name = "Form1"
  2. Attribute VB_GlobalNameSpace = False
  3. Attribute VB_Creatable = False
  4. Attribute VB_PredeclaredId = True
  5. Attribute VB_Exposed = False
  6. Option Explicit
  7. Dim MyForm As FRMSIZE      '界面自动调整
  8. Dim DesignX As Long
  9. Dim DesignY As Long
  10. Dim Start_A As Boolean      '左面绘图开始标志
  11. Dim Start_B As Boolean      '右面绘图开始标志

  12. Dim FlagZuo  As Integer    '左边运行键按下标志
  13. Dim FlagYuo  As Integer    '右边运行键按下标志

  14. Dim DianHaoAZ As Integer     '存放左波形横轴点号
  15. Dim DianHaoZ  As Integer      '存放当前的A点号
  16. Dim DianHaoAY As Integer     '存放右波形横轴点号
  17. Dim DianHaoY  As Integer      '存放当前的A点号

  18. Dim timerz As Integer   '定时器画波形_左
  19. Dim timery As Integer   '定时器画波形_右

  20. Dim FLAG_A As Integer                                   '延时结束标志(界面左右各一)
  21. Dim FLAG_B As Integer                                   '延时结束标志(界面左右各一)

  22. Dim Zuo1_Liu As Single        '1L额外处理(左用户流量)
  23. Dim You1_Liu  As Single        '1L额外处理(右用户流量)
  24. Dim Zuo1_Pin As Single       '1L额外处理(左用户频率)
  25. Dim You1_Pin As Single       '1L额外处理(右用户频率)

  26. Dim QianLiuLiang_Z As Single
  27. Dim QianLiuLiang_Y As Single

  28. Dim ADDROUT_A(1 To 1) As Byte
  29. Dim ADDROUT_B(1 To 6) As Byte
  30. Dim NA As Integer, NB As Integer                   '用于文本框显示数据(界面左右各一)
  31. Dim I, J, DBEGIN, WDEND, XSTEP, WDSTEP, KDSTEP As Long
  32.                                                    
  33. Dim PI As Single


  34. Private Sub Combo1_Click()
  35.     Data1.DatabaseName = App.Path + "\水流量传感器.mdb"
  36.     Data1.RecordSource = Combo1.Text
  37.     Data1.Refresh
  38.     Label12(0).Caption = "有输出"
  39.     Label12(1).Caption = Data1.Recordset.Fields(2) & "-" & Data1.Recordset.Fields(3)
  40.     Label12(2).Caption = Data1.Recordset.Fields(4) & "-" & Data1.Recordset.Fields(5)
  41.     Label12(3).Caption = Data1.Recordset.Fields(6) & "-" & Data1.Recordset.Fields(7)
  42.    
  43. End Sub

  44. Private Sub Combo2_Click()
  45.     Data2.DatabaseName = App.Path + "\水流量传感器.mdb"
  46.     Data2.RecordSource = Combo2.Text
  47.     Data2.Refresh
  48.     Label22(0).Caption = "有输出"
  49.     Label22(1).Caption = Data2.Recordset.Fields(2) & "-" & Data2.Recordset.Fields(3)
  50.     Label22(2).Caption = Data2.Recordset.Fields(4) & "-" & Data2.Recordset.Fields(5)
  51.     Label22(3).Caption = Data2.Recordset.Fields(6) & "-" & Data2.Recordset.Fields(7)
  52.    
  53. End Sub

  54. Private Sub Command1_Click(Index As Integer)
  55.         Select Case Index
  56.             
  57.              Case 1                       '暂  停
  58.                      If Command1(1).Caption = "暂  停" Then
  59.                         Command1(1).Caption = "继 续"
  60.                         
  61.                         If MSComm1.PortOpen = True Then
  62.                            MSComm1.PortOpen = False
  63.                         End If
  64.                         
  65.                         If MSCommAD1.PortOpen = True Then
  66.                              MSCommAD1.PortOpen = False
  67.                         End If
  68.                         
  69.                         Timer1.Enabled = False
  70.                     Else
  71.                         Command1(1).Caption = "暂  停"
  72.                         If MSComm1.PortOpen = False Then
  73.                            MSComm1.PortOpen = True
  74.                         End If
  75.                         If MSCommAD1.PortOpen = False Then
  76.                             MSCommAD1.PortOpen = True
  77.                         End If
  78.                         Timer1.Enabled = True
  79.                  End If
  80.                      
  81.              Case 3                       '退  出
  82.                    End
  83.         End Select
  84. End Sub

  85. Private Sub Command2_Click(Index As Integer)

  86. Select Case Index
  87.             
  88.              Case 1                       '暂  停
  89.                   If Command2(1).Caption = "暂  停" Then
  90.                         Command2(1).Caption = "继 续"
  91.                         
  92.                         If MSComm2.PortOpen = True Then
  93.                              MSComm2.PortOpen = False
  94.                         End If
  95.                         If MSCommAD2.PortOpen = True Then
  96.                              MSCommAD2.PortOpen = False
  97.                         End If
  98.                         Timer2.Enabled = False
  99.                     Else
  100.                         Command2(1).Caption = "暂  停"
  101.                         If MSComm2.PortOpen = False Then
  102.                              MSComm2.PortOpen = True
  103.                         End If
  104.                         If MSCommAD2.PortOpen = False Then
  105.                              MSCommAD2.PortOpen = True
  106.                         End If
  107.                         Timer2.Enabled = True
  108.                  End If
  109.                      
  110.              Case 3                       '退  出
  111.                    End
  112.         End Select
  113.    
  114. End Sub

  115. Private Sub Command3_Click()
  116.       Data3.RecordSource = "流量记录表"
  117.           Data3.Refresh
  118.           Data3.Recordset.MoveFirst
  119.           Do While Data3.Recordset.EOF = False
  120.               Data3.Recordset.Delete
  121.               Data3.Recordset.MoveNext
  122.           Loop
  123. End Sub


  124. Private Sub Form_Activate()
  125.   Call DRAWQX_A
  126.   Call DRAWQX_B

  127. End Sub
  128. Private Sub DRAWQX_A()
  129.   Pic2.DrawWidth = 1
  130.   Pic2.DrawStyle = 0
  131.   
  132.   XSTEP = 2000            '曲线图 X 刻度步长
  133.   WDSTEP = 1000           '曲线图 Y 刻度步长

  134.   '*************************************************************************************
  135.                               '绘制 Y 刻度
  136.                  
  137.   DBEGIN = 10000   '水平坐标轴向左终点(离图片框左边沿 5个小刻度)
  138.   WDEND = 30000    '垂直坐标轴向下终点
  139.   For I = 1 To 30
  140.       If (I Mod 5) = 0 Then
  141.          Pic2.Line (DBEGIN - 2400, WDEND - I * WDSTEP)-(DBEGIN, WDEND - I * WDSTEP)
  142.       Else
  143.          Pic2.Line (DBEGIN - 1200, WDEND - I * WDSTEP)-(DBEGIN, WDEND - I * WDSTEP)
  144.       End If
  145.   Next
  146.   
  147.   Pic2.Line (DBEGIN, 0)-(DBEGIN, WDEND)                    'Y 轴线
  148.    
  149.   For I = 1 To 95            '绘制 X 刻度
  150.       If (I Mod 5) = 0 Then
  151.          Pic2.Line (DBEGIN + I * XSTEP, WDEND)-(DBEGIN + I * XSTEP, WDEND + 2400)
  152.       Else
  153.          Pic2.Line (DBEGIN + I * XSTEP, WDEND)-(DBEGIN + I * XSTEP, WDEND + 1200)
  154.       End If
  155.   Next
  156.   
  157.   Pic2.Line (DBEGIN, WDEND)-(200000, WDEND)                'X 轴线
  158.   
  159.    '*************************************************************************************
  160.                              '显示 X 坐标值
  161.   
  162.   For I = 0 To 18
  163.       Pic2.CurrentX = I * (5 * XSTEP) + 5 * XSTEP - Pic2.TextWidth(Str(I * 20)) / 1.5
  164.       Pic2.CurrentY = WDEND + 3 * WDSTEP
  165.       Pic2.Print I * 20
  166.       'Pic2.PSet (I * (5 * XSTEP) + 5 * XSTEP, WDEND + 3 * WDSTEP)  ' 确认X坐标是否准确(调试用)
  167.   Next I
  168.      Pic2.CurrentX = 19 * (5 * XSTEP) + 1 * XSTEP
  169.      Pic2.CurrentY = WDEND + 3 * WDSTEP
  170.       Pic2.Print "(ms)"
  171.                             '显示 Y 坐标值
  172.   For I = 1 To 5
  173.      Pic2.CurrentX = 500 '0.5 * XSTEP
  174.      Pic2.CurrentY = (WDEND - I * 5 * WDSTEP) - Pic2.TextWidth(I) * 0.5
  175.      Pic2.Print Format(I * 2.5, "0.00")  '& "V"
  176.     '  Pic2.PSet (4 * XSTEP, WDEND - I * 10 * WDSTEP)              ' 确认Y坐标是否准确(调试用)
  177.   Next I
  178.   Pic2.CurrentX = 500
  179.      Pic2.CurrentY = (WDEND - 29.5 * WDSTEP)
  180.      Pic2.Print "(V)"
  181.   
  182.   
  183.    '*************************************************************************************
  184.                           
  185.     '*************************************************************************************
  186.                             '绘制网格线
  187.                            
  188.   ' 要点 :X 坐标 = X*0.5*XSTEP + 5*XSTEP     ' 5*XSTEP 处是X轴的0点,距左边5个步长(即5个刻度)
  189.   '        Y 坐标 = WDEND - Y * 10 * WDSTEP   ,10个小格步进值表示1度(10 * WDSTEP )
  190.   
  191.     Pic2.DrawStyle = 2                     '点线
  192.     For I = 1 To 19
  193.         Pic2.Line (5 * I * XSTEP + 5 * XSTEP, WDEND)-(5 * I * XSTEP + 5 * XSTEP, 0)   '   垂直线
  194.     Next
  195.     For I = 1 To 5
  196.         Pic2.Line (5 * XSTEP, WDEND - I * 5 * WDSTEP)-(95 * XSTEP + 5 * XSTEP, WDEND - I * 5 * WDSTEP) '   水平线
  197.     Next
  198.    
  199. End Sub

  200. Private Sub DRAWQX_B()
  201.   Pic4.DrawWidth = 1
  202.   Pic4.DrawStyle = 0
  203.   
  204.   XSTEP = 2000            '曲线图 X 刻度步长
  205.   WDSTEP = 1000           '曲线图 Y 刻度步长

  206.   '*************************************************************************************
  207.                               '绘制 Y 刻度
  208.                  
  209.   DBEGIN = 10000   '水平坐标轴向左终点(离图片框左边沿 10个小刻度)
  210.   WDEND = 30000    '垂直坐标轴向下终点
  211.   For I = 1 To 30
  212.       If (I Mod 10) = 0 Then
  213.          Pic4.Line (DBEGIN - 2400, WDEND - I * WDSTEP)-(DBEGIN, WDEND - I * WDSTEP)
  214.       Else
  215.          Pic4.Line (DBEGIN - 1200, WDEND - I * WDSTEP)-(DBEGIN, WDEND - I * WDSTEP)
  216.       End If
  217.   Next
  218.   
  219.   Pic4.Line (DBEGIN, 0)-(DBEGIN, WDEND)                    'Y 轴线
  220.    
  221.   For I = 1 To 95            '绘制 X 刻度
  222.       If (I Mod 5) = 0 Then
  223.          Pic4.Line (DBEGIN + I * XSTEP, WDEND)-(DBEGIN + I * XSTEP, WDEND + 2400)
  224.       Else
  225.          Pic4.Line (DBEGIN + I * XSTEP, WDEND)-(DBEGIN + I * XSTEP, WDEND + 1200)
  226.       End If
  227.   Next
  228.   
  229.   Pic4.Line (DBEGIN, WDEND)-(200000, WDEND)                'X 轴线
  230.   
  231.    '*************************************************************************************
  232.                              '显示 X 坐标值
  233.   
  234.   For I = 0 To 18
  235.       Pic4.CurrentX = I * (5 * XSTEP) + 5 * XSTEP - Pic4.TextWidth(Str(I * 20)) / 1.5
  236.       Pic4.CurrentY = WDEND + 3 * WDSTEP
  237.       Pic4.Print I * 20
  238.       'Pic4.PSet (I * (5 * XSTEP) + 5 * XSTEP, WDEND + 3 * WDSTEP)  ' 确认X坐标是否准确(调试用)
  239.   Next I
  240.      Pic4.CurrentX = 19 * (5 * XSTEP) + 1 * XSTEP
  241.      Pic4.CurrentY = WDEND + 3 * WDSTEP
  242.       Pic4.Print "(ms)"
  243.                             '显示 Y 坐标值
  244.   For I = 1 To 5
  245.      Pic4.CurrentX = 500
  246.      Pic4.CurrentY = (WDEND - I * 5 * WDSTEP) - Pic4.TextWidth(I) * 0.5
  247.      Pic4.Print Format(I * 2.5, "0.00")
  248.     '  Pic4.PSet (4 * XSTEP, WDEND - I * 10 * WDSTEP)              ' 确认Y坐标是否准确(调试用)
  249.   Next I
  250.   Pic4.CurrentX = 500
  251.   Pic4.CurrentY = (WDEND - 29.5 * WDSTEP)
  252.   Pic4.Print "(V)"
  253.   
  254.     '*************************************************************************************
  255.                             '绘制网格线
  256.                            
  257.   ' 要点 :X 坐标 = X*0.5*XSTEP + 5*XSTEP     ' 5*XSTEP 处是X轴的0点,距左边5个步长(即5个刻度)
  258.   '        Y 坐标 = WDEND - Y * 10 * WDSTEP   ,10个小格步进值表示1度(10 * WDSTEP )
  259.   
  260.     Pic4.DrawStyle = 2                     '点线
  261.     For I = 1 To 19
  262.         Pic4.Line (5 * I * XSTEP + 5 * XSTEP, WDEND)-(5 * I * XSTEP + 5 * XSTEP, 0)   '   垂直线
  263.     Next
  264.     For I = 1 To 5
  265.         Pic4.Line (5 * XSTEP, WDEND - I * 5 * WDSTEP)-(95 * XSTEP + 5 * XSTEP, WDEND - I * 5 * WDSTEP) '   水平线
  266.     Next
  267.    
  268. End Sub
  269. Private Sub Form_Load()
  270.     If MSComm1.PortOpen = False Then
  271.             MSComm1.PortOpen = True
  272.            
  273.     End If
  274.    
  275.     'If MSComm2.PortOpen = False Then
  276.     '        MSComm2.PortOpen = True
  277.    ' End If
  278.    
  279.    ' If MSCommAD1.PortOpen = False Then      '绘制波形部分(左边)
  280.    '           MSCommAD1.PortOpen = True
  281.    ' End If
  282.    ' Start_A = False
  283.    ' DianHaoAZ = 1
  284.    ' DianHaoZ = 1
  285.    
  286.     'If MSCommAD2.PortOpen = False Then      '绘制波形部分(右边)
  287.     '      MSCommAD2.PortOpen = True
  288.     'End If
  289.     'Start_B = False
  290.     'DianHaoAY = 1
  291.     'DianHaoY = 1
  292.    
  293.     Data1.DatabaseName = App.Path + "\水流量传感器.mdb"
  294.     Data2.DatabaseName = App.Path + "\水流量传感器.mdb"
  295.    
  296.     Data3.DatabaseName = App.Path + "\水流量传感器.mdb"
  297.     Data3.RecordSource = "左流量记录表"
  298.     Data3.Refresh
  299.     Do While Data3.Recordset.EOF = False
  300.           Data3.Recordset.Delete
  301.           Data3.Recordset.MoveNext
  302.     Loop
  303.    
  304.     Data4.DatabaseName = App.Path + "\水流量传感器.mdb"
  305.     Data4.RecordSource = "右流量记录表"
  306.     Data4.Refresh
  307.     Do While Data4.Recordset.EOF = False
  308.           Data4.Recordset.Delete
  309.           Data4.Recordset.MoveNext
  310.     Loop
  311.    
  312.                      
  313. '定义X,Y方向调整比例系数
  314.     Dim ScaleFactorX As Single, ScaleFactorY As Single
  315.     '定义设计初始采用的屏幕显示分辨率FORM的尺寸,以像素点为单位
  316.    
  317.     DesignX = 1440
  318.     DesignY = 900
  319.     RePosForm = True '定位FORM的标志
  320.     DoResize = False 'RESIZE事件的标志
  321.     '设置屏幕的缇(twips)值
  322.     Xtwips = Screen.TwipsPerPixelX
  323.     Ytwips = Screen.TwipsPerPixelY
  324.     '设置屏幕X,Y方向的像素分辨率
  325.     Xpixels = Screen.Width / Xtwips
  326.     Ypixels = Screen.Height / Ytwips
  327.     '定义调整比例系数
  328.     ScaleFactorX = Xpixels / DesignX
  329.     ScaleFactorY = Ypixels / DesignY
  330.     Me.ScaleMode = vbTwips
  331.     '调用重新调整子程序
  332.     Resize_For_Resolution ScaleFactorX, ScaleFactorY, Me
  333.     '保存当前屏幕的尺寸
  334.     MyForm.Width = Me.Width
  335.     MyForm.Height = Me.Height
  336.    
  337. End Sub

  338. Private Sub Form_Resize()
  339.     Dim ScaleFactorX As Single, ScaleFactorY As Single
  340.     '避免死循环
  341.     If Not DoResize Then
  342.         DoResize = True
  343.         Exit Sub
  344.     End If
  345.     RePosForm = False
  346.     ScaleFactorX = Me.Width / MyForm.Width
  347.     ScaleFactorY = Me.Height / MyForm.Height
  348.     '重新调用调整子程序
  349.    ' Resize_For_Resolution ScaleFactorX, ScaleFactorY, Me
  350.     '保存当前屏幕的尺寸
  351.     MyForm.Width = Me.Width
  352.     MyForm.Height = Me.Height
  353.    
  354.    
  355.     Pic2.ScaleWidth = 200000
  356.     Pic2.ScaleHeight = 35000
  357.    
  358.   
  359.     Pic4.ScaleWidth = 200000
  360.     Pic4.ScaleHeight = 35000
  361.    
  362. End Sub



  363. Private Sub MSCommAD1_OnComm()      'AD专用通道1
  364.   Dim buffer() As Byte
  365.   Static ReFlag As Boolean
  366.   Dim DianYa As Single      '存放当前的AD转换电压值
  367.   
  368.   Static DianYaA As Single   '存放AD转换的旧电压值
  369.   
  370.   'On Error GoTo err

  371.   Select Case MSCommAD1.CommEvent
  372.   Case comEvReceive
  373.           buffer = MSCommAD1.Input
  374.            If ReFlag = False Then
  375.                 If buffer(0) = &H55 Then
  376.                     'Debug.Print "&0x55"
  377.                     MSCommAD1.InputLen = 470
  378.                     MSCommAD1.RThreshold = 470
  379.                     ReFlag = True
  380.                 End If
  381.                 Exit Sub
  382.           End If
  383.           Pic2.Cls
  384.           Call DRAWQX_A
  385.           For I = 0 To UBound(buffer)
  386.                        DianYa = buffer(I) * 29.99 / 255    '29.99是单片机基准电压需根据实际修改
  387.                        
  388.                        If DianHaoAZ = 1 Then
  389.                                Pic2.DrawStyle = 0
  390.                                Pic2.DrawWidth = 2
  391.                                Pic2.Line (DianHaoAZ * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYa * WDSTEP)-(DianHaoAZ * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYa * WDSTEP), RGB(0, 0, 255)
  392.                            Else
  393.                                Pic2.DrawStyle = 0
  394.                                Pic2.DrawWidth = 2
  395.                                Pic2.Line (DianHaoAZ * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYaA * WDSTEP)-(DianHaoZ * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYa * WDSTEP), RGB(0, 0, 255)
  396.                       End If
  397.                     '****************************************************************************
  398.                      DianYaA = DianYa       '记录电压
  399.                      DianHaoAZ = DianHaoZ     '记录点号
  400.                      DianHaoZ = DianHaoZ + 1
  401.             Next
  402.                     DianHaoAZ = 1
  403.                     DianHaoZ = 1
  404.                     ReFlag = False
  405.                     timerz = 0
  406.                     MSCommAD1.InputLen = 0
  407.                     buffer = MSCommAD1.Input
  408.                     MSCommAD1.InputLen = 1
  409.    End Select
  410. err:
  411. End Sub



  412. Private Sub MSCommAD2_OnComm()      'AD专用通道2
  413.   Dim buffer() As Byte
  414.   Static ReFlag As Boolean
  415.   Dim DianYa As Single      '存放当前的AD转换电压值
  416.   
  417.   Static DianYaA As Single   '存放AD转换的旧电压值
  418.   
  419.   On Error GoTo err

  420.   Select Case MSCommAD2.CommEvent
  421.   Case comEvReceive
  422.           buffer = MSCommAD2.Input
  423.            If ReFlag = False Then
  424.                 If buffer(0) = &H55 Then
  425.             
  426.                     MSCommAD2.InputLen = 470
  427.                     MSCommAD2.RThreshold = 470
  428.                     ReFlag = True
  429.                 End If
  430.                 Exit Sub
  431.           End If
  432.           Pic4.Cls
  433.           Call DRAWQX_B
  434.           For I = 0 To UBound(buffer)
  435.                        DianYa = buffer(I) * 29.99 / 255    '29.99是单片机基准电压需根据实际修改
  436.                        
  437.                        If DianHaoAY = 1 Then
  438.                                Pic4.DrawStyle = 0
  439.                                Pic4.DrawWidth = 2
  440.                                Pic4.Line (DianHaoAY * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYa * WDSTEP)-(DianHaoAY * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYa * WDSTEP), RGB(0, 0, 255)
  441.                            Else
  442.                                Pic4.DrawStyle = 0
  443.                                Pic4.DrawWidth = 2
  444.                                Pic4.Line (DianHaoAY * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYaA * WDSTEP)-(DianHaoY * 0.2 * XSTEP + 5 * XSTEP, WDEND - DianYa * WDSTEP), RGB(0, 0, 255)
  445.                       End If
  446.                     '****************************************************************************
  447.                      DianYaA = DianYa       '记录电压
  448.                      DianHaoAY = DianHaoY     '记录点号
  449.                      DianHaoY = DianHaoY + 1
  450.             Next
  451.                     DianHaoAY = 1
  452.                     DianHaoY = 1
  453.                     ReFlag = False
  454.                     timery = 0
  455.                     MSCommAD2.InputLen = 0
  456.                     buffer = MSCommAD2.Input
  457.                     MSCommAD2.InputLen = 1
  458.    End Select
  459. err:
  460. End Sub


  461. Private Sub Option1_Click()
  462.       Pic4.ScaleWidth = 50000
  463. End Sub

  464. Private Sub Option2_Click()
  465.       Pic4.ScaleWidth = 100000
  466. End Sub

  467. Private Sub Option3_Click()
  468.      Pic2.ScaleWidth = 50000
  469. End Sub

  470. Private Sub Option4_Click()
  471.      Pic2.ScaleWidth = 100000
  472. End Sub
  473. Private Sub Option5_Click()
  474.      Pic2.ScaleWidth = 200000
  475. End Sub

  476. Private Sub Option6_Click()
  477.      Pic4.ScaleWidth = 200000
  478. End Sub

  479. Private Sub Timer1_Timer()
  480.     timerz = timerz + 1
  481.     If timerz >= 10 Then
  482.        timerz = 0
  483.        Pic2.Cls
  484.        Call DRAWQX_A
  485.       
  486.        Text1(0).Text = ""      '更换下一个传感器中途清空数据
  487.        Text2(2).Text = ""
  488.        Text2(3).Text = ""
  489.        Text4.Text = ""
  490.       
  491.        Text8.Text = ""
  492.        Text9.Text = ""
  493.        Text10.Text = ""
  494.       
  495.       
  496.        Text3(0).Text = ""
  497.        Text3(1).Text = ""
  498.        Text3(2).Text = ""
  499.        Text3(3).Text = ""
  500.        Text3(0).BackColor = &H80000005
  501.        Text3(1).BackColor = &H80000005
  502.        Text3(2).BackColor = &H80000005
  503.        Text3(3).BackColor = &H80000005
  504.             
  505.       
  506.        Text1(0).BackColor = &HFFFFFF
  507.        QianLiuLiang_Z = 0
  508.         
  509.         
  510.        Zuo1_Liu = 0       '1L额外处理(左用户流量)
  511.        Zuo1_Pin = 0     '1L额外处理(左用户频率)
  512.    
  513.     End If
  514. End Sub
  515. Private Sub Timer2_Timer()
  516.     timery = timery + 1
  517.     If timery >= 10 Then
  518.        timery = 0
  519.        Pic4.Cls
  520.        Call DRAWQX_B
  521.       
  522.        Text1(1).Text = ""         '更换下一个传感器中途清空数据
  523.        Text2(4).Text = ""
  524.        Text2(5).Text = ""
  525.        Text6.Text = ""
  526.       
  527.        Text7.Text = ""
  528.        Text11.Text = ""
  529.        Text12.Text = ""
  530.       
  531.        Text5(0).Text = ""
  532.        Text5(1).Text = ""
  533.        Text5(2).Text = ""
  534.        Text5(3).Text = ""
  535.        Text5(0).BackColor = &H80000005
  536.        Text5(1).BackColor = &H80000005
  537.        Text5(2).BackColor = &H80000005
  538.        Text5(3).BackColor = &H80000005
  539.      
  540.        Text1(1).BackColor = &HFFFFFF
  541.        QianLiuLiang_Y = 0
  542.    
  543.        You1_Liu = 0       '1L额外处理(右用户流量)
  544.        You1_Pin = 0    '1L额外处理(右用户频率)
  545.      
  546.     End If
  547. End Sub

  548. Private Sub YouXuanZe_Click()
  549.       
  550. End Sub

  551. Private Sub ZuoXianZe_Click()

  552. End Sub

  553. Private Sub MSComm1_OnComm()

  554.   Static CiShu As Integer              '记录取平均值次数
  555.   Static Shape_Flag(0 To 3) As Boolean
  556.   Static XianShiCS   As Integer              '显示次数控制
  557.   Dim buffer() As Byte
  558.   Dim ZhouQuZhi As Long                  '真实周期值
  559.   Dim PinLiZhi As Single                 '真实频率值
  560.   Dim ZhouQu(5) As Long          '接收到的频率字节
  561.   
  562.   'On Error GoTo err
  563.   Select Case MSComm1.CommEvent
  564.   Case comEvReceive
  565.              buffer = MSComm1.Input
  566.              MSComm1.InBufferCount = 0
  567.              MSComm1.OutBufferCount = 0
  568.              ZhouQu(0) = buffer(0)     '单片机通道信息(0-3)
  569.              ZhouQu(1) = buffer(1)
  570.              ZhouQu(2) = buffer(2)
  571.              ZhouQu(3) = buffer(3)
  572.              ZhouQu(4) = buffer(4)
  573.             
  574.               '************************************************************************************
  575.              '-------------在这里加入校验
  576.              '*************************************************************************************
  577.             
  578.             
  579.              '************************************************************************************
  580.              '接收到的字节转换成真实值
  581.              '*************************************************************************************
  582.              ZhouQuZhi = ZhouQu(1) * 16777216 + ZhouQu(2) * 65536 + ZhouQu(3) * 256 + ZhouQu(4)
  583.              ZhouQuZhi = ZhouQuZhi * 12 / 11.0592            '单位:uS
  584.              PinLiZhi = 1000000 / ZhouQuZhi
  585.             
  586.              If Shape_Flag(ZhouQu(0)) = False Then
  587.                    Shape_Flag(ZhouQu(0)) = True
  588.                    Shape1(ZhouQu(0)).FillColor = RGB(0, 255, 0)
  589.                  Else
  590.                    Shape_Flag(ZhouQu(0)) = False
  591.                    Shape1(ZhouQu(0)).FillColor = RGB(255, 255, 255)
  592.              End If
  593.              '*******************************************************************************
  594.           '显示取平均值
  595.             Data3.RecordSource = "左流量记录表"
  596.             Data3.Refresh
  597.       
  598.             If PinLiZhi > 0 Then
  599.                 If CiShu Mod 4 = 0 Then
  600.                         Data3.Recordset.AddNew
  601.                         Data3.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  602.                     ElseIf CiShu < 4 Then
  603.                         Data3.Recordset.MoveFirst
  604.                         Data3.Refresh
  605.                         Data3.Recordset.Edit
  606.                         Data3.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  607.                     ElseIf CiShu > 4 And CiShu < 8 Then
  608.                         Data3.Recordset.MoveFirst
  609.                         Data3.Recordset.Move 1
  610.                         Data3.Recordset.Edit
  611.                         Data3.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  612.                              
  613.                    ElseIf CiShu > 8 And CiShu < 12 Then
  614.                        Data3.Recordset.MoveFirst
  615.                         Data3.Recordset.Move 2
  616.                         Data3.Recordset.Edit
  617.                         Data3.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  618.                                    
  619.                   ElseIf CiShu > 12 And CiShu < 16 Then
  620.                       Data3.Recordset.MoveFirst
  621.                         Data3.Recordset.Move 3
  622.                         Data3.Recordset.Edit
  623.                         Data3.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  624.                 End If
  625.                 Data3.Recordset.Update
  626.                
  627.                 CiShu = CiShu + 1
  628.                 If CiShu >= 4 * 4 Then  '4行(4条记录)4列
  629.                      CiShu = 0
  630.                      Data3.RecordSource = "select avg(JiaoZhun10) as JZ10 FROM 左流量记录表 WHERE JiaoZhun10>0"
  631.                      Data3.Refresh
  632.                      Text2(0).Text = Format(Data3.Recordset("JZ10"), "0.00") & " Hz"
  633.                      
  634.                      Data3.RecordSource = "select avg(JiaoZhun50) as JZ50 FROM 左流量记录表 WHERE JiaoZhun50>0"
  635.                      Data3.Refresh
  636.                      Text2(1).Text = Format(Data3.Recordset("JZ50"), "0.00") & " Hz"
  637.                      
  638.                      Data3.RecordSource = "select avg(YongHu) as YH FROM 左流量记录表 WHERE YongHu>0"
  639.                      Data3.Refresh
  640.                      Text2(2).Text = Format(Data3.Recordset("YH"), "0.00") & " Hz"
  641.                      
  642.                      Data3.RecordSource = "select avg(LiuLiang) as LL FROM 左流量记录表 WHERE LiuLiang>0"
  643.                      Data3.Refresh
  644.                      Text2(3).Text = Format(Data3.Recordset("LL"), "0.00") & " Hz"
  645.                      
  646.                      Text4.Text = Format(60 * Val(Text2(3).Text) / 1609.954 * 0.94, "0.00")   '显示当前流量值
  647.                   
  648.                   
  649.                      Data3.RecordSource = "左流量记录表"
  650.                      Data3.Refresh
  651.                      Data3.Recordset.MoveFirst
  652.                      Data3.Recordset.Delete
  653.                      
  654.                      CiShu = 12
  655.                      
  656.                      XianShiCS = XianShiCS + 1    '显示快慢控制
  657.                      If XianShiCS >= 3 Then
  658.                          XianShiCS = 0
  659.                          Text9.Text = Text2(2).Text
  660.                          Text10.Text = Text4.Text
  661.                          Text8.Text = Format(3600 * Val(Text2(3).Text) / 1609.954 * 0.94, "0.00") & "  L/H"
  662.                      End If
  663.                 End If
  664.             End If
  665.             
  666.         '*****************************************************************************************
  667.             
  668.         '合格判断
  669.         '****************************************************************************************
  670.         '界面上
  671.         '   Abs(当前流量- 标准流量) <= 标准流量 * 2%  And  (Abs(当前流量- 标准流量) < Abs(前次流量-标准流量)) Then
  672.          If Abs(Val(Text4.Text) - 1) <= 1 * 0.2 And (Abs(Val(Text4.Text) - 1) < Abs(QianLiuLiang_Z - 1)) Then
  673.                 Text3(0).Text = Text2(2).Text            '1L/H
  674.          End If
  675.          If Abs(Val(Text4.Text) - 3) <= 3 * 0.03 And (Abs(Val(Text4.Text) - 3) < Abs(QianLiuLiang_Z - 3)) Then
  676.                 Text3(1).Text = Text2(2).Text           '3L/H
  677.          End If
  678.          If Abs(Val(Text4.Text) - 6) <= 6 * 0.025 And (Abs(Val(Text4.Text) - 6) < Abs(QianLiuLiang_Z - 6)) Then
  679.                 Text3(2).Text = Text2(2).Text         '5L/H
  680.          End If
  681.          If Abs(Val(Text4.Text) - 15) <= 15 * 0.015 And (Abs(Val(Text4.Text) - 15) < Abs(QianLiuLiang_Z - 15)) Then
  682.                 Text3(3).Text = Text2(2).Text        '15L/H
  683.          End If
  684.          
  685.          QianLiuLiang_Z = Val(Text4.Text)        '记录本次流量值
  686.         
  687.         '********************************************************************************
  688.         
  689.         If Combo1.Text <> "请选择型号" Then
  690.         
  691.                 Data1.RecordSource = Combo1.Text
  692.                 Data1.Refresh
  693.                
  694.                 '1L/min额外处理
  695.                 If (Val(Text3(0).Text) > Data1.Recordset.Fields(0) And Val(Text3(0).Text) < Data1.Recordset.Fields(1)) = False Then
  696.                           If ZhouQu(0) = 2 Then     '用户传感器左
  697.                               Zuo1_Pin = PinLiZhi
  698.                           End If
  699.                
  700.                           If ZhouQu(0) = 3 Then    '用户流量左
  701.                                Zuo1_Liu = Format(60 * PinLiZhi / 1609.954 * 0.94, "0.00")
  702.                           End If
  703.                           If Zuo1_Pin > 1 And Zuo1_Liu < 1.2 Then
  704.                                 Text3(0).Text = Format(Zuo1_Pin, "0.00")
  705.                                 If Val(Text4.Text) = 0 Then Text4.Text = Format(Zuo1_Liu, "0.00")
  706.                           End If
  707.                End If
  708.                
  709.                
  710.                '合格判断
  711.                If Val(Text3(0).Text) <> 0 And Val(Text3(1).Text) <> 0 And Val(Text3(2).Text) <> 0 And Val(Text3(3).Text) <> 0 Then
  712.                         If Val(Text3(0).Text) > Data1.Recordset.Fields(0) And Val(Text3(0).Text) < Data1.Recordset.Fields(1) And _
  713.                            Val(Text3(1).Text) > Data1.Recordset.Fields(2) And Val(Text3(1).Text) < Data1.Recordset.Fields(3) And _
  714.                            Val(Text3(2).Text) > Data1.Recordset.Fields(4) And Val(Text3(2).Text) < Data1.Recordset.Fields(5) And _
  715.                            Val(Text3(3).Text) > Data1.Recordset.Fields(6) And Val(Text3(3).Text) < Data1.Recordset.Fields(7) Then
  716.                         
  717.                                 Text1(0).Text = "合 格"
  718.                                 Text1(0).BackColor = RGB(0, 255, 0)
  719.                                 Text3(0).BackColor = &H80000005
  720.                                 Text3(1).BackColor = &H80000005
  721.                                 Text3(2).BackColor = &H80000005
  722.                                 Text3(3).BackColor = &H80000005
  723.                             Else
  724.                                Text1(0).Text = "不 合 格"
  725.                                Text1(0).BackColor = RGB(255, 0, 0)
  726.                                If (Val(Text3(0).Text) > Data1.Recordset.Fields(0) And Val(Text3(0).Text) < Data1.Recordset.Fields(1)) = False Then Text3(0).BackColor = RGB(255, 0, 0)
  727.                                If (Val(Text3(1).Text) > Data1.Recordset.Fields(2) And Val(Text3(1).Text) < Data1.Recordset.Fields(3)) = False Then Text3(1).BackColor = RGB(255, 0, 0)
  728.                                If (Val(Text3(2).Text) > Data1.Recordset.Fields(4) And Val(Text3(2).Text) < Data1.Recordset.Fields(5)) = False Then Text3(2).BackColor = RGB(255, 0, 0)
  729.                                If (Val(Text3(3).Text) > Data1.Recordset.Fields(6) And Val(Text3(3).Text) < Data1.Recordset.Fields(7)) = False Then Text3(3).BackColor = RGB(255, 0, 0)
  730.                               
  731.                         End If
  732.                  End If
  733.         End If
  734.       
  735.         '********************************************************************************
  736.         
  737.       
  738.    End Select
  739. 'err:         Exit Sub
  740. End Sub

  741. Private Sub MSComm2_OnComm()
  742.   Static CiShu As Integer              '记录取平均值次数
  743.   Static Shape_Flag(0 To 3) As Boolean
  744.   Static XianShiCS   As Integer              '显示次数控制
  745.   Dim buffer() As Byte
  746.   Dim ZhouQuZhi As Long                  '真实周期值
  747.   Dim PinLiZhi As Single                 '真实频率值
  748.   Dim ZhouQu(5) As Long          '接收到的频率字节
  749.    
  750.   On Error GoTo err
  751.   Select Case MSComm2.CommEvent
  752.   Case comEvReceive
  753.           buffer = MSComm2.Input
  754.           MSComm2.InBufferCount = 0
  755.           MSComm2.OutBufferCount = 0
  756.           ZhouQu(0) = buffer(0)     '单片机通道信息(0-3)
  757.           ZhouQu(1) = buffer(1)
  758.           ZhouQu(2) = buffer(2)
  759.           ZhouQu(3) = buffer(3)
  760.           ZhouQu(4) = buffer(4)
  761.          
  762.            '************************************************************************************
  763.           '-------------在这里加入校验
  764.           '*************************************************************************************
  765.          
  766.           '************************************************************************************
  767.           '接收到的字节转换成真实值
  768.           '*************************************************************************************
  769.           ZhouQuZhi = ZhouQu(1) * 16777216 + ZhouQu(2) * 65536 + ZhouQu(3) * 256 + ZhouQu(4)
  770.           ZhouQuZhi = ZhouQuZhi * 12 / 11.0592            '单位:uS
  771.           PinLiZhi = 1000000 / ZhouQuZhi
  772.       
  773.           If Shape_Flag(ZhouQu(0)) = False Then
  774.                 Shape_Flag(ZhouQu(0)) = True
  775.                 Shape2(ZhouQu(0)).FillColor = &HFF80FF   'RGB(200, 200, 0)
  776.               Else
  777.                 Shape_Flag(ZhouQu(0)) = False
  778.                 Shape2(ZhouQu(0)).FillColor = RGB(255, 255, 255)
  779.           End If
  780.         
  781.           '*******************************************************************************
  782.           '显示取平均值
  783.           Data4.RecordSource = "右流量记录表"
  784.           Data4.Refresh
  785.       
  786.           If PinLiZhi > 0 Then
  787.                 If CiShu Mod 4 = 0 Then
  788.                         Data4.Recordset.AddNew
  789.                         Data4.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  790.                         
  791.                     ElseIf CiShu < 4 Then
  792.                         Data4.Recordset.MoveFirst
  793.                         Data4.Refresh
  794.                         Data4.Recordset.Edit
  795.                         Data4.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  796.                         
  797.                     ElseIf CiShu > 4 And CiShu < 8 Then
  798.                         Data4.Recordset.MoveFirst
  799.                         Data4.Recordset.Move 1
  800.                         Data4.Recordset.Edit
  801.                         Data4.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  802.                              
  803.                    ElseIf CiShu > 8 And CiShu < 12 Then
  804.                         Data4.Recordset.MoveFirst
  805.                         Data4.Recordset.Move 2
  806.                         Data4.Recordset.Edit
  807.                         Data4.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  808.                                    
  809.                   ElseIf CiShu > 12 And CiShu < 16 Then
  810.                         Data4.Recordset.MoveFirst
  811.                         Data4.Recordset.Move 3
  812.                         Data4.Recordset.Edit
  813.                         Data4.Recordset.Fields(ZhouQu(0)) = Format(PinLiZhi, "0.00")
  814.                 End If
  815.                 Data4.Recordset.Update
  816.                
  817.                 CiShu = CiShu + 1
  818.                 If CiShu >= 4 * 4 Then  '4行(4条记录)4列
  819.                      CiShu = 0
  820.                      Data4.RecordSource = "select avg(JiaoZhun10) as JZ10 FROM 右流量记录表 WHERE JiaoZhun10>0"
  821.                      Data4.Refresh
  822.                      Text2(6).Text = Format(Data4.Recordset("JZ10"), "0.00") & " Hz"
  823.                      
  824.                      Data4.RecordSource = "select avg(JiaoZhun50) as JZ50 FROM 右流量记录表 WHERE JiaoZhun50>0"
  825.                      Data4.Refresh
  826.                      Text2(7).Text = Format(Data4.Recordset("JZ50"), "0.00") & " Hz"
  827.                      
  828.                      Data4.RecordSource = "select avg(YongHu) as YH FROM 右流量记录表 WHERE YongHu>0"
  829.                      Data4.Refresh
  830.                      Text2(4).Text = Format(Data4.Recordset("YH"), "0.00") & " Hz"
  831.                      
  832.                      Data4.RecordSource = "select avg(LiuLiang) as LL FROM 右流量记录表 WHERE LiuLiang>0"
  833.                      Data4.Refresh
  834.                      Text2(5).Text = Format(Data4.Recordset("LL"), "0.00") & " Hz"
  835.                     
  836.                   
  837.                      Text6.Text = Format(60 * Val(Text2(5).Text) / 1608.987 * 0.94, "0.00")               '显示当前流量值
  838.                 '     Text7.Text = Format(3600 * Val(Text2(5).Text) / 1608.987 * 0.94, "0.00") & "  L/H"
  839.                                          
  840.                      Data4.RecordSource = "右流量记录表"    '前面Data4.RecordSource<>"右流量记录表",所有必须有此句
  841.                      Data4.Refresh                         '
  842.                      Data4.Recordset.MoveFirst
  843.                      Data4.Recordset.Delete
  844.                      CiShu = 12
  845.                   
  846.                      XianShiCS = XianShiCS + 1    '显示快慢控制
  847.                      If XianShiCS >= 3 Then
  848.                          XianShiCS = 0
  849.                          Text11.Text = Text2(4).Text
  850.                          Text12.Text = Text6.Text
  851.                          Text7.Text = Format(3600 * Val(Text2(5).Text) / 1608.987 * 0.94, "0.00") & "  L/H"
  852.                      End If
  853.                 End If
  854.             End If
  855.         '*****************************************************************************************
  856.         '合格判断
  857.         '****************************************************************************************
  858.             
  859.          '界面下
  860.          If Abs(Val(Text6.Text) - 1) <= 1 * 0.2 And (Abs(Val(Text6.Text) - 1) < Abs(QianLiuLiang_Y - 1)) Then Text5(0).Text = Text2(4).Text             '1L/H
  861.          If Abs(Val(Text6.Text) - 3) <= 3 * 0.03 And (Abs(Val(Text6.Text) - 3) < Abs(QianLiuLiang_Y - 3)) Then Text5(1).Text = Text2(4).Text           '3L/H
  862.          If Abs(Val(Text6.Text) - 6) <= 6 * 0.025 And (Abs(Val(Text6.Text) - 6) < Abs(QianLiuLiang_Y - 6)) Then Text5(2).Text = Text2(4).Text         '5L/H
  863.          If Abs(Val(Text6.Text) - 15) <= 15 * 0.015 And (Abs(Val(Text6.Text) - 15) < Abs(QianLiuLiang_Y - 15)) Then Text5(3).Text = Text2(4).Text         '15L/H
  864.    
  865.          QianLiuLiang_Y = Val(Text6.Text)        '记录本次流量值
  866.         
  867.         '********************************************************************************
  868.         
  869.       
  870.         If Combo2.Text <> "请选择型号" Then
  871.                 Data2.RecordSource = Combo2.Text
  872.                 Data2.Refresh
  873.                 '1L/min额外处理
  874.                 If (Val(Text5(0).Text) > Data2.Recordset.Fields(0) And Val(Text5(0).Text) < Data2.Recordset.Fields(1)) = False Then   'Text5(0).Text为空或平均值不合格
  875.                           If ZhouQu(0) = 2 Then     '用户传感器
  876.                               You1_Pin = PinLiZhi
  877.                           End If
  878.                
  879.                           If ZhouQu(0) = 3 Then    '用户流量
  880.                                You1_Liu = Format(60 * PinLiZhi / 1608.987 * 0.94, "0.00")
  881.                           End If
  882.                           
  883.                           If You1_Pin > 1 And You1_Liu < 1.2 Then
  884.                                 Text5(0).Text = Format(You1_Pin, "0.00")
  885.                                 If Val(Text6.Text) = 0 Then Text6.Text = Format(You1_Liu, "0.00")   'Text6(0).Text为空
  886.                           End If
  887.                End If
  888.                
  889.                If Val(Text5(0).Text) <> 0 And Val(Text5(1).Text) <> 0 And Val(Text5(2).Text) <> 0 And Val(Text5(3).Text) <> 0 Then
  890.                         If Val(Text5(0).Text) > Data2.Recordset.Fields(0) And Val(Text5(0).Text) < Data2.Recordset.Fields(1) And _
  891.                            Val(Text5(1).Text) > Data2.Recordset.Fields(2) And Val(Text5(1).Text) < Data2.Recordset.Fields(3) And _
  892.                            Val(Text5(2).Text) > Data2.Recordset.Fields(4) And Val(Text5(2).Text) < Data2.Recordset.Fields(5) And _
  893.                            Val(Text5(3).Text) > Data2.Recordset.Fields(6) And Val(Text5(3).Text) < Data2.Recordset.Fields(7) Then
  894.                         
  895.                                 Text1(1).Text = "合 格"
  896.                                 Text1(1).BackColor = RGB(0, 255, 0)
  897.                                 Text5(0).BackColor = &H80000005
  898.                                 Text5(1).BackColor = &H80000005
  899.                                 Text5(2).BackColor = &H80000005
  900.                                 Text5(3).BackColor = &H80000005
  901.                             Else
  902.                                Text1(1).Text = "不 合 格"
  903.                                Text1(1).BackColor = RGB(255, 0, 0)
  904.                                If (Val(Text5(0).Text) > Data2.Recordset.Fields(0) And Val(Text5(0).Text) < Data2.Recordset.Fields(1)) = False Then Text5(0).BackColor = RGB(255, 0, 0)
  905.                                If (Val(Text5(1).Text) > Data2.Recordset.Fields(2) And Val(Text5(1).Text) < Data2.Recordset.Fields(3)) = False Then Text5(1).BackColor = RGB(255, 0, 0)
  906.                                If (Val(Text5(2).Text) > Data2.Recordset.Fields(4) And Val(Text5(2).Text) < Data2.Recordset.Fields(5)) = False Then Text5(2).BackColor = RGB(255, 0, 0)
  907.                                If (Val(Text5(3).Text) > Data2.Recordset.Fields(6) And Val(Text5(3).Text) < Data2.Recordset.Fields(7)) = False Then Text5(3).BackColor = RGB(255, 0, 0)
  908.                               
  909.                         End If
  910.                  End If
  911.         End If
  912.         
  913.         '********************************************************************************
  914.       
  915.    End Select
  916. err:      Exit Sub
  917. End Sub
复制代码





回复

使用道具 举报

ID:275997 发表于 2018-1-14 22:35 | 显示全部楼层
嗯嗯不错。真的很好就有
回复

使用道具 举报

ID:474810 发表于 2019-2-8 21:51 | 显示全部楼层
太好了,太有借鉴意义了
回复

使用道具 举报

ID:503309 发表于 2019-5-8 21:04 | 显示全部楼层
你好,我想问一下,这个上位机软件不能用,打开就是无效的端口号,但是我转了一个串口了啊,请问是什么原因呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表