只须懂C++,编写程序如下:
UINT CIrPulse::FindIrPort()
{
// 查询注册表中的IR端口号
HKEY hKey = NULL;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Comm\IrDA"),0, 0, &hKey) == ERROR_SUCCESS)
{
DWORD dwType = 0;
DWORD dwData = 0;
DWORD dwSize = sizeof(dwData);
if (RegQueryValueEx(hKey, _T("Port"), NULL, &dwType, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)
{
if (dwType == REG_DWORD && dwSize == sizeof(dwData))
{
RegCloseKey(hKey);
return (UINT) dwData;
}
}
RegCloseKey(hKey);
}
return 0;
}
BOOL CIrPulse::Open(UINT uiPort)
{
ASSERT(uiPort > 0 && uiPort <= 255);
Close();
//打开IRDA端口
CString strPort;
strPort.Format(_T("COM%d:"), uiPort);
m_irPort = CreateFile((LPCTSTR) strPort, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);
if (m_irPort == INVALID_HANDLE_VALUE)
{
return FALSE;
}
//设置输入和输出缓冲区的大小
VERIFY(SetupComm(m_irPort, 2048, 2048));
//清除读和写缓冲区
VERIFY(PurgeComm(m_irPort,PURGE_TXABORT|PURGE_RXABORT|
PURGE_TXCLEAR|PURGE_RXCLEAR));
//重新初始化所有的IRDA端口设置
DCB dcb;
dcb.DCBlength = sizeof(DCB);
VERIFY(GetCommState(m_irPort, &dcb));
dcb.BaudRate = CBR_115200;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fTXContinueOnXoff = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.StopBits = TWOSTOPBITS;
VERIFY(SetCommState(m_irPort, &dcb));
//为所有的读和写操作设置超时值
COMMTIMEOUTS timeouts;
VERIFY(GetCommTimeouts(m_irPort, &timeouts));
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
VERIFY(SetCommTimeouts(m_irPort, &timeouts));
DWORD dwEvent=EV_TXEMPTY;
SetCommMask(m_irPort,dwEvent);
return TRUE;
}
BOOL CIrPulse::SendCode(DWORD lValue)
{
DWORD dwCount;
int i=0;
ASSERT(iDataLength>0);
//清除传送缓冲区
VERIFY(PurgeComm(m_irPort,PURGE_TXABORT| PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR));
//每次按键设置代码6次
for(int x=0;x<6;x++) {
MakeStream(lValue); //发送代码
dwCount=GetTickCount();
while(GetTickCount()
}
return true;
}BOOL CIrPulse::MakeStream(DWORD lValue) {
DWORD dwStreamLength;
//创建开始脉冲
dwStreamLength=iHPulse/charWidth;
ASSERT(Write((const char *)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
// ************************************
// ***** 在下一个脉冲到来前延迟一段时间
// ************************************
//循环操作代码中的位来发送脉冲
for(int i=0;i
//创建一个脉冲1
dwStreamLength=i1Pulse/charWidth;
ASSERT(Write((const char *)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
// *********************************
// ***在下一个脉冲到来前延迟一段时间
// *********************************
}
else {
//创建一个脉冲 0
dwStreamLength=i0Pulse/charWidth;
ASSERT(Write((const char *)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
// ********************************
// **在下一个脉冲到来前延迟一段时间
// ********************************
}
lValue >>= 1;
}
return TRUE;
}
需要安装智能家居的,要安装并用电脑控制的话,每个家具的价钱都要在原有的基础上增值20%。部分家电如一些电视机、打印机是可作为网络设备使用的,链接上网络设置好IP可以通过网络远程管理、也可以用电脑控制开关加无线或载波收发模块、无线或载波开关来实现一些简单的控制家电开关、电压调整等简单功能。
什么家电带网络管理功能、电脑控制开关、无线或载波遥控模块你都可以在百度上搜索到,具体价格我也没去问过。
电脑控制家电的方法
(1)基本要求:能够实现用红外线或无线电控制家居电器的工作状态,家电可以用发光二极管仿真替代,具备家庭防盗报警功能。
(2)发挥部分:人机界面友好,能够通过网络控制家电。
总体设计方案
1、设计思路
题目要求设计一个家居电器控制系统,能够实现用红外线或无线电控制家居电器的工作状态。设计中为了提高产品的稳定性,控制部分我们采用STC单片机完成,通过遥控器发射红外线控制继电器,从而间接去控制各个电器的状态。防盗报警部分,我们采用热释电传感器,预置报警电路工作时在检测到人体的红外信号后执行相应的报警动作。
2、控制部分设计方案论证与选择
方案一、使用高端的ARM芯片和FPGA芯片作为主控芯片,可以轻松实现高速实时同步的功能,但是由于目前智能家居的实场竞争力相当大,若为了设计的简单而失掉了产品最重要的价格优势,那么我们的产品将永远对在实验室里。
方案二、采用性价比很高的STC单片机控制,既可实现稳定的系统设计,又可以使生产成本控制在很低的范围,所以,采用方案二。
3、显示部分设计方案论证与选择
方案一、采用两个四位七段数码管显示,控制简单易行,所占体积较小,但需要额外的驱动或扩展芯片,整体结构不够直观大方。
方案二、使用128X64LCD显示,感觉美观大方,显示清晰明了,所需的元件也较少。
综上所述,LCD电路简单,性价比高,又能很好完成驱动作用,选择方案二。
在方案二的基础上,还做了一个人机界面,能够更加直观方便的利用网络进行控制。
4、
系统组成
本系统由PC主机和单片机客户端两大部分组成,两部分通过RS232协议通讯,实现实时同步数据的功能。
单片机客户端有以下部分主成:串口通信、PS2键盘控制、红外遥控控制、光电传感、热释电、温度传感、12864液晶模块显示、蜂鸣器报警、8路开关控制;
PC主机端自身拥有人机交流模块,用户也可在PC端通过键盘和鼠标实现8路开关的控制;同时PC主机端负责接收并处理来自单片机客户端的控制数据和防区数据,通过一定的算法实现单片机客户端与PC主机端的数据同步;PC主机端还负责同步系统时钟和显示温度数据的功能;PC端在处理防区数据时有辨别防区和记录最新防区报警时间的功能;其中实现实时同步的关键是数据交流和中断处理,以下在系统总方框图中将给出处理算法。
只须懂C++,编写程序如下:
UINT
CIrPulse::FindIrPort()
{
//
查询注册表中的IR端口号
HKEY
hKey
=
NULL;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Comm\IrDA"),0,
0,
&hKey)
==
ERROR_SUCCESS)
{
DWORD
dwType
=
0;
DWORD
dwData
=
0;
DWORD
dwSize
=
sizeof(dwData);
if
(RegQueryValueEx(hKey,
_T("Port"),
NULL,
&dwType,
(LPBYTE)
&dwData,
&dwSize)
==
ERROR_SUCCESS)
{
if
(dwType
==
REG_DWORD
&&
dwSize
==
sizeof(dwData))
{
RegCloseKey(hKey);
return
(UINT)
dwData;
}
}
RegCloseKey(hKey);
}
return
0;
}
BOOL
CIrPulse::Open(UINT
uiPort)
{
ASSERT(uiPort
>
0
&&
uiPort
<=
255);
Close();
//打开IRDA端口
CString
strPort;
strPort.Format(_T("COM%d:"),
uiPort);
m_irPort
=
CreateFile((LPCTSTR)
strPort,
GENERIC_READ
|
GENERIC_WRITE,0,
NULL,
OPEN_EXISTING,
0,
NULL);
if
(m_irPort
==
INVALID_HANDLE_VALUE)
{
return
FALSE;
}
//设置输入和输出缓冲区的大小
VERIFY(SetupComm(m_irPort,
2048,
2048));
//清除读和写缓冲区
VERIFY(PurgeComm(m_irPort,PURGE_TXABORT|PURGE_RXABORT|
PURGE_TXCLEAR|PURGE_RXCLEAR));
//重新初始化所有的IRDA端口设置
DCB
dcb;
dcb.DCBlength
=
sizeof(DCB);
VERIFY(GetCommState(m_irPort,
&dcb));
dcb.BaudRate
=
CBR_115200;
dcb.fBinary
=
TRUE;
dcb.fParity
=
TRUE;
dcb.fOutxCtsFlow
=
FALSE;
dcb.fOutxDsrFlow
=
FALSE;
dcb.fDtrControl
=
DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity
=
FALSE;
dcb.fTXContinueOnXoff
=
FALSE;
dcb.fOutX
=
FALSE;
dcb.fInX
=
FALSE;
dcb.fErrorChar
=
FALSE;
dcb.fNull
=
FALSE;
dcb.fRtsControl
=
RTS_CONTROL_DISABLE;
dcb.fAbortOnError
=
FALSE;
dcb.ByteSize
=
8;
dcb.Parity
=
EVENPARITY;
dcb.StopBits
=
TWOSTOPBITS;
VERIFY(SetCommState(m_irPort,
&dcb));
//为所有的读和写操作设置超时值
COMMTIMEOUTS
timeouts;
VERIFY(GetCommTimeouts(m_irPort,
&timeouts));
timeouts.ReadIntervalTimeout
=
MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier
=
0;
timeouts.ReadTotalTimeoutConstant
=
0;
timeouts.WriteTotalTimeoutMultiplier
=
0;
timeouts.WriteTotalTimeoutConstant
=
0;
VERIFY(SetCommTimeouts(m_irPort,
&timeouts));
DWORD
dwEvent=EV_TXEMPTY;
SetCommMask(m_irPort,dwEvent);
return
TRUE;
}
BOOL
CIrPulse::SendCode(DWORD
lValue)
{
DWORD
dwCount;
int
i=0;
ASSERT(iDataLength>0);
//清除传送缓冲区
VERIFY(PurgeComm(m_irPort,PURGE_TXABORT|
PURGE_RXABORT
|PURGE_TXCLEAR
|
PURGE_RXCLEAR));
//每次按键设置代码6次
for(int
x=0;x<6;x++)
{
MakeStream(lValue);
//发送代码
dwCount=GetTickCount();
while(GetTickCount()
i++;
}
return
true;
}BOOL
CIrPulse::MakeStream(DWORD
lValue)
{
DWORD
dwStreamLength;
//创建开始脉冲
dwStreamLength=iHPulse/charWidth;
ASSERT(Write((const
char
*)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
//
************************************
//
*****
在下一个脉冲到来前延迟一段时间
//
************************************
//循环操作代码中的位来发送脉冲
for(int
i=0;i
if(lValue
&
1)
{
//创建一个脉冲1
dwStreamLength=i1Pulse/charWidth;
ASSERT(Write((const
char
*)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
//
*********************************
//
***在下一个脉冲到来前延迟一段时间
//
*********************************
}
else
{
//创建一个脉冲
0
dwStreamLength=i0Pulse/charWidth;
ASSERT(Write((const
char
*)bPulseStream.GetData(),
dwStreamLength)==dwStreamLength);
//
********************************
//
**在下一个脉冲到来前延迟一段时间
//
********************************
}
lValue
>>=
1;
}
return
TRUE;
}
电脑上的是红外接收头,电视机上的也是红外接收头。记住!是接收头,不是发射头。遥控器故障率很低的,可以自己修看看,电池电力足的话,买个遥控器发射管上试试,一般坏的主要是这个,还有看看是不是线路板生锈啦,可以自己接下。
你的想法是想不通的,遥控器输出的红外线是特殊的PCM信号(脉冲编码调制信号),而笔记本输出的是二进制数据编码。两者差别很大,无法“沟通”。