看我來山寨“按鍵盒子”!
材料清單:
舊鼠標一個 (這個大家都能找到就不算資金啦!)
STC89C52最小系統板一塊 (15元)
PL2303 USB轉TTL小板一塊(12元)
杜邦線 (附送的!)
9013三極管2個 1k電阻兩個
Ok了就這么多,下面開始做啦

(89c52最小系統板)

(舊鼠標電路板~~~哈哈,光電管被我拆了 搞個LED做電源指示用)
這里拆除左右按鍵開關,用9013焊上 基極焊1k電阻引出來做控制端。

(PL2303 USB轉TTL小板)

(全家福!!呵呵)
PL2303和89c52板子的連接就不說了,資料上都有。鼠標板子引出的兩個1k電阻用杜邦線接到89c52的P12和P13腳,分別對應左鍵觸發和右鍵觸發。
Ok 萬事大吉,下面就是寫點代碼了,很簡單,Let’s gooooooooooo!
89c52的代碼如下:
#include <reg52.h>
unsigned char message;
sbit L=P1 ^ 2; //左鍵
sbit R=P1 ^ 3; //右鍵
void delay21ms(void) //誤差-0.651041666671us
{
unsigned char a,b;
for(b=150;b>0;b--)
for(a=63;a>0;a--);
}
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD; //速率19200 倍速
TL1 = TH1;
PCON = 0x80;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
L=0;
R=0;
InitUART();
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
message=SBUF;
if (message=='a') //左鍵按下
{
L=1;
delay21ms();
L=0;
SendOneByte('!');
}
if (message=='b') //右鍵按下
{
R=1;
delay21ms();
R=0;
SendOneByte('!');
}
}
else
TI = 0;
}
代碼就是這些,很簡單,用Keil編譯后,使用stc的isp下載工具通過PL2303轉接下載到89c52芯片中,至此,硬件部分結束!
這下可以用串口測試工具檢測下片子工作正常不,串口參數:19200,8,n,1
發送字符‘a’返回‘!’,發送字符‘b’返回‘!’,這樣就正常了
下面開始做上位機程序,很簡單,就是在需要的時候發送字符,就可以控制鼠標的左右鍵點擊了。我用的是delphi ,使用spcomm控件
我用大漠的插件做一個cf自動開槍的程序,可以參考下。
哈哈,有了這個什么230錯誤啊,什么開槍變慢啊,什么wai掛檢測啊。。。都不存在了,只要你會找敵人就能把他干倒!!
源碼如下:
unit Unit10;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Dm_TLB,ComObj,madKernel, ExtCtrls, SPComm;
type
TForm10 = class(TForm)
btn1: TButton;
tmr1: TTimer;
lbl1: TLabel;
cm1: TComm;
btn2: TButton;
cbb1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
procedure leftclick();
procedure rightclick();
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form10: TForm10;
plug:dmsoft;
implementation
{$R *.dfm}
procedure TForm10.btn2Click(Sender: TObject);
begin
cm1.CommName:=cbb1.Text;
cm1.StartComm;
tmr1.Enabled:=True;
btn2.Enabled:=False;
end;
procedure TForm10.FormClose(Sender: TObject; var Action: TCloseAction);
begin
cm1.StopComm;
end;
procedure TForm10.FormCreate(Sender: TObject);
begin
Plug:=CreateComObject(CLASS_dmsoft) as dmsoft;
end;
procedure TForm10.leftclick;
begin
cm1.WriteCommData('a',1);
end;
procedure TForm10.rightclick;
begin
cm1.WriteCommData('b',1);
end;
procedure TForm10.btn1Click(Sender: TObject);
begin
tmr1.Enabled:=False;
cm1.StopComm;
Self.Close;
end;
procedure TForm10.tmr1Timer(Sender: TObject);
var
x,y:OleVariant;
isfind:Integer;
begin
begin
isfind:=Plug.FindColor(370,350,430,351,'AE3D2B',0.9,2,X,Y);
if isfind=1 then
begin
leftclick;
Sleep(30);
leftclick;
end;
Sleep(20);
end;
end;
end.
好了 就說這么多了,可能有的地方沒說全,下次再補補吧,好晚了,明天還要出差。
其實這個只是最最簡單的硬件控制方案了,呵呵,無奈水平有限只能做個這個出來了,以后有時間再研究了!
By lxm
QQ:455832194
|