⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wenducaiji.~pas

📁 显示热传感器18b20测得的实时温度
💻 ~PAS
字号:
unit wenducaiji;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, Buttons, Grids, DBGrids, ExtCtrls,
  OleCtrls, MSCommLib_TLB,StrUtils,math, sgr_def, sgr_data;

type
  Twdcj = class(TForm)
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    Panel2: TPanel;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    CS_Edit: TEdit;
    SpeedButton5: TSpeedButton;
    DataSource1: TDataSource;
    ADOConnectionwdcj: TADOConnection;
    ADOQuerywdcj: TADOQuery;
    Comm1: TMSComm;
    Timer1: TTimer;
    Label3: TLabel;
    Edit2: TEdit;
    Timer2: TTimer;
    Label4: TLabel;
    Edit3: TEdit;
    Timer3: TTimer;
    ADOQuerywdcj1: TADOQuery;
    Memo1: TMemo;
    sp_XYPlot1: Tsp_XYPlot;
    sp_XYLine1: Tsp_XYLine;
    Bevel1: TBevel;
    Label5: TLabel;
    Label6: TLabel;
    procedure outhere;
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Comm1Comm(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  wdcj: Twdcj;

implementation

var
   Datah, Datal:Byte;
   runtime,m:integer;
    x:integer;
{$R *.dfm}
 function myround(const yuan: double;const pp: Integer):double;
//yuan:原浮点数,PP保留 小数点后第几位
var
p,l,m,l2:Longint;
s:string; // 原浮点数
sq:string; // 小数点前
sh:string;//小数点后
begin
if yuan=0 then exit;// 原浮点数 0
if pp<0 then exit; //非法小数点后第几位
s:=floattostr(yuan);
p:=pos('.',s); //小数点位置
sq:=midstr(s,1,p-1);
sh:=midstr(s,p+1,length(s)-length(sq)-1);
l:=length(sh);//小数位数
l2:=length(sq);//整数位数
if pp>=l then
begin//0
result:=strtofloat(s);
exit;//比如 11。06 要保留到 小数点后第3位显然 不合理
end;//
{ if pp=l then //比如 11。06 要保留到 小数点后第2位不用处理 直接返回
begin//1
Result:=s;
exit;
end;//1 }
if pp<l then //比如 11。06 要保留到 小数点后第1位 ,。。。
begin//2
m:=strtoint(sh[pp+1]);
if m>=5 then
begin
if pp>=1 then //保留到 小数点后第1,2。。。位
begin//3
sh:=midstr(sh,1,pp);
sh := inttostr(strtoint(sh)+1);
if length(sh)>pp then
begin
sh:= midstr(sh,2,pp);
sq:= inttostr(strtoint(sq)+1);
end;
Result:=strtofloat(sq+'.'+sh);
exit;
end//3
else //保留到 小数点后第0位
begin//4
sq[l2]:=chr(ord(sq[l2])+1);
Result:=strtofloat(sq);
exit;
end;//4
end
else
begin
if pp>=1 then //保留到 小数点后第1,2。。。位
begin//3
sh:=midstr(sh,1,pp);
Result:=strtofloat(sq+'.'+sh);
exit;
end//3
else //保留到 小数点后第0位
begin//4
Result:=strtofloat(sq);
exit;
end;//4
end;
end;//2
end;

procedure Twdcj.SpeedButton5Click(Sender: TObject);
begin
close;
end;

procedure Twdcj.SpeedButton1Click(Sender: TObject);
begin
 If Comm1.PortOpen = True Then
     showmessage('串口已打开,勿重复操作!')
 Else
    begin
    Comm1.PortOpen := True  ;
    showmessage('串口已打开!');
    Timer2.Enabled := False;
    Timer1.Enabled:= True;
   end;
end;

procedure Twdcj.SpeedButton4Click(Sender: TObject);
begin
 If Comm1.PortOpen = False Then
   showmessage('串口已关闭,勿重复操作!')
  else
      begin
      Comm1.PortOpen := False;
      showmessage('串口已关闭!');
       Timer1.Enabled:= False;
       end;
          Timer2.Enabled:= True;
end;

procedure Twdcj.FormShow(Sender: TObject);
begin
        m:=0;
        ADOQuerywdcj.Close;
        ADOQuerywdcj.SQL.Clear;
        ADOQuerywdcj.SQL.Add('Select * from 采集表');
        ADOQuerywdcj.Open;
        DBGrid1.Fields[0].DisplayLabel:='编号';
        DBGrid1.Fields[1].DisplayLabel:='时间';
        DBGrid1.Fields[2].DisplayLabel:='温度';
        DBGrid1.Fields[3].DisplayLabel:='温度单位';
        DBGrid1.Fields[0].DisplayWidth:=10;
        DBGrid1.Fields[1].DisplayWidth:=20;
        DBGrid1.Fields[2].DisplayWidth:=18;
        DBGrid1.Fields[3].DisplayWidth:=18;
    If Comm1.PortOpen = True Then
    showmessage('请关闭串口!');
    Comm1.CommPort := 1;                     //设置串口1
    Comm1.Settings := '9600,n,8,1' ;          //波特率:9600 奇校验,8位数据,1位停止位
    Comm1.InputLen := 6  ;                    //一次读取接收缓冲区的一个字符
    Comm1.InputMode := comInputModeBinary;    //设置位二进制格式
    Comm1.InBufferSize := 4096;               //设置接收缓冲区为256字节
    Comm1.OutBufferSize := 4096;             //设置发送缓冲区为256字节
    Comm1.InBufferCount := 0 ;                //清空输入缓冲区
    Comm1.OutBufferCount := 0 ;               //清空输出缓冲区
    Comm1.SThreshold := 1 ;                   //发送缓冲区空触发发送事件
    Comm1.RThreshold := 5 ;                  //每X个字符到接收缓冲区引起触发接收事件
    Comm1.PortOpen := True ;                 //打开串口1
    Edit1.Text:=inttostr(5);
    CS_Edit.Text:=inttostr(5);
    Comm1.PortOpen := False;
end;

procedure Twdcj.Comm1Comm(Sender: TObject);
var
temp:Byte;
DataFromCom:Integer ;//从串口读过来的实时值
DataFromComLast:Integer;//上次的串口值
TimeCount:Integer;
 Inbyte:array of byte;
 run_Time, set_Time:Longint;
 cir,i,n,f:Integer;
 flag : Boolean ;
begin
f:=0;
n:=10;
    if Comm1.CommEvent=comEvReceive then  //在CommEvent中接收数据
    begin
    Timer2.Enabled := False;
      SetLength(Inbyte,n);
     Inbyte:=Comm1.Input;
     For i:= 1 To 4  do
     begin
     If (Inbyte[0]=$7E) And (Inbyte[1]=$7E) Then
     begin
     Datah := Inbyte[2] And 3;
     Datal := Inbyte[3];
     Outhere;
     f:=1;
     break;
     end
     Else
     begin
     temp:= Inbyte[0];
     Inbyte[0]:= Inbyte[1];
     Inbyte[1]:= Inbyte[2];
     Inbyte[2]:= Inbyte[3];
     Inbyte[3]:= temp;
     end;
     end;
     if f=0 then
     begin
      showmessage('数据错误!');
      end;
    end;
    end;

procedure Twdcj.Outhere;
 var
 temp_run :string;
 t:string;
 f,y:double;
 begin
      m:=m+1;
      f:=myround(((Datah * 256 + Datal)*0.0625), 1);
      t:=floattostr(myround(((Datah * 256 + Datal)*0.0625), 1)) + '℃';
      edit2.Text:=t;
      if m<=strtoint(CS_edit.Text) then
      begin
      with ADOQuerywdcj do
      begin
      close;
      sql.clear;
      sql.add('insert into 采集表(时间,温度,温度单位)'
      +'values (:1,:2,:3)');
    parameters.parambyname('1').value:=''+Edit3.Text+'';
    parameters.parambyname('2').value:=f;
    parameters.parambyname('3').value:='℃';
    execsql;
    end;
    memo1.Lines.Add(edit3.Text+'  '+floattostr(f)) ;
     if f<30 then
    begin
     y:=f ;
     sp_XYLine1.LineAttr.Width:=4;
     sp_XYLine1.LineAttr.Color:=clgreen;
     sp_XYLine1.InsertXY(0,x,y);
     x:=x+1;
    end
     else
   begin
     y:=f ;
     sp_XYLine1.LineAttr.Width:=4;
     sp_XYLine1.LineAttr.Color:=clred;
     sp_XYLine1.InsertXY(0,x,y);
     x:=x+1;
     end;
     end
     else
     begin
     Comm1.PortOpen:= False;
     showmessage('已采集完温度,串口关闭!');
     edit2.Text:='无法收到温度';
     end;
 end;

procedure Twdcj.Timer1Timer(Sender: TObject);
begin
runtime:=runtime+1;
if runtime=strtoint(Edit1.Text) then
begin
    runtime:=0;
end;
end;

procedure Twdcj.Timer2Timer(Sender: TObject);
begin
Edit2.Text:='无法收到温度';
end;



procedure Twdcj.Timer3Timer(Sender: TObject);
begin
   edit3.text:=datetimetostr(now);
end;

procedure Twdcj.SpeedButton2Click(Sender: TObject);
begin
 with ADOQuerywdcj do
      begin
        Close;
        SQL.Clear;
        SQL.Add('delete from 采集表 where 1=1');
        ExecSQL;
      end;
end;

procedure Twdcj.SpeedButton3Click(Sender: TObject);
begin
Self.OnShow(Sender);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -