12622|20

344

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

发一个将红外遥控解码 控制电脑的小程序 [复制链接]

这是一个用51将HT6221红外编码解码 并将码通过串口发送给PC 用vb编写PC接收程序实现鼠标移动、待机、一键虚拟键盘、小键盘、鼠标左键单双击、鼠标右键单击的程序,没有多键触控,设置串口码率1200bps com4 无奇偶校验 屏幕分辨率1280*800,下面是51程序,AT89S52测试通过

 

 

 

 

 

 

 

 

//*********************************************************
//利用HT6221接收遥控器编码,并用1602实时显示 串口发送给电脑
//2010年1月15日 by ch
//*********************************************************
#include<reg52x2.h>
#include <intrins.h>

typedef unsigned char  INT8U;     //无符号8位数
typedef signed   char  INT8S;     //有符号8位数
typedef unsigned int   INT16U;    //无符号16位数
typedef signed   int   INT16S;    //有符号16位数
typedef unsigned long  INT32U;    //无符号32位数
typedef signed   long  INT32S;    //有符号32位数
typedef float          FP32;      //单精度浮点数
typedef double         FP64;      //双精度浮点数


INT8U SRDATA[]={'0','0',0x0d,0x0a,0x00} ;
INT8U IRCommandData;
INT8U da[4]={0,0,0,0};
INT8U temp;
INT8U code dsptab[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//字符代表码;
sbit LCD_RS= P2^0;//定义LCD引脚
sbit LCD_RW= P2^1;
sbit LCD_E=  P2^2;

sbit IR=P3^6;//接红外
sbit beep=P3^7;

//---------------------------------------------------------------
//-------------------延时子程序----------------------------------
void delay(INT16U a)                      //延时程序
{
    INT16U b;
    for (b=0;b<a;b++);
}

void delayKms(INT8U pp)                 //延时程序
{
    while (pp--)
    {
        unsigned char j;
        for (j = 0;j<123;j++);   //j进行的内部循环,1次延迟8us,延迟1ms

    }
}

 

 

/*----------------------------------------------------------------
-------------------读状态----------------------------------------*/

//读状态子程序;有返回值;返回值类型为CHAR型;
//读回的状态通过RETURN返回;

INT8U read_estate(void)     //定义有返回值的函数;
{
    P0=0Xff;      //把LCD端口全置1方便读取信号;
    LCD_RS=0;        //RS置0;
    LCD_RW=1;        //RW置1;
    LCD_E=0;           //E端置0;
    delay(10);       //短延时;
    LCD_E=1;        //E端置1;以锁存数据;
    while (P0&0x80);                //检测忙,则一直循环;
    return(P0);      //返回读取的信号;
}
/*------------------------------------------------------------------
------------------ 写数据------------------------------------------*/

//写数据子程序;无返回值;输入变量I;
//I为要写入LCD中的数据;
//数据类型CHAR形;

void write_data(INT8U i)    //定义输入变量值I;
{
    read_estate();      //检测忙信号;
    P0=i;       //把I中数据送到LCD数据端;
    LCD_RS=1;        //RS置1;
    LCD_RW=0;        //RW置0;
    LCD_E=0;        //E置0;
    delay(10);       //短延时;
    LCD_E=1;        //E置1;以锁存数据;
}
/*---------------------------------------------------------------------
------------------ 写指令--------------------------------------------*/

//写指令子程序;无返回值;输入二个变量I和J.
//I为要写入LCD的指令;J为判断要不要检测忙.
//如果J为0则不判断检测忙;
//如果J为1则判断检测忙;

void write_dictate(INT8U i,j)   //定义二个变量;
{
    if (j)read_estate();             //根据需要检测忙;
    P0=i;                           //把要写入的数据送到LCD数据端;
    LCD_RS=0;                       //RS置0;
    LCD_RW=0;        //RW置0;
    LCD_E =0;        //E端置0;
    delay(10);       //延时;
    LCD_E =1;        //E端置1;以锁存数据;
}

/*---------------------------------------------------------------
-------------------读数据--------------------------------------*/

//读数据子程序;有返回值,返回值类型为CHAR型;
/*
INT8U read_data(void)     //定义有返回值的子函数;
{
  LCD_DATA=0Xff;      //LCD数据端口置1;
  LCD_RS=1;        //RS置1;
  LCD_RW=1;        //RW置1;
  LCD_E=0;        //E置0;
  delay(10);       //短延时;
  LCD_E=1;        //E置1;以锁存数据;
  return(LCD_DATA);      //返回读取的值;
}
  */

/*---------------------------------------------------------------------
------------------ LCD初始化-----------------------------------------*/

//LCD初始化程序;主要作用初始化LCD,对LCD进行复位以及设置;

void initialization(void)    //定义函数;
{
    delay(50);       //延时5MS;
    write_dictate(0x38,0);    //写指令38H;不检测忙;
    delay(50);       //延时5MS;
    write_dictate(0x38,0);    //写指令38H;不检测忙;
    delay(50);       //延时5MS;
    write_dictate(0x38,0);    //写指令38H;不检测忙;
    delay(50);
    write_dictate(0x38,1);    //显示模式设置;检测忙;
    write_dictate(0x08,1);    //关闭显示;检测忙;
    write_dictate(0x01,1);    //显示清屏;检测忙;
    write_dictate(0x06,1);    //显示光标移动设置;检测忙;
    write_dictate(0x0C,1);    //显示开及光标设置;检测忙;
}
/*---------------------------------------------------------------
-------------------在指定位置显示一个字符----------------------*/
void displayonechar(INT8U x, y,ddata)
{
    y &= 0x01;
    x &= 0x0f;                             //限制X不能大于15,Y不能大于1
    if (y) x+= 0x40;                      //当要显示第二行时地址码+0x40;
    x+= 0x80;                             //算出指令码
    write_dictate(x,0);                    //这里不检测忙信号,发送地址码
    write_data(ddata);
}

/*---------------------------------------------------------------
-------------------在指定位置显示一串字符----------------------*/
void displaylistchar(INT8U x,y,INT8U code *ddata)
{
    INT8U a=0;
    y&=0x01;
    x&=0xf;
    while (ddata[a]>0x20)
    {
        if (x<=0xff)
        {
            displayonechar(x, y,ddata[a]);
            a++;
            x++;
        }
    }
}


//============主程序====================================================

 

//============主程序====================================================


void d870us(void)
{
    //delay(108);//12M
    INT8U i;
    for (i=0;i<219;i++)
    {
        _nop_();
    }

}

void d1000us(void)
{
    INT8U k;
    for (k=0;k<248;k++)
    {
        _nop_();
    }

}

void d4740us(void)
{
    //  delay(593);//12M
    INT16U j;
    for (j=0;j<720;j++)
    {
        _nop_();
    }

}
//----------------------------------------------------


//-----------------------------------------------
//  ht6221解码程序
//-----------------------------------------------
INT8U IRDecode(void)
{
    INT8U i,m,n;

    for (i=0;i<10;i++)
    {
        d870us();
        if (IR)
        {
            break;
        }
    }

    while (!IR);
    d4740us();

    //开始解码
    for (m=0;m<4;m++)
    {
        for (n=0;n<8;n++)
        {
            while (!IR);

            d870us();
            if (IR)
            {
                d1000us();
                da[m]=da[m]>>1;
                da[m]=da[m]|0x80;
            }
            else
            {
                da[m]=da[m]>>1;
                da[m]=da[m]|0;
            }
            // while(IR);
            //while(!IR);
        }
    }
    if ((da[0]==0x0)&&(da[1]==0xFF))
    {
        if (da[2]==(~da[3]))
        {
            beep=0;
            delayKms(50);
            beep=1;
            return da[2];

        }
    }
}
void SendData(INT8U c)
{
    P0=c;   
}

 

[ 本帖最后由 ch0721 于 2011-2-19 21:43 编辑 ]

截图1298115013.jpg (176.49 KB, 下载次数: 2)

截图1298115013.jpg
此帖出自51单片机论坛

最新回复

mark下,感谢楼主的辛苦分享  详情 回复 发表于 2017-7-27 21:45

赞赏

1

查看全部赞赏

点赞 关注(1)
个人签名我们是不为一切驻留的亡魂
 

回复
举报

344

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
int main()
{


    INT8U m,n;
    SCON= 0x40;                //串口方式1
    PCON=0;                     //SMOD=0
    REN=1;                     //允许接收
    TMOD= 0x20;                //定时器1定时方式2
    TH1= 0xe6;                //12MHz 1200波特率
    TL1= 0xe6;
    TR1= 1;                  //启动定时器
    temp = '0';
    delayKms(400);//延时400MS
    initialization();//LCD复位;

    displayonechar(0,1,'I');
    displayonechar(1,1,'R');
    displayonechar(2,1,'D');
    displayonechar(3,1,'A');
    displayonechar(4,1,'/');
    displayonechar(5,1,' ');
    displayonechar(6,1,'=');
    displayonechar(7,1,' ');
    displayonechar(8,1,'0');
    displayonechar(9,1,'x');
    displayonechar(10,1,'N');
    displayonechar(11,1,'N');

    delayKms(400);//延时400MS

    displayonechar(0,2,'I'); //在LCD是显示OUT:_.___mA
    displayonechar(1,2,'R');
    displayonechar(2,2,'D');
    displayonechar(3,2,'A');
    displayonechar(4,2,' ');
    displayonechar(5,2,' ');
    displayonechar(6,2,'=');
    displayonechar(7,2,' ');
    displayonechar(8,2,'0');
    displayonechar(9,2,'x');
    displayonechar(10,2,'N');
    displayonechar(11,2,'N');

    delayKms(400);//延时400MS

    while (1)
    {
        if (!IR)
        {
            IRCommandData=IRDecode();

            if (IRCommandData==0xff&&da[3]==0xff&&temp!='0')
            {

                            delayKms(100);
                displayonechar(10,2,dsptab[temp/16]);
                displayonechar(11,2,dsptab[temp&0x0f]);
                displayonechar(10,1,dsptab[da[3]/16]);
                displayonechar(11,1,dsptab[da[3]&0x0f]);
                delayKms(100);

                SRDATA[0]=dsptab[temp/16];
                                SRDATA[1]=dsptab[temp&0x0f];
                                //SRDATA[0]=temp;
                                //SRDATA[1]='p';
                m=0;
                while (SRDATA[m]!=0x00)
                {
                    SBUF=SRDATA[m];
                    while (TI==0);
                    TI=0;
                    m++;
                }
                IRCommandData = 0x00;

            }
            else
            {
                temp = IRCommandData;
                                delayKms(100);
                displayonechar(10,2,dsptab[temp/16]);
                displayonechar(11,2,dsptab[temp&0x0f]);
                displayonechar(10,1,dsptab[da[3]/16]);
                displayonechar(11,1,dsptab[da[3]&0x0f]);
                delayKms(100);
                SRDATA[0]=dsptab[temp/16];
                                SRDATA[1]=dsptab[temp&0x0f];
                m=0;
                while (SRDATA[m]!=0x00)
                {
                    SBUF=SRDATA[m];
                    while (TI==0);
                    TI=0;
                    m++;
                }
                                IRCommandData = 0x00;
            }
        }
    }
}
此帖出自51单片机论坛

赞赏

2

查看全部赞赏

 
个人签名我们是不为一切驻留的亡魂
 
 

回复

344

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
    

[ 本帖最后由 ch0721 于 2011-2-19 19:34 编辑 ]

1.jpg (44.64 KB, 下载次数: 2)

51显示的结果

51显示的结果

2.jpg (55.9 KB, 下载次数: 1)

s08写的红外接收 放假之前没再往下写

s08写的红外接收 放假之前没再往下写

截图1298115013.jpg (176.73 KB, 下载次数: 3)

截图1298115013.jpg

复件 红外鼠标控制.rar

5.73 KB, 下载次数: 22

售价: 1 分芯积分  [记录]

复件 (5) IrDA_final.rar

30.49 KB, 下载次数: 19

售价: 1 分芯积分  [记录]

此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
个人签名我们是不为一切驻留的亡魂
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
记号!
此帖出自51单片机论坛
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

5
 
好贴,谢谢楼主分享!
此帖出自51单片机论坛
 
 
 

回复

996

帖子

0

TA的资源

一粒金砂(高级)

6
 
用VC写的啊,不错,赞一个
此帖出自51单片机论坛
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

7
 

回复 6楼 larrybirdkobe 的帖子

不是哈 是vb写的
此帖出自51单片机论坛
 
 
 

回复

344

帖子

0

TA的资源

纯净的硅(初级)

8
 

回复 6楼 larrybirdkobe 的帖子

同楼上确实是VB写的 调用API来进行操作 因为以前用VB写过一个实现XP系统电源操作的东西 BAS就可以直接用了比较方便 我这VC用的还不太熟练 不过感觉BC更好用一点 呵呵 传上来个编译后的EXE 因为是自己写着玩 资源和界面没花什么心思稍为简陋了点

[ 本帖最后由 ch0721 于 2011-2-20 22:27 编辑 ]

截图1298211906.jpg (12.22 KB, 下载次数: 0)

截图1298211906.jpg

工程2.rar

5.98 KB, 下载次数: 11

此帖出自51单片机论坛
 
个人签名我们是不为一切驻留的亡魂
 
 

回复

132

帖子

2

TA的资源

纯净的硅(中级)

9
 
LZ 3樓的文件說明一下吧, 是PC端的VB程式嗎?
此帖出自51单片机论坛
 
 
 

回复

272

帖子

0

TA的资源

一粒金砂(中级)

10
 
此帖出自51单片机论坛
 
 
 

回复

344

帖子

0

TA的资源

纯净的硅(初级)

11
 

回复 9楼 dale 的帖子

对3楼是51的keil工程和VB的工程 在下边的是编译后没有进行加工的EXE VB模块中有一些声明是没有被调用的 里面有鼠标事件的模拟、键盘事件的模拟(只声明了一小部分VK值)、XP系统电源操作(包括注销、待机、关闭显示器、关机、重启、强制关机六种),串口的接收采用MSCOMM ActiveX插件的形式接收,未采用轮询的方式,设置为COM4 1200bps 无奇偶校验

附主要程序:
Dim st As String     '存串口接收数据
Dim cursor As POINTAPI '存函数getcursorpos返回数据
Dim A, b As Long         '存将要设定的鼠标坐标


MSComm1.InputLen = 2        '截取长度设定
If MSComm1.InBufferCount Then
st = MSComm1.Input               '读取缓冲区数据

Select Case st                       '判断键值
Case "0a"
Text3.Text = st
GetCursorPos cursor
x = cursor.x
y = cursor.y
Text1.Text = Str$(x)
Text2.Text = Str$(y)
A = x - add
b = y
If A > 0 Then
ret = SetCursorPos(A, b)

Else
A = 0
ret = SetCursorPos(A, b)
End If
'**********************************************************************************
Case "1e"
Text3.Text = st
GetCursorPos cursor
x = cursor.x
y = cursor.y
Text1.Text = Str$(x)
Text2.Text = Str$(y)
A = x + add
b = y
If A < 1279 Then
ret = SetCursorPos(A, b)

Else
A = 1279
ret = SetCursorPos(A, b)
End If

'*************************************************************************************
Case "0e"
Text3.Text = st
GetCursorPos cursor
x = cursor.x
y = cursor.y
Text1.Text = Str$(x)
Text2.Text = Str$(y)
A = x
b = y - add
If b > 0 Then
ret = SetCursorPos(A, b)

Else
b = 0
ret = SetCursorPos(A, b)
End If
'***********************************************************************************
Case "1a"
Text3.Text = st
GetCursorPos cursor
x = cursor.x
y = cursor.y
Text1.Text = Str$(x)
Text2.Text = Str$(y)
A = x
b = y + add
If b < 799 Then
ret = SetCursorPos(A, b)

Else
b = 799
ret = SetCursorPos(A, b)
End If
'**************************************************************************************
Case "4c"
f = add - 10
If f > 10 Then
add = f
Else
add = 10
End If
Case "54"
f = add + 10
If f < 100 Then
add = f
Else
add = 100
End If
'***************************************************************************************
Case "05"
'keybd_event VK_LBUTTON, 0, 0, 0
'keybd_event VK_LBUTTON, 0, 2, 0
Text3.Text = st
'mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
'mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 '鼠标左键单击
Case "1c"
'keybd_event VK_RBUTTON, 0, 0, 0
'keybd_event VK_RBUTTON, 0, 2, 0
Text3.Text = st
mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 '鼠标右键单击
Case "51"
' mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0   '鼠标左键双击
'mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
Shell ("c:\windows\system32\osk.exe")
'****************************************************************************************
Case "0c"
    '音量减少
     sendmessage Me.hwnd, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_DOWN * &H10000
Case "02"
  sendmessage Me.hwnd, WM_APPCOMMAND, &H30292, APPCOMMAND_VOLUME_UP * &H10000

Case "03"
'静音
     sendmessage Me.hwnd, WM_APPCOMMAND, &H200EB0, APPCOMMAND_VOLUME_MUTE * &H10000
Case "09"
'关闭屏幕
Dim ww As Long
ww = sendmessage(Form1.hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, ByVal MONITOR_OFF)
Case "5c"
'待机
Call wait

'****************************************************************************************
Case "0d"
keybd_event VK_NUMPAD1, 0, 0, 0
keybd_event VK_NUMPAD1, 0, 2, 0

Case "19"
keybd_event VK_NUMPAD2, 0, 0, 0
keybd_event VK_NUMPAD2, 0, 2, 0

Case "1b"
keybd_event VK_NUMPAD3, 0, 0, 0
keybd_event VK_NUMPAD3, 0, 2, 0

Case "01"
keybd_event VK_NUMPAD4, 0, 0, 0
keybd_event VK_NUMPAD4, 0, 2, 0

Case "11"
keybd_event VK_NUMPAD5, 0, 0, 0
keybd_event VK_NUMPAD5, 0, 2, 0

Case "15"
keybd_event VK_NUMPAD6, 0, 0, 0
keybd_event VK_NUMPAD6, 0, 2, 0

Case "17"
keybd_event VK_NUMPAD7, 0, 0, 0
keybd_event VK_NUMPAD7, 0, 2, 0

Case "06"
keybd_event VK_NUMPAD8, 0, 0, 0
keybd_event VK_NUMPAD8, 0, 2, 0

Case "12"
keybd_event VK_NUMPAD9, 0, 0, 0
keybd_event VK_NUMPAD9, 0, 2, 0

Case "16"
keybd_event VK_NUMPAD0, 0, 0, 0
keybd_event VK_NUMPAD0, 0, 2, 0

End Select
Label2.Caption = Str$(add)
End If

End Sub

“51"那个键码在3楼发的是鼠标双击,这个是虚拟小键盘,把当时写这两个先后顺序搞反了以为3楼是最后备份了。。。 不过程序可以跑没有问题
此帖出自51单片机论坛
 
个人签名我们是不为一切驻留的亡魂
 
 

回复

130

帖子

0

TA的资源

一粒金砂(中级)

12
 
mark
此帖出自51单片机论坛
 
 
 

回复

2751

帖子

0

TA的资源

裸片初长成(初级)

13
 
good
此帖出自51单片机论坛
 
 
 

回复

140

帖子

0

TA的资源

一粒金砂(高级)

14
 
好样的 留住
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

15
 

楼主,。我用PT2262和PT2272控制怎么入手啊!

谢谢楼主了!我的QQ:290741081
此帖出自51单片机论坛
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(初级)

16
 
MARK一下,好资料啊。
此帖出自51单片机论坛
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(初级)

17
 
还差一个币,再次回复一下。
此帖出自51单片机论坛
 
 
 

回复

396

帖子

5

TA的资源

纯净的硅(中级)

18
 
年后第一贴,楼主真的厉害。
此帖出自51单片机论坛
 
个人签名一别四五年,变化万千。https://home.eeworld.com.cn/static/image/smiley/comcom/5.gif[/img]
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

19
 
不错,支持一个~~
此帖出自51单片机论坛
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

20
 
mark!学习一下
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表