遥控器-接收头-单片机-串口-Matlab-PowerPoint - Windows Live

遥控器-接收头-单片机-串口-Matlab-PowerPoint

????? 在这惨淡的岁月里,能够找到一件自娱自乐的事情,就像在黑暗中看到了一颗星星。

????? 前两天上课的时候看见老师使用一个遥控器控制PowerPoint的演示,因此,老师不必守在电脑前控制幻灯片的播放了。其实这种装置我很早就见识过,只是这一次,我突然想,能不能自己把这个东西做出来。答案是肯定的,没有做不到,只有想不到……

????? 要想实现这个装置,首先得有一个遥控器和红外接收装置。这个可以用我的Willar Me500b来实现,这块开发板拥有一个塑封一体化红外接收头(根据电路图,该接收头接于51的P3.2管脚),同时附带了一个红外遥控器。现在单片机可以利用接收头接收红外信号,还可以通过串口将数据发送给电脑,问题就解决一半了,剩下的问题就是如何在电脑上接收串口数据,并操纵PowerPoint进行相应的操作。

塑封一体化红外接收头

????? 看上图,晶振旁边有一个跳线,在跳线和扳手中间的就是红外接收头。

????? 这剩下的问题正好使用Matlab来解决,因为一、Matlab可以接收串口数据,关于这个问题我已经写了好几篇文章了。二、Matlab可以操纵COM对象,关于这个问题,Help中有详细的说明,我也利用此功能在Matlab中调用过Mathcad程序。至于PowerPoint提供哪些可供操纵的对象,录制一段宏,然后看看VBA代码就明白了。

????? 说明一下使用的硬件和软件的版本:

????? 遥控器:Willar ME500b附带遥控器;

????? 红外接收头:接于AT89S52的P3.2管脚

????? 开发板:Willar ME500b;

????? 单片机:AT89S52

????? Matlab:7.0.1;

????? PowerPoint:2003

????? 下面先给出C51的程序吧:

#include <reg51.h>
#include <intrins.h>

typedef?unsigned?char uchar;
typedef?unsigned?int uint;

void delay(uchar); /*延迟0.14ms的整数倍 晶振11.0592MHz*/

sbit IRIN = P3^2; /*外部中断0,接红外接收器*/

uchar IRData[]={0,0,0,0}; /*存放接收到的红外信号编码*/

main()
{
??? IE=0x81; /*打开外部中断0,打开总中断*/
??? TCON = 0x01; /*负沿触发*/
??? IRIN=1; /*初始化*/
??? TMOD=0x20; /*T1方式二,8位自动重装*/
??? TH1=0xfd;
??? TL1=0xfd; /*波特率9600,晶振11.0592*/
??? SCON=0x50; /*串口方式1,8位异步收发,定时器定波特率*/
??? PCON&=0x00; /*波特率不倍增*/
??? TR1=1; /*启动T1*/
??? while(1);
}

void delay(uchar x)
{
??? uchar n;
??? while(x--)
??? {
??????? for(n=0;n<13;n++){}
??? }
}

void IRReceive() interrupt 0
{
??? uchar counter=0;
??? uchar i;
??? uchar j;
??? EX0=0; /*暂时禁止外部中断0*/
??? delay(15); /*延时2.1ms*/
??? if(1==IRIN)??? /*若延迟之后IRIN是高电平*/
??? {
??????? EX0=1;
??????? return; /*打开中断0并返回*/
??? }
??? while(!IRIN); /*等待IRIN低电平*/
??? for(i=0;i<4;i++) /*一共接收四组数据*/
??? {
??????? for(j=0;j<8;j++) /*一组数据是一个字节*/
??????? {
??????????? while(IRIN); /*等待低电平*/
??????????? while(!IRIN); /*等待高电平*/
??????????? while(IRIN) /*计算高点平的维持时间*/
??????????? {
??????????????? delay(1); /*延迟0.14ms*/
??????????????? counter++; /*计数*/
??????????????? if(counter>=30) /*若超时*/
??????????????? {
??????????????????? EX0=1;
??????????????????? return;??? /*则打开中断0并返回*/
??????????????? }
??????????? }
??????????? IRData[i]>>=1; /*右移一位*/
??????????? if(counter>=8) /*接收为1*/
??????????????? IRData[i]|=0x80; /*在IRData[i]{zg}位放入1*/
??????????? counter=0; /*counter复位,为下一位接收作准备*/
??????? }
??? }
??? /*校验*/
??? if(IRData[2]!=~IRData[3] || IRData[0]!=0)
??? {
??????? EX0=1;
??????? return;
??? }
??? SBUF=IRData[2];??? /*通过串口发送数据*/
??? while(0==TI); /*查询TI*/
??? TI=0; /*发送结束,清零TI*/
??? EX0=1; /*打开外部中断1*/
}

