多路遥控器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
摘要 1
英文摘要 1
引言 2
1 设计要求 3
2 元器件的选择 3
2.1单片机的选择 3
2.2 共阳数码管 4
3 系统硬件设计 5
3.1硬件组成及工作原理 5 3.2单片机最小系统 5
3.3 红外遥控发射电路 6 3.4 红外遥控接受电路 6 3.5 显示电路 7
3.6 矩阵式键盘电路 7
3.7 电源电路 8
4 系统软件设计 9
4.1 设计与分析 9
4.2 软件设计流程图 9
5 系统调试 11
5.1 调试的过程和结果 11
结论和谢辞 12
参考文献 13
附件1.元器件清单 14
附件2.程序清单 15
附件3.电路图 27
附件4. PCB图 28
附件5. 实物图 29
基于51单片机的多路电器遥控器的设计
信息工程学院应用电子技术黄灵燕
摘要: 本文介绍的是用单片机制作的15路电器遥控器,可以分别控制15个电器的电源开关,并且可对一路电灯进行亮度的遥控。
该遥控器采取脉冲个数编码,4×8键盘开关,可扩充到对32个电器的控制。
通过控制按键来控制相应的15电路,红外遥控器其体积小、功耗低、功能强、成本低的特点! 采用红外遥控器做
控制器的单片机系统,不仅价格低廉,而且电路简单、实用,操作方便,性能稳定,易于推广。
关键词:电器遥控器红外接收器红外发射器
Design of multi-appliance remote control Based on 51
Microcontroller
(Major of Applied Electronic Technology,Information and Engineering college, JinHua College of Vocation And Technology, Huang Lingyan)
Abstract :This article has analyzed and describes the use of the Microcontroller 15 way electric remote control.Can separately control the electrical power switch 15. And the brightness can be remote-controlled lights the way. The number of coded remote control to take pulse. 4 × 8 keyboard switch. Can be expanded to control electrical appliances on the 32. Through the control buttons to control the corresponding circuit 15. The Infrared have small size,low power consunption function , low cost. Using the infrared do controller, inexpensive SCM system, and simple, practical, easy operation, stable performance, easy extension.
Key words: Electric Remote Control Infrared receiver infrared transmit
引言
随着电子技术的飞速发展,新型大规模遥控集成电路的不断出现,使遥控技术有了日新月异的发展,遥控装置的中心控制部件已从早期的分立元件、集成电路逐步发展到现在的单片微型计算机,智能化程度大大提高。
近年来,遥控技术在工
业生产、家用电器、安全保卫以及人们的日常生活中使用越来越广泛。
而红外遥控技术近年来得到了迅猛发展,尤其在家电领域如彩电、DVD、空调等,也在其它电子领域得到广泛应用。
随着人们生活水平的提高,电器在家庭中已经十分普及,人们对产品的追求是使用更方便、更具智能化,红外遥控技术正是一个重点的发展方向。
通过基于51单片机的多路电器遥控器的硬件和软件设计有利于巩固和提高学生对小型电子产品设计的能力,培养思考问题及解决问题的能力,提高创新能力和动手操作能力有帮助课题主要是围绕无线遥控密码锁控制系统的相关的理论和实进行研究。
主要包括以下的内容:无线遥控模块发送与接受以及单片机系统设计的应用。
1 设计要求
在这个设计中,遥控器控制15个电器的开关,并且可对一路电灯进行亮暗的控制。
采取的是红外控制技术,红外技术通过光信号传递数据,因而不受电磁干扰,通讯的可靠性高。
数码管的数据输出显示数字为0—7,7代表最亮,0代表最暗,15个电器的电源输出接口用的是继电器。
当某个操作按键按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40KHz的方波由红外线发射管发射出去。
当红外线接收器输出脉冲帧数据时,第一码的低电平将启动中断程序,实时接收数据帧。
2 元器件的选择
2.1单片机的选择
选择的是单片机为AT89C51,下面是单片机的管脚说明图:
图2-1 AT89C51引脚图
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部
上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
2.2 共阳数码管
共阳数码管不用驱动,更好的实现显示功能。
数码管按段数分为七段和八段数码管,管不八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到
+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的
阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
3 系统硬件设计
遥控器由发射电路和接收电路两部分组成。
3.1硬件组成及工作原理
显示电路
按键电路
图3-1 控制电路功能图
电器遥控器的组成框图如图3-1所示,它是以单片机作为核心控制器,主要由显示电路、电源电路、红外发射电路、红外接受电路、复位电路和按键电路等组成。
按键电路是矩阵式键盘适用与按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上。
一个4×4的行、列结构可以构成一个有16个按键的键盘。
矩阵键盘与独立式按键键盘相比,要节省很多I/O口。
红外遥控发射电路:第9脚为单片机的复位脚,采用简单的RC上电复位电路,15脚为红外线遥控器的输出口,用于输出40KHz载波编码。
红外遥控接收电路:接收器的数码管的二进制数据输出显示数字为0—7,7代表最亮,0代表最暗,15个电器的电源输出接口用的是继电器。
3.2单片机最小系统
AT89C51的上电复位电路,只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。
对于CMOS型单片机,由于在RST端内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至10μF。
上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。
为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。
显示电路采用的是共阴数码显示管的显示,用上拉电阻提供电流,并对电路起保护作用。
电路如3-2图所示。
图3-2 单片机最小系统
3.3 红外遥控发射电路
第9脚为单片机的复位脚,采用简单的RC上电复位电路,15脚为红外线遥控器的输出口,用于输出40KHz载波编码。
图3-3 红外遥控发射电路图
3.4 红外遥控接收电路
接收器的数码管的二进制数据输出显示数字为0—7,7代表最亮,0代表最暗,15个电器的电源输出接口用的是继电器。
图3-4 红外遥控接收器电路图
3.5 显示电路
用单个共阴数码管显示的,数码管的二进制数据输出显示数字为0—7,7代表最亮,0代表最暗。
图3-5显示电路图
3.6 矩阵式键盘电路
图3-6 矩阵式键盘电路图
矩阵式键盘电路如图3-6图所示,矩阵式键盘适用与按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上。
一个4×4的行、列结构可以构成一个有16个按键的键盘。
如3-6图所示,这是本课题所设计的矩阵键盘电路。
很明显,在按键数量较多的场合,矩阵键盘与独立式按键键盘相比,要节省很多I/O口。
在键盘的设计时,开始选用的是大的按键,但是考虑到PCB板的大小,我后来选用的是小的按键,可以节省覆铜板,按键的行线和列线分别接P2的8位。
3.7 电源电路
电源电路的工作过程是:变压、整流、滤波、稳压。
变压是把220V的电压变成12V的电压。
为了克服半波整流的缺点,采用的是桥式整流电路,将交流变成脉动直流电。
为了获得平滑的直流电源,整流电路后面加了滤波电路,滤掉交流成分。
7805稳压器中设有比较完善的保护电路,主要用来保护调整管,它具有过流、过压和过热保护功能。
7805将电压整流成5V的电源电压。
电源电压如图3-7所示。
图3-7电源电路图
4 系统软件设计
4.1 设计与分析
采用的是AT89C51的单片机,系统的软件工作过程如下:
1)上电时,显示器上显示的是“0”,代表最暗,其他按钮是处于关闭状态。
2)当某个操作按键按下时,单片机先读出键值,然后根据键值设定遥控码的脉冲个数,再调制成40KHz的方波由红外线发射管发射出去。
3)当红外线接收器输出脉冲帧数据时,第一码的低电平将启动中断程序,实时接收数据帧,在数据帧接收时,将对第一位(起始位)码的码宽进行验证。
若第一位低电平码的脉宽小于2ms,将作为错误码处理,当间隔位的高电平脉宽大于
3ms时,结束接收,然后根据累加器A中的脉冲个数,执行相应输出的操作。
4.2 软件设计流程图
软件设计流程图主要分为遥控发射电路和遥控接收两个流程图,图4-1遥控发射信号流程图和图4-2遥控接收信号流程图。
图4-1遥控发射器程序流程图
图4-2 遥控接收器主程序中断程序流程图
5 系统调试
5.1 调试的过程和结果
在电路板通电测试之前,必须认真对安装电路进行下列事项的检查:先检查电路上电解电容的正负极是否插反,插反可能会导致电路板烧掉。
检查电路否是通的,用万用表查各个可以接通的两个点的电路是否是通路,接电源的和接地的点呀要检查是否接错。
将遥控器和接收器都接上电时,数码管显示为“0”,LED灯都不亮的,依次的按15个按键时,刚开始1灯是不亮的,就检查红外接受部分可能出错了,依次的检查各个点的电压,发现有电路被我短接了,最终电路没成功。
参考文献
[1]彭为等编著.单片机典型系统设计实例精讲[M],电子工业出版社,2006,1:15~32.
[2]李朝青主编.无线发送/接收IC芯片及其数据通信技术选编2[J].北京航天航空大学出版社,2004,2:34~56.
[3]杜小平,契桂花,雷道振. 单片机初级教程—单片机基础[M].北京: 北京航空航天大学出版社, 2006,4:77~56.
[4]楼然苗,李光飞. 51系列单片机设计实例[M].北京: 北京航空航天大学出版社, 2008,4:46~89.
[5]胡宴如. 模拟电子技[M].北京:高等教育出版社,2000,7:56~99.
[6]中国电子网,
[7]中国电子设计网,
附件1.元器件清单
附件2.程序清单
1. 红外发射程序
#define uchar unsigned char
#define uint unsigned int
#include <math.h>
#include<intrins.h>
#include"reg51.h"
#define THO_int 0xff //定时器高8位初值
#define TL0_int 55 //定时器低8位初值#define TMOD_int 0x01 //设置定时器工作模式#define TCON_int 0x10 //启动定时器
sbit HW_OUT=P1^0;
//******************************************
uchar tx_delay;
uchar IRF_buf;
uchar old_buf;
uchar IRF_step_cont;
uchar IRF_cont;
uchar IRF_tmfige;
uchar IRF_step;
uchar IRF_cont_buf;
uchar DA_step;
uchar tx_cont;
uchar tx_cn;
uchar IRF_data_buf2[4];
uchar IRF_data_buf[4];
uchar TX_BUF[6];
uchar TX_BUF2[6];
//****************************************** uchar key_cont;
uchar key_buf;
uchar key;
uchar old_key,new_key;
uchar key_out;
//******************************************* uchar sec;
uchar cont_10ms;
uchar code key_scan_tap[4]={0x10,0x20,0x40,0x80};
uchar code
key_tap[16]={0x1e,0x1d,0x1b,0x17,0x2e,0x2d,0x2b,0x27,0x4e,0x4d,0x4b,0x47 ,0x8e,0x8d,0x8b,0x87};
struct flag
{
unsigned hw_tx_ok:1;//允许发送红外线标记
unsigned tou_ma:1; //头码发送标记
unsigned sen_en:1; //发送使能
unsigned T_10ms:1; //10MS标记
}
flag1;
//位变量定义,主要用来作标记
struct SYS_flag
{
unsigned DA_GX:1; //8位数据发送完标记
unsigned sen_vor:1;//电平标记,0时发送高电平,1时发送低电平
unsigned sen_jg:1; //一帧数据发送完成标记
unsigned Pwer:1; //开关机标记
}
SYS_flag;
//************************************************** //定时器初值化
void T0_int(void)
{
TMOD=TMOD_int; //设置定时器工作模式0
TCON=TCON_int; //启动定时器
TL0=TL0_int; //装入定时器低8位初值
TH0=THO_int; //装入定时器高8位初值
AUXR=AUXR|0x80;//设置定时器为传统定时器的12倍
ET0=1; //定时器0允许中断
EA=1; //开总中断
}
//************************************************ // 发
void key_scan(void)
{ uchar i; P2=P2|0x0f;
old_key=new_key;
new_key=P2&0x0f;
if(new_key==old_key) {
if(key_cont<10)
{
key_cont++;
if(key_cont==10)
{
key_buf=new_key;
for(i=0;i<4;i++)
{
P2=key_scan_tap[i];
if(new_key!=P2&0x0f) {
key_buf=key_buf|key_scan_tap[i];
i=4;
}
}
for(i=0;i<16;i++)
{
if(key_buf==key_tap[i])
{
key=i;
key_out=1; //启动发送
TX_BUF2[0]=111; //发送地址位高8位
TX_BUF2[1]=11; //发送地址位低8位TX_BUF2[2]=key; //用键码作为用户码TX_BUF2[3]=key^0xff;//发送用户反码
TX_BUF[0]=TX_BUF2[0];
TX_BUF[1]=TX_BUF2[1];
TX_BUF[2]=TX_BUF2[2];
TX_BUF[3]=TX_BUF2[3];
i=16;
}
}
}
}
}
else
{
key_cont=0;
}
}
void timer0_(void)interrupt 1 using 1 // 定时器溢出周期为100us已加入16t
{
TR0=0;//
TL0=TL0_int;
TH0=THO_int;
TR0=1;
if(tx_delay>0)
tx_delay--;
//以下为红外发送编码管理
if((key_out==1)&&(tx_delay==0))
{
if(flag1.tou_ma==1) //如果头码已发
送
{ if(SYS_flag.sen_jg==1) //如果一帧已发送完毕,则进入帧与帧之前的间隔时间
{ SYS_flag.sen_jg=0; //清第一帧发送标记
DA_step=0; //发送阶段清0
SYS_flag.sen_vor=0;//下一次准备发送红外线
tx_delay=20; //帧与帧之前的间隔时间2MS
tx_cont=0; //发送计数器清0
flag1.tou_ma=0; //清头码发送标记
flag1.sen_en=0; //关闭发送
}
else
if(SYS_flag.sen_vor==1)//是否是发送间隔时间
{
if(TX_BUF[DA_step]&0x01)//如果发送据最低为1
{
tx_delay=16; //送发1码宽为1.6MS
}
else
{ tx_delay=6; //送发0码宽为0.6MS }
flag1.sen_en=0;
SYS_flag.DA_GX=1;
SYS_flag.sen_vor=0;
TX_BUF[DA_step]=TX_BUF[DA_step]>>1;
}
else
{
tx_delay=6; //发送数据0或1红外发送宽度flag1.sen_en=1;
SYS_flag.sen_vor=1;
}
if(SYS_flag.DA_GX==1) //如果发送完一位数据{ SYS_flag.DA_GX=0; //清标记
tx_cont++; //发送计数器加1
}
if(tx_cont>=8) //发送完一个字节
{ tx_cont=0;
DA_step++; //指向下一个字节,准备发送下一字节if(DA_step>=6)
{ tx_cn++; //发送帧计数器
if(tx_cn>=2)//如果已发送送了两帧
{ tx_cn=0;//清帧计数器
key_out=0; //禁止发送
}
else
if(tx_cn==1)
{ //让第二帧数据进入发送缓冲
TX_BUF[0]=TX_BUF2[0];
TX_BUF[1]=TX_BUF2[1];
TX_BUF[2]=TX_BUF2[2];
TX_BUF[3]=TX_BUF2[3];
tx_delay=2; //第一帧结束后间隔时间SYS_flag.sen_jg=1;//第一帧发完标记
flag1.sen_en=1; //打开红外发射
}
}
}
}
else
{
if(SYS_flag.sen_vor==0) //如果允许发送红外线{ tx_delay=45; //发送红外时间
flag1.sen_en=1; //打开红外发射
SYS_flag.sen_vor=1; //让下一次发送间隔脉冲
}
else
{ tx_delay=45;//发送低电平
flag1.sen_en=0;//关闭红外发射
SYS_flag.sen_vor=0;
flag1.tou_ma=1;
}
}
}
else
if((flag1.hw_tx_ok==0)&&(tx_delay==0)) //如果数据发送已结束,后面再发送1MS宽脉冲
{
if(SYS_flag.sen_vor==0) //如果允许发送红外线
{
flag1.sen_en=1; //打开经红外发射
tx_delay=10; //发送红外时间
SYS_flag.sen_vor=1; //让下一次发送间隔脉冲
} //不允许发送红外线,进行发送间隔状态
else
{
flag1.sen_en=0; //关闭红外发射
tx_delay=10; ////关闭红外发射时间
}
}
cont_10ms++;
if(cont_10ms>=100) {
cont_10ms=0;
flag1.T_10ms=1;
}
if(flag1.sen_en==1) {
HW_OUT=0;
}
else
{
HW_OUT=1;
}
}
void main(void)
{
T0_int();
for(;;)
{
}
}
2. 红外接收程序
#include"reg51.h"
#define uchar unsigned char #define uint unsigned int #define THO_int 0xff
#define TL0_int 0x37
#define TMOD_int 0x01 #define TCON_int 0x10
sbit OUT=P1^0;//调光输出
sbit read_hw=P1^7;
sbit read_zero=P1^1;
sbit OUT1=P2^7;
sbit OUT2=P2^6;
sbit OUT3=P2^5;
sbit OUT4=P2^4;
sbit OUT5=P2^3;
sbit OUT6=P2^2;
sbit OUT7=P2^1;
sbit OUT8=P2^0;
sbit OUT9=P3^7;
sbit OUT10=P3^6;
sbit OUT11=P3^5;
sbit OUT12=P3^4;
sbit OUT13=P3^3;
sbit OUT14=P3^2;
//表格存于ROM*************************************
uchar
code HW_code_tap[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
uchar code P_tap[6]={30,25,20,15,12,9};
//变量定义存于RAM**********************************
uchar cont_4ms;
uint cont_1s;
uchar old_v;
uchar new_v;
uchar OUT_P_CONT;
uchar set_p_time;
uchar out_delay;
uchar p_cont;
//**************************************************
uchar fige;
//**************************************************
uchar sec_cont; //
uchar key;
//************************************************** uchar IRF_tmfige;
uchar IRF_step;
uchar IRF_step_cont;
uchar IRF_data_buf2[4];
uchar IRF_cont_buf;
uchar rx_rf_cont;
uchar IRF_data_buf[4];
uchar IRF_buf;
uchar IRF_cont;
uchar old_buf;
uchar out_flag;
//*************************************************** uchar bdata sys_flag;
sbit key_out=sys_flag^0;
sbit zero_flag=sys_flag^1;
//****************************************************
void T0_int(void)
{
TMOD=TMOD_int;
TCON=TCON_int;
TL0=TL0_int;
TH0=THO_int;
ET0=1;
EA=1;
}
//***************************************************************** ***
//单片机初始化
void MCU_init(void)
{
P1=0x00;
P2=0x00;//关闭继电器
P3=0x00;//关闭继电器
P0=0x00;
}
void hw_control(void)
{ uchar i;
if(out_flag==1)
{ out_flag=0;
for(i=0;i<15;i++)
{
if(IRF_data_buf2[2]==HW_code_tap[i]) { key_out=1;
key=i;
i=15;
}
}
}
}
void out_control(void)
{
if(key_out)
{
key_out=0;
switch(key)
{
case 0: OUT1=!OUT1;break; case 1:; OUT2=!OUT2;break; case 2: OUT3=!OUT3;;break; case 3:; OUT4=!OUT4;break; case 4:; OUT5=!OUT5;break; case 5:; OUT6=!OUT6;break; case 6:; OUT7=!OUT7;break; case 7:; OUT8=!OUT8;break; case 8:; OUT9=!OUT9;break; case 9:; OUT10=!OUT10;break; case 10:;OUT11=!OUT11;break;
case 11:;OUT12=!OUT12;break;
case 12:;OUT13=!OUT13;break;
case 13:;OUT14=!OUT14;break;
case 14:;OUT_P_CONT++;
if(OUT_P_CONT>=6)
{
OUT_P_CONT=0;
set_p_time=P_tap[OUT_P_CONT];
}
set_p_time=P_tap[OUT_P_CONT];
break;
}
}
}
//***************************************************************** **
//定时器中断
void timer0_(void)interrupt 1 using 1 // 定时器溢出周期为200us已加入16t
{
TR0=0;//
TL0=TL0_int;
TH0=THO_int;
TR0=1;
if(out_delay)
{
OUT=0;
}
else
OUT=1;
read_zero=1;
old_v=new_v;
new_v=read_zero;
if(old_v==new_v)
{
//zero_flag=0;
}
else
{ zero_flag=1; p_cont=0;
}
if(zero_flag)
{ p_cont++;
if(p_cont>=200)
p_cont=0;
if(set_p_time==p_cont) {
out_delay=5;
zero_flag=0;
}
}
cont_4ms++;
if(cont_4ms>=16)
{ cont_4ms=0;
}
//************************************************* read_hw=1;
old_buf=IRF_buf;
IRF_buf=read_hw;
if(IRF_buf==old_buf)
IRF_cont++;
else
if(read_hw==0)
{ IRF_cont_buf=IRF_cont;
IRF_cont=0;
if(IRF_tmfige==1)
{
if((IRF_cont_buf>=2)&&(IRF_cont_buf<=14))
{
if(IRF_cont_buf<=7)
{ IRF_data_buf[IRF_step]=IRF_data_buf[IRF_step]>>1; IRF_data_buf[IRF_step]=IRF_data_buf[IRF_step]&0x7f;
IRF_step_cont++;
}
else
{ IRF_data_buf[IRF_step]=IRF_data_buf[IRF_step]>>1; IRF_data_buf[IRF_step]=IRF_data_buf[IRF_step]|0x80;
IRF_step_cont++;
}
if(IRF_step_cont==8)
{ IRF_step++;
IRF_step_cont=0;
if(IRF_step>=4)
{ IRF_step=0;
IRF_tmfige=0;
IRF_data_buf2[0]=IRF_data_buf[0];
IRF_data_buf2[1]=IRF_data_buf[1];
IRF_data_buf2[2]=IRF_data_buf[2];
IRF_data_buf2[3]=IRF_data_buf[3];
if((IRF_data_buf2[3]+IRF_data_buf2[2])==255) out_flag=1;
}
}
}
else
{ IRF_tmfige=0;
IRF_step=0;
IRF_step_cont=0;
}
}
else
{ if((IRF_cont_buf>60)&&(IRF_cont_buf<75)) { IRF_tmfige=1;
IRF_step=0;
IRF_step_cont=0;
}
else
{
IRF_tmfige=0;
IRF_step=0;
IRF_step_cont=0;
}
}
}
//************************************************ cont_1s++;
if(cont_1s>=2000)
{ cont_1s=0;
}
//******************************************************** }
void main(void)
{
MCU_init();
T0_int();
for(;;)
{
hw_control();
out_control();
}
}
附件3.电路图
1.1遥控发射器电路原理图
1.2遥控器接收电路原理图附件4. PCB图
1. 遥控发射电路板
2. 遥控接收电路板
附件5. 实物图
1. 遥控发射实物图
2. 遥控接收实物图。