1、单片机课程设计姓名:班级:学号:课题编号:课题三课题名称:红外遥控器基本功能:红外遥控器是由发射部分和接收部分组成的,它的基本功能是在发射部分按一个键,在接收部的数码管上显示对应的键值(09)。 扩展功能:红外遥控器是由发射部分和接收部分组成的,它的基本功能是在发射部分按一个键,在接收部的数码管上显示对应的键值(A、B)。成绩:评审老师:一、 需求分析(1)应用场合: 红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空调机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压
2、、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅安全可靠而且能有效地隔离电气干扰。(2)设计目的:实现简单的数据传送和接收。(3)立题意义:体会红外遥控器编程上的一些独特的编法,以及硬件连接和各部件的使用。在这次课设中制作红外遥控器的目的是为了学习它的基本功能,以及这些功能怎样用AT89C51去编程实现我们需要的功能。二、 硬件设计方案发射部分包括键盘矩阵43、AT89C51单片机、LED红外发送器;接收部分包括红外接收器、AT89C51单片机、解码电路、数码管。 硬件所用的器件: 序号名称型号数量1单片机AT89C5122按键四脚123电阻47054电阻4.7K25电解电容22uf26瓷片
3、电容30pf47晶振12MHz28红外发射器519接收头V34138110电源5V211七段数码管共阳112三极管NPN113万用板2AT89C51芯片的原理:AT89系列单片机是ATMEL公司最早推出,也是功能最简单的一个系列,该系列都是内含Flash程序存储器的MCS-51兼容单片机,AT89C51就是其中一款可在线编程ISP Flash单片机。AT89C51具有价格便宜、性能优良、可在线编程等特点。其具体性能参数如下:兼容MCS-51内核单片机;4KB可在线编程Flash存储器,可有效擦除/读写1000次;工作电压范围4.05.5V;完全静态工作:0Hz33MHz;ROM三级加密模式;1
4、28*8bit内置RAM;32位可控I/O引脚;2个16位的时钟源;5个中断源;全双工UART串行接口;低功耗工作模式;看门狗计时器;两个数据指针;快速编程特性。三、 软件设计方案发射流程图:接收流程图:算法分析:这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.6ms、间隔0. 6ms、周期为1.2ms 的组合表示二制的“0”;以脉宽为1.2ms、间隔0.6ms、周期为1.8ms 的组合表示二进制的“1”,其波形如图2 所示。图2 遥控码的“0”和“1”上述“0”和“1”组成的10 位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二
5、极管产生红外线向空间发射,如图3 所示。图3 遥控信号编码波形图利用定时器产生的遥控编码是连续的10 位二进制码组,其中前2位为引导码,能区别不同的电器设备,防止不同机种遥控码互相干扰。后8位操作码(数据码)。四、 调试软件调试:使用伟福WAVE.在使用中,我们使用断点调试,用跟踪型单步观察程序,设定观察项,查看程序运行时设定值的变化,并修改程序,并使用伟福试波器来观察波形。硬件调试:使用万用表检查万用板的焊接线路是否连接无误各个器件是否短接,芯片引脚是否接错或少接,以免烧坏元器件,焊点是否连焊、虚焊或焊点过大,线路连接是否美观五、 心得体会(1)我们在最开始的焊板中就遇到了问题,首先没考虑到
6、芯片在万用板上摆放位置,以至于接线无法完成,焊点不够牢固,布线不够美观。经过反复思考调试达到预期效果。(2)软件调试上没有注意到细节,逻辑算法不够合理。经过不断修改和老师的指导调试成功。(3)通过本次课设使我们充分地了解和使用C51,并且能够合理地安排万用板上布线布局,对软件程序也能够根据要求合理地设计和安排程序逻辑。将红外遥控器的基本原理及编程,掌握并得到充分的运用。附录1:发射代码:#include reg51.h#includeabsacc.h#includeintrins.h#define uchar unsigned char#define uint unsigned intsbit
7、 A=P20;uchar flag=1,k; uchar flag2; sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12; sbit P1_3=P13; sbit P1_4=P14; sbit P1_5=P15; sbit P1_6=P16;unsigned char GetKey() /按键扫描子程序 uchar key,temp; P1=0xFF; /扫描第一行 P1_0=0; /第一行线送0 temp=P1; /读取P口数据 temp&=0xF0; /取高四位 if(temp !=0xF0) /判断高四位是否全为1 若果不是进入此函数 temp=P1
8、; /消抖从新检测 temp&=0xF0; if(temp !=0xF0) temp=P1; temp&=0xF0; switch(temp) /高四位判断数值 并进行码制转换 case 0xE0: key=0;flag2+;break; case 0xD0: key=1;flag2+;break; case 0xB0: key=2;flag2+;break; return key; P1=0xFF; /扫描第二行 P1_1=0; temp=P1; temp&=0xF0; if(temp !=0xF0) temp=P1; temp&=0xF0; if(temp !=0xF0) temp=P1;
9、 temp&=0xF0; switch(temp) case 0xE0: key=3;flag2+;break; case 0xD0: key=4;flag2+;break; case 0xB0: key=5;flag2+;break; return key; P1=0xFF; /扫描第三行 P1_2=0; temp=P1; temp&=0xF0; if(temp !=0xF0) temp=P1; temp&=0xF0; if(temp !=0xF0) temp=P1; temp&=0xF0; switch(temp) case 0xE0: key=6;flag2+;break; case 0
10、xD0: key=7;flag2+;break; case 0xB0: key=8;flag2+;break; return key; P1=0xFF; /扫描第四行 P1_3=0; temp=P1; temp&=0xF0; if(temp !=0xF0) temp=P1; temp&=0xF0; if(temp !=0xF0) temp=P1; temp&=0xF0; switch(temp) case 0xE0: key=9;flag2+;break; case 0xD0: key=10;flag2+;break; case 0xB0: key=11;flag2+;break; retur
11、n key; return key=15; void delay(uint k)while(k-)_nop_(); void timeint(void) interrupt 1 /定时器0中断处理 A=A;void fa(uchar h)uchar i=h; uchar s; ET0=1; delay(268); ET0=0; delay(290); for(s=0;s1; h=i; ET0=0; void main() TMOD = 0x02; /设定时器0为方式2 TH0 = 0xF3; /定时器赋初值 TL0 = 0xF3; TR0=1; /开定时器 EA = 1; /允许CPU中断 d
12、elay(1); while(1) k=getkey(); /接收键值 delay(800);if(k=1) ET0=1;fa(k);k=16;ET0=0; if(k=2) ET0=1;fa(k);k=16;ET0=0; if(k=3) ET0=1;fa(k);k=16;ET0=0; if(k=4) ET0=1;fa(k);k=16;ET0=0; if(k=5) ET0=1;fa(k);k=16;ET0=0; if(k=6) ET0=1;fa(k);k=16;ET0=0; if(k=7) ET0=1;fa(k);k=16;ET0=0; if(k=8) ET0=1;fa(k);k=16;ET0=
13、0; if(k=9) ET0=1;fa(k);k=16;ET0=0; if(k=10) ET0=1;fa(k);k=16;ET0=0; if(k=11) ET0=1;fa(k);k=16;ET0=0; if(k=12) ET0=1;fa(k);k=16;ET0=0; 接收代码:/解码程序/晶振12M#include reg51.h#include absacc.h#include intrins.hsbit DQ=P17;sbit p=P10;#define uint unsigned int#define uchar unsigned charuint conut=0,k=0;uchar j
14、ie=0;uchar code duma13=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83;void yindao() st: k=0; while(DQ=1); while(DQ=0) k+; /判断引导码 if(k=900)&(k=1300); else goto st;void jiema()uchar i=0; for(i=0;i90)&(k1+0; else jie=(jie1)+0x80; jie=jie4; _nop_(); void display(uchar k) uchar i;i=k;P2=dumai; /送数码管显示 p=1;void main() while(1) yindao(); /调引导函数 jiema(); /调解码函数 display(jie); /传送接收到的段码值
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922