????? 其实这个程序早就写好了,之所以这篇文章今天才贴出来,是因为直到昨天,我才粗略完成了将C文件转换为彩色的html代码的Python程序,由于bug多多,所以那个Python程序暂不贴出。

????? 将这个程序编译成hex文件,烧写到单片机中即可。现在我们看看Matlab方面的程序:

????? 首先是初始化,创建串口对象,创建PowerPoint对象:

function initPPTCtrl(com)
%PowerPoint应用程序对象
global pp;
%串口对象
global s_p;
%创建PowerPoint对象
try
??? pp=actxserver('PowerPoint.Application');
catch
??? error('Can''t create PowerPoint object');
end
%创建串口对象
try
??? s_p=serial(com);
catch
??? pp.Quit();
??? error('Can''t create serial object');
end
%设定串口对象属性,波特率默认9600
s_p.BytesAvailableFcnMode='byte';
s_p.BytesAvailableFcnCount=1;?
s_p.BytesAvailableFcn=@ctrlPPT;?
%打开串口
fopen(s_p);

????? 这里设置了一个Callback,函数叫做ctrlPPT,根据接收到的串口数据来操纵PowerPoint:

function ctrlPPT(obj,event)
global pp;
if('BytesAvailable'==event.Type)
??? switch(fread(obj,1,'int8'))
??????? case hex2dec('12') %遥控器Down键码
??????????? pp.ActivePresentation.SlideShowWindow.View.Next();
??????? case hex2dec('1D') %遥控器Up键码
??????????? pp.ActivePresentation.SlideShowWindow.View.Previous();
??????? case hex2dec('10') %遥控器K1键码
??????????? pp.ActivePresentation.SlideShowSettings.Run();
??????? case hex2dec('03') %遥控器K2键码
??????????? pp.ActivePresentation.SlideShowWindow.View.Exit();
??? end
end?

????? {zh1}不需要遥控PowerPoint时,关闭端口,删除对象,释放资源:

function closePPTCtrl()
global pp;
global s_p;
pp.Quit();
fclose(s_p);
delete(s_p);

????? 这就是全部的程序,从单片机到Matlab。关于使用Callback处理串口数据的问题,可以参看 。当然,老师的那个遥控器上面还有激光发射器,用以充当教鞭(不过这教鞭不能用来体罚),我的这个遥控器暂时没有这个功能,除非在上面绑一个激光灯。

????? 整个的演示过程可以看下面的录像:

附:试验在Matlab中操纵PowerPoint03的经过:

首先打开PowerPoint:
>> pp=actxserver('PowerPoint.Application');
然后使PowerPoint窗口可见:
>> pp.Visible=-1;
第三步、打开需要演示的幻灯片:
>> ppp=pp.Presentations.Open('C:\Documents and Settings\Administrator\My Documents\演示.ppt');
第四步、开始演示:
>> ppp.SlideShowSettings.Run();
第五步、操纵:
下一页:
>> ppp.SlideShowWindow.View.Next();
上一页:
>> ppp.SlideShowWindow.View.Previous();
退出演示:
>> ppp.SlideShowWindow.View.Exit();
关闭文档:
>> ppp.Close()
关闭PowerPoint:
>> pp.Quit();

若文档已打开,可直接用下面的方法开始演示:
>> pp.ActivePresentation.SlideShowSettings.Run();
这样操纵:
下一页
>> pp.ActivePresentation.SlideShowWindow.View.Next();
上一页
>> pp.ActivePresentation.SlideShowWindow.View.Previous();
退出
>> pp.ActivePresentation.SlideShowWindow.View.Exit();

??? ??? ???

Comments (1)

郑重声明:资讯 【遥控器-接收头-单片机-串口-Matlab-PowerPoint - Windows Live】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——