1、单片机遥控单片机红外遥控的设计南昌科技大学 杜德钦1 方案论证:在现实生活中,随着技术的快速发展,自动化的程度越来越高;而在自动控制中,遥控控制成了不可缺少的一个部分,虽然现在有专门的编码遥控发送芯片,但本设计是基于AT89C51单片机的一种简易的遥控控制试验,用一块AT89C51单片机做发送模块用,主要是调制40KHz载波编码利用红外发送管,扫描键盘,通过相应的键值发出相应的脉冲数;用另一块AT89C51做接收处理器,解码并做出相应的处理;在本应用系统中主要以控制灯泡亮度控制为例。2. 系统硬件电路的设计: 单片机遥控应用系统电路分为遥控发送电路和接收电路(1) 遥控发送电路设计a) 详细电
2、路图见后;b) 其中在原理图中:P0口用着键盘扫描端口,利用矩阵式键盘有16个按键,分别有16个功能;第9脚是单片机复位脚,才用RC电路来实现上电复位;第15脚为红外线遥控码的输出口,用于输出40KHz载波编码,第18,19脚接12MHz晶振。因为AT89C51单片机P0口内部不具有上拉电阻,所以要接上拉电阻。c) AT89C51单片机i. 主芯片AT89C51内含8Kb flash 存储器,256x8位内部RAM,两个定时器,使用5V电源供电,在发送电路中可以采用LV型,方便电池供电。d) 矩阵式键盘处理I 矩阵式键盘是用I/O口组成行列结构,用扫描方式来读取键码; 在这里是用P0口来扩展的
3、,实现16个键盘。(2) 红外接收电路设计a) 详细电路图见后b) 在电路图中有电源电路,调光控制电路;交流电过电源检测电路;c) 我们把电灯的亮度分为7个档,同时用P1.0P1.2作为数码管的二进制数据输出,显示数字07,采用4511集成硬件译码现实数值,以及P0.0P0.7和P2.0P2.6作为十五个电器的电源控制,接口可用继电器和可控硅。d) 本电路中P2.7为控制电灯的可调亮度。P3.0为50H交流电相位基准输入,第12脚为中断输入口,P3.1用于接收红外遥控编码输入信号。e) 电源和交流电过零检测电路f) 开关及亮度控制电路 3. 系统软件设计 1) 遥控码的编码格式 遥控码采用脉冲
4、个数编码个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲;为了接收可靠,第一位脉宽为3ms,其余为1ms,遥控码数据帧间隔大于10ms,其编码图形如图所示:编码1格式编码2格式2) 遥控码的发送 当某个键按下时,单片机先读出键值,然后根据键值设定遥控码的个数,再调40khz方波有红外发光管发送出去。 P3.5端口的输出调波如下图所示调光命令波形码3)数据帧接收的处理 当红外接收器输出脉冲帧数据时,第一位码的低电平将起动中断程序,实时接收数据,在接收数据帧是,将第一位(起始位)码的脉宽进行验证,若第一位的低电平的脉宽小于3ms将做错误处理,当间隔位的高电平脉宽大于3ms,作
5、为接收到结束信号;,结束接收,再根据脉冲计数器中脉冲的个数来做出相应的处理,下图为红外接收头输出的一帧遥控码波形:4. 遥控发射及接收控制程序设计流程图1)遥控发送器主程序,键盘扫描程序,遥控码发送程序流程图如下图所示: 2)遥控接收主程序,中断程序流程图如下所示:5. 调试及性能分析1) 调试在调试过程中一般先进行系统硬件检查后进行软件调试,对遥控器的调试主要是用示波器来观察接收到的遥控编码波形,能否达到要求。其次调整发射电阻的大小可以改变红外线发送距离,电灯的控制系统中通过对可控制硅的延时时间的调整,电灯按07共8个档次来调整亮度。红外接收头应尽量安装在靠表面,以扩大接收的角度,不同厂家的
6、遥控接收头的接收角度不一致,以选择确定;2) 性能指示调试后性能指标测试如下:1. 最大遥控距离:10m;2. 发射接收角:水平最大900;3. 遥控器发射时工作电流:20mA;4. 电灯最亮电压:AC220;5. 电灯最暗电压:AC10;当采用红外接收时距离和角度等使用效果都将受到一定的限制;当采用调频或调幅接收时距离会远些,接收不受角度的影响。本单片机遥控编码及解码方案一般的遥控电器控制系统中!6. 控制源程序以c语言为例:1):发送程序/*红外遥控发送 AT89C51 12MHz晶振*/#include #include #define uint unsigned int#define
7、uchar unsigned char #define key P0sbit hwout=P35; /红外输出脚uchar temp1,m,n;uchar temp=0;/*1ms延时*/void delay(uint t) uchar i,j; for(i=0;it;i+) for(j=0;j120;j+);/*初始化程序*/void init() IE=0x00; IP=0x01; hwout=0; TMOD=0x020; TH0=0xf3; TL0=0xf3; EA=1;/*定时器1中断*/void time1() interrupt 4 hwout=hwout;/*发送程序*/void
8、 send(m) TR1=1; /40KHz发3ms ET1=1; delay(3); ET1=0; TR1=0; hwout=0; for(n=0;nm;n+) /停1秒 TR1=1; /40KHZ发1ms ET1=1; delay(1); ET1=0; TR1=0; hwout=0; delay(10);/*键盘程序*/void keyscan() key=0xf0; _nop_(); temp=key; if(temp!=0xf0) delay(3); /消抖 if(temp!=0xf0) /确认是否有键按下 temp=key; key=0x0f; _nop_(); temp1=key;
9、 temp=(temp&0xf0)|(temp1&0x0f);/获取键码 delay(3); temp1=0; while(temp1) /判断是否放开按键 key=0xf0; _nop_(); temp1=key; temp1=0xf0; switch(temp) /获取键值 case 0x77:m=1; break; case 0xB7:m=2; break; case 0xD7:m=3; break; case 0xE7:m=4; break; case 0x7B:m=5; break; case 0xBB:m=6; break; case 0xDB:m=7; break; case 0
10、xEB:m=8; break; case 0x7D:m=9; break; case 0xBD:m=10; break; case 0xDD:m=11; break; case 0xED:m=12; break; case 0x7E:m=13; break; case 0xBE:m=14; break; case 0xDE:m=15; break; case 0xEE:m=16; break; default: break; send(m); /*主程序*/void main() init(); while(1) keyscan(); 2) :接收程序/*红外遥控接收 AT89C51 12MH
11、z晶振*/#include #include #define uint unsigned int #define uchar unsigned char #define disout P1sbit powerin=P30;sbit hwin=P31;/对应按键的处理位定义sbit key1=P00;sbit key2=P01;sbit key3=P02;sbit key4=P03;sbit key5=P04;sbit key6=P05;sbit key7=P06;sbit key8=P07;sbit key9=P20;sbit key10=P21;sbit key11=P22;sbit key
12、12=P23;sbit key13=P24;sbit key14=P25;sbit key15=P26;sbit pwm=P27; /灯光pwm控制 /变量定义uint key; /定义一个红外脉冲计数变量uchar k; /定义一个记时变量判断是否为结束信号uint s=1;/*1ms延时*/void delay(uint t) uint i,j; for(i=0;it;i+) for(j=0;j2) goto loopout; loopout: switch(key) /对应键盘选择相应的处理 case 2:key1=key1;break; case 3:key2=key2;break;
13、case 4:key3=key3;break; case 5:key4=key4;break; case 6:key5=key5;break; case 7:key6=key6;break; case 8:key7=key7;break; case 9:key8=key8;break; case 10:key9=key9;break; case 11:key10=key10;break; case 12:key11=key11;break; case 13:key12=key12;break; case 14:key13=key13;break; case 15:key14=key14;break; case 16:key15=key15;break; case 17: /调光和档次选择 if(disout=0x00) disout=0xff; else disout-; loop(); ;break; default:break; /*主函数*/void main() init(); loop(); P2=0xfe; while(1) while(powerin=1) delay(s); tiaoguang();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1