求助,怎样在DELPHI中控制一个继电器? 单位领导要求设计一个简单的设备,用计算机串口或PS2口控制220V电源的开关,没做过硬件相关的东西,不知如何下手,请教大家,帮忙帮忙!请先介绍大概的过程1、使用什么硬件(什么芯片,或者模块)2、是否需要特殊的软件,或是DELPHI本身就可以做出来3、其它谢谢先 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要可编程的下位机,用PLC比较方便些,不过贵,单片机的话,你活就有得干了,做板比写程序花的时间会多很多 不难的!俺前年弄过一个那样的东西!传感器检测是否有东西通过!然后两个扫描头读取数据!数据有误的话!机械手把箱子拿走!……买硬件的时候带的光盘里一般有Demo的!简单改改就行! 串口編程...1.條件:買一個40-~50元的继电器(支持5V电压之类);2.動手:串口中的DTR针脚可以输出你需要的电压,你焊两根线,一跟连接dtr(4号针脚),一跟连接地线(一般是五号针脚),然后你编程升高DTR的电位,就可以打开继电器(5V),降低就关闭;3.代碼說話:给你个例子,串口编程控制dtr和rts针脚电压,rts也可以输出一个5-8V的电压 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) rdCOM: TRadioGroup; Label1: TLabel; Label2: TLabel; btnOpenPort: TButton; btnEnd: TButton; spDTR: TShape; spRTS: TShape; btnDTR: TButton; btnRTS: TButton; procedure btnOpenPortClick(Sender: TObject); procedure btnEndClick(Sender: TObject); procedure btnDTRClick(Sender: TObject); procedure btnRTSClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } DTRState:Boolean; RTSState:Boolean; DOValue:DWORD; public { Public declarations } procedure OpenComm; //打开通信端口 end; var Form1: TForm1; hComm: THandle; implementation {$R *.DFM} //以下是打开通信端口的程序 procedure TForm1.btnOpenPortClick(Sender: TObject); begin //若通信端口已打开,则不需要再打开 if (hComm <> 0) then begin Messagedlg( '通信端口已打开,不需再开 ',mtError,[mbOK],0); exit; end; OpenComm; //打开通信端口的子程序 //先将DTR/RTS的电压降成低电压 EscapeCommFunction( hComm, CLRDTR); //将DTR降为低电压 EscapeCommFunction( hComm, CLRRTS); //将RTS降为低电压 end; //以下是打开通信端口的实际程序代码,采用API procedure TForm1.OpenComm; var cc:TCOMMCONFIG; //定义通信组态变量 Temp:string; begin // 选择所要打开的COM Temp:= 'COM '+inttostr(rdcom.ItemIndex+1); // 以Create函数打开COM hComm:=CreateFile(PChar(Temp), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); // 判断COM 是否顺利打开 if (hComm = INVALID_HANDLE_VALUE) then begin Messagedlg( '打开通信端口错误!! ',mtError,[mbOK],0); exit; end; //以下设置通信端口的参数 GetCommState(hComm,cc.dcb); // 得知目前COM 的状态 cc.dcb.BaudRate:=CBR_9600; // 设置波特率为9600 cc.dcb.ByteSize:=8; // 字节为 8 bit cc.dcb.Parity:=NOPARITY; // Parity 为 None cc.dcb.StopBits:=ONESTOPBIT; // 1 个Stop bit //若分别控制DTR、RTS,必须不能激活HandShaking cc.dcb.Flags:=1; //此动作可关闭HandShaking等设置 //以下将通信端口参数写入实际硬件 if not SetCommState(hComm, cc.dcb) then begin // 设置COM 的状态 MessageBox (0, '通信端口设置错误!!! ', ' ',MB_OK); CloseHandle(hComm); exit; end; end; //以下是结束按钮的动作 procedure TForm1.btnEndClick(Sender: TObject); begin CloseHandle(hComm); //关闭通信端口 close; //结束程序 end; //以下是控制DTR状态的按钮程序 procedure TForm1.btnDTRClick(Sender: TObject); begin //若通信端口未打开,则不作动作,并跳出 if (hComm=0) then begin Messagedlg( '通信端口未打开!! ',mtError,[mbOK],0); exit; end; //判断DTRState值,输出状态后,将原值作转态 if DTRState then begin DOValue:=CLRDTR; //设置DTR为低电压 EscapeCommFunction( hComm, DOValue );//输出DTR状态 spDTR.Brush.Color:=clWhite; //变更灯号的颜色 end else begin DOValue:=SETDTR; //设置DTR为高电压 EscapeCommFunction( hComm, DOValue );//输出DTR的状态 spDTR.Brush.Color:=clRed; //变更灯号的颜色 end; DTRState:=(not DTRState); //将DTRState转态 end; //以下是控制RTS状态的按钮程序 procedure TForm1.btnRTSClick(Sender: TObject); begin //若通信端口未打开,则不作动作,并跳出 if (hComm=0) then begin Messagedlg( '通信端口未打开!! ',mtError,[mbOK],0); exit; end; //判断RTSState值,输出状态后,将原值作转态 if RTSState then begin DOValue:=CLRRTS; //设置RTS为低电压 EscapeCommFunction( hComm, DOValue );//输出RTS状态 spRTS.Brush.Color:=$FFFFFF;//变更灯号 end else begin DOValue:=SETRTS; //设置RTS为高电压 EscapeCommFunction( hComm, DOValue );//输出RTS状态 spRTS.Brush.Color:=$00FF00;//变更灯号 end; RTSState:=(not RTSState); //将RTSState转态 end; //窗体建立时的初值设置 procedure TForm1.FormCreate(Sender: TObject); begin RTSState:=False; //默认是低电压 DTRState:=False; //默认是低电压 end; end. 简单吧,买个5V的小继电器,然后把常开触点串在开关电源的开关里面串口可以输出5-8V电压,就OK了啊 5V的继电器驱动电流必须<20毫安,因为这个端口的输出电流<20毫安。否则驱动不了!另外可以加入一个晶体管放大电路就可以驱动。 要做一个电路板,板上大概得有以下零件:51单片机、晶震、几个电容、一个MAX232串口芯片、一个7805电源转换片(要看外部供电电源),一条232传输线,电烙铁、焊锡丝、一个光板(不行随便找个塑料板或木版)、keil C51单片机编程软件、DELPHI写个串口控制程序。 大概就这么多吧 到这里买一个现成的,往串口发指令就行了。http://item.taobao.com/item.htm?id=3410556137 这种一般厂家都有封装好的应用层API的,直接用就是了实在不行就直接发AT指令,但可能要多费点事 如果7楼说的:2.動手:串口中的DTR针脚可以输出你需要的电压,你焊两根线,一跟连接dtr(4号针脚),一跟连接地线(一般是五号针脚),然后你编程升高DTR的电位........能实现控制高低电平的变化,可以再使用一个光电耦合器(MOC3061),信号端接4脚与地,控制端控制一个双向可控硅(TLC336A),TLC336A的可控硅允许通过电流3A,耐压600V.如果需要控制更大的负载用电设备可以使用这个可控硅控制一个可以带大负载的继电器即可.以前使用并口编程,外接这样的电路控制过用电器.MOC3061信号端记得加一个限流电阻. 這個根本不需要和單片機或PLC通訊(這個有點牛刀了),直接連接OK後發指令即可認真檢查一下代碼,再檢查接線是否正確;再確定一點就是不會燒壞串口;因為公司機房的煙感器程序控制設備就是使用的Delphi控制的繼電器,使用近三個月了,一切正常上面的代碼註釋說明的非常清楚了,多用點心研究一下,或者在某個環節中出現的問題 http://www.cdle.net/web/alldata/CDLE/cdle050025.htmDELPHI中控制一个继电器 以前公司做项目用过pci的板卡,好像是研祥还是研华的,忘记了就是输出IO信号的 程序启动没显示 实现热键功能 求delphi开发的3层C/S架构的酒店管理系统源码 求从mp3文件中截取一段的代码或思路 如何更改文本文件中指定行的数据? 在线等待!结贴后立即散分! 请问怎样写这样的过程?(菜鸟问题) 我想把一个tstrings对象加入tcombobox中,怎么办? 如何使我的ToolBar可以在CoolBar上Drag & Dock 救命!!还有谁用过TDxDbgrid吗?如果要取得当前行,怎么写?用什么属性呢? 求教DELPHI访问ORACLE数据库的高效方法 进程注入后为什么会退出
俺前年弄过一个那样的东西!
传感器检测是否有东西通过!
然后两个扫描头读取数据!
数据有误的话!
机械手把箱子拿走!
……
买硬件的时候带的光盘里一般有Demo的!
简单改改就行!
1.條件:買一個40-~50元的继电器(支持5V电压之类);
2.動手:串口中的DTR针脚可以输出你需要的电压,你焊两根线,一跟连接dtr(4号针脚),一跟连接地线(一般是五号针脚),然后你编程升高DTR的电位,就可以打开继电器(5V),降低就关闭;
3.代碼說話:给你个例子,串口编程控制dtr和rts针脚电压,rts也可以输出一个5-8V的电压 unit Unit1; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls; type
TForm1 = class(TForm)
rdCOM: TRadioGroup;
Label1: TLabel;
Label2: TLabel;
btnOpenPort: TButton;
btnEnd: TButton;
spDTR: TShape;
spRTS: TShape;
btnDTR: TButton;
btnRTS: TButton;
procedure btnOpenPortClick(Sender: TObject);
procedure btnEndClick(Sender: TObject);
procedure btnDTRClick(Sender: TObject);
procedure btnRTSClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
DTRState:Boolean;
RTSState:Boolean;
DOValue:DWORD;
public
{ Public declarations }
procedure OpenComm; //打开通信端口
end; var
Form1: TForm1;
hComm: THandle; implementation {$R *.DFM} //以下是打开通信端口的程序
procedure TForm1.btnOpenPortClick(Sender: TObject); begin
//若通信端口已打开,则不需要再打开
if (hComm <> 0) then begin
Messagedlg( '通信端口已打开,不需再开 ',mtError,[mbOK],0);
exit;
end;
OpenComm; //打开通信端口的子程序
//先将DTR/RTS的电压降成低电压
EscapeCommFunction( hComm, CLRDTR); //将DTR降为低电压
EscapeCommFunction( hComm, CLRRTS); //将RTS降为低电压
end; //以下是打开通信端口的实际程序代码,采用API
procedure TForm1.OpenComm;
var
cc:TCOMMCONFIG; //定义通信组态变量
Temp:string;
begin
// 选择所要打开的COM
Temp:= 'COM '+inttostr(rdcom.ItemIndex+1);
// 以Create函数打开COM
hComm:=CreateFile(PChar(Temp), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0);
// 判断COM 是否顺利打开
if (hComm = INVALID_HANDLE_VALUE) then begin
Messagedlg( '打开通信端口错误!! ',mtError,[mbOK],0);
exit;
end;
//以下设置通信端口的参数
GetCommState(hComm,cc.dcb); // 得知目前COM 的状态
cc.dcb.BaudRate:=CBR_9600; // 设置波特率为9600
cc.dcb.ByteSize:=8; // 字节为 8 bit
cc.dcb.Parity:=NOPARITY; // Parity 为 None
cc.dcb.StopBits:=ONESTOPBIT; // 1 个Stop bit
//若分别控制DTR、RTS,必须不能激活HandShaking
cc.dcb.Flags:=1; //此动作可关闭HandShaking等设置
//以下将通信端口参数写入实际硬件
if not SetCommState(hComm, cc.dcb) then begin // 设置COM 的状态
MessageBox (0, '通信端口设置错误!!! ', ' ',MB_OK);
CloseHandle(hComm);
exit;
end;
end; //以下是结束按钮的动作
procedure TForm1.btnEndClick(Sender: TObject);
begin
CloseHandle(hComm); //关闭通信端口
close; //结束程序
end;
//以下是控制DTR状态的按钮程序
procedure TForm1.btnDTRClick(Sender: TObject);
begin
//若通信端口未打开,则不作动作,并跳出
if (hComm=0) then begin
Messagedlg( '通信端口未打开!! ',mtError,[mbOK],0);
exit;
end;
//判断DTRState值,输出状态后,将原值作转态
if DTRState then
begin
DOValue:=CLRDTR; //设置DTR为低电压
EscapeCommFunction( hComm, DOValue );//输出DTR状态
spDTR.Brush.Color:=clWhite; //变更灯号的颜色
end
else
begin
DOValue:=SETDTR; //设置DTR为高电压
EscapeCommFunction( hComm, DOValue );//输出DTR的状态
spDTR.Brush.Color:=clRed; //变更灯号的颜色
end;
DTRState:=(not DTRState); //将DTRState转态
end; //以下是控制RTS状态的按钮程序
procedure TForm1.btnRTSClick(Sender: TObject);
begin
//若通信端口未打开,则不作动作,并跳出
if (hComm=0) then begin
Messagedlg( '通信端口未打开!! ',mtError,[mbOK],0);
exit;
end;
//判断RTSState值,输出状态后,将原值作转态
if RTSState then
begin
DOValue:=CLRRTS; //设置RTS为低电压
EscapeCommFunction( hComm, DOValue );//输出RTS状态
spRTS.Brush.Color:=$FFFFFF;//变更灯号
end
else
begin
DOValue:=SETRTS; //设置RTS为高电压
EscapeCommFunction( hComm, DOValue );//输出RTS状态
spRTS.Brush.Color:=$00FF00;//变更灯号
end;
RTSState:=(not RTSState); //将RTSState转态
end; //窗体建立时的初值设置
procedure TForm1.FormCreate(Sender: TObject);
begin
RTSState:=False; //默认是低电压
DTRState:=False; //默认是低电压
end;
end.
http://item.taobao.com/item.htm?id=3410556137
实在不行就直接发AT指令,但可能要多费点事
2.動手:串口中的DTR针脚可以输出你需要的电压,你焊两根线,一跟连接dtr(4号针脚),一跟连接地线(一般是五号针脚),然后你编程升高DTR的电位........能实现控制高低电平的变化,可以再使用一个光电耦合器(MOC3061),信号端接4脚与地,控制端控制一个双向可控硅(TLC336A),TLC336A的可控硅允许通过电流3A,耐压600V.如果需要控制更大的负载用电设备可以使用这个可控硅控制一个可以带大负载的继电器即可.以前使用并口编程,外接这样的电路控制过用电器.MOC3061信号端记得加一个限流电阻.