基于单片机的红外遥控设计与制作_第1页
基于单片机的红外遥控设计与制作_第2页
基于单片机的红外遥控设计与制作_第3页
基于单片机的红外遥控设计与制作_第4页
基于单片机的红外遥控设计与制作_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 基于单片机的红外遥控设计与制作 13工试2班 陈舒佳 章韬略设计目的 对于本课题的研究,其理论中的价值是对红外线这种电磁波的特性进行更加深入的研究。同时在与单片机和电子电路的共同作用下,找到单片机及电子电路在实际运用中的更多功能,从而挖掘出红外线和硬件设备结合中的更多可能性。在现实意义中,对于红外线的使用,它不仅提高了单片机、硬件设备和硬件系统在智能遥控领域的广泛应用,而相对了在硬件设施上使用了红外线的遥控技术,也同时大大拓宽了硬件设施的应用范围。在不久的将来,我相信,人们对于红外遥控控制的运用,会变得越来越广。设计要求基本功能要求:以一个单片机作为控制遥控器,另一个单片机控制系统为被遥控对

2、象;用遥控器的10个遥控开关,控制遥控对象的10个电源开关通断;能实现10个电源开关状态显示;能实现定时开关某一个电源开关。扩展功能:能实现灯光亮度连续调节;能根据不同电器实现不同时间通断控制;其他扩展功能。方案设计3.1红外遥控发射电路的方案 采用指令键产生电路产生不同的控制指令,单片机进行状态的编码,直接由单片机的口输出方波信号控制红外发射管进行发射。红外发射管采用普通的红外发射二极管。3.2红外遥控接收电路的方案遥控系统采用红外线脉冲个数编码,直接利用单片机软件解码,实现功能的遥控。3.3单片机的选择本设计所编写的程序比较简单,功能也比较少,所用到的输入输出端口也不是很多,所以我们决定用

3、STC89C52单片机来完成本设计,既方便也很实用。3.4红外遥控系统电路的原理框图以及各部分作用各部分作用:(1)行列式键盘行列式键盘又称为矩阵式键盘,用I/O线组成行列结构,按键设置在行列的交点上,行列式分别连接到按键开关的两端。键盘中有无按键按下是由行线送入扫描字及列线读入列线状态字来判断的,有键按下时通过查键并执行键功能程序。(2)红外线发射电路遥控器信息码由单片机的定时器1中断产生40KHZ红外线方波信号。由P3.5口输出,经过三极管放大,由红外线发射管发送。(3)单片机单片机用于输出方波信号控制红外发射电路的工作。3.5红外接收部分原理框图以及各部分作用各部分作用:(1)+5V电源

4、电路给单片机最小系统、控制电路提供以及红外接收电路提供电压。(2)红外接收电路红外接收电路把接收到的状态在内部进行解码,从而实现不同的功能。(3)控制电路通过发射电路的按键实现对控制电路的控制作用。3.6系统硬件电路的设计红外发射电路:红外接收电路:遥控发射及接收控制电路的软件设计4.1软件设计流程图4.1.1键扫描程序流程图相应的按键扫描程序:#include #define uint unsigned int #define uchar unsigned char #define keyrow P0 #define keyline P2 uchar code keyv8=1,2,4,8;

5、uchar keyscan(void) uchar keyval,i; keyval=0; keyrow=0 xfe; if(keyline!=0 xff) for(i=0;i4;i+) if(keyline=keyvi) keyval=i+1; keyrow=0 xfd; if(keyline!=0 xff) for(i=0;i4;i+) if(keyline=keyvi) keyval=i+5; keyrow=0 xfb; if(keyline!=0 xff) for(i=0;i4;i+) if(keyline=keyvi) keyval=i+9; keyrow=0 xf7; if(key

6、line!=0 xff) for(i=0;i0;m-) delay1ms(1); ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0; delay1ms(10); /*40KHZ发生器*/ void time_intt1(void) interrupt 3 remoteout=remoteout; 4.1.3遥控发射主程序流程图遥控发射的主程序流程图:首先初始化程序,然后调用键扫描程序。相应的发射主程序如下:#include #define uint unsigned int #define uchar unsigned char extern uc

7、har keyscan(void); extern void init(void); extern void send_infrared(uchar keyval); void delay1ms(uint time) uint i,j; for(i=0;itime;i+) for(j=0;j110;j+); void main() uint keyval; init(); while(1) keyval=keyscan(); while(keyscan(); if(keyval) send_infrared(keyval); 4.1.4中断程序流程图中断过程:首先判断低电平脉宽度是否大于2ms

8、,若脉宽不到2ms,则中断返回;若低电平大于2ms,则接收并对低电平脉冲计数,接下来看判断高电平脉宽度冲是否大于3ms,若脉宽不到3ms,则返回上一接收计数过程;若高电平脉宽大于3ms,则按照脉冲个数至对应功能程序。此时中断返回。相应的中断程序如下:#include #include #define uchar unsigned char #define uint unsigned int sbit remotein=P31; extern void delay1ms(uint time); uchar value; /*初始化*/ void clearmen(void) EX0=1; EA=

9、1; /*外中断遥控接收函数*/ void intt0(void) interrupt 0 uchar keyval,k,sign; EX0=0;sign=0;keyval=0; if(remotein=0) delay1ms(2); if(remotein=0) while(1) while(remotein=0); keyval+;k=0;delay1ms(1); while(remotein=1) delay1ms(1);k+; if(k2) value=keyval-1; sign=1; break; if(sign) break; EX0=1; 4.1.5遥控接收器主程序流程图相应的

10、接收主程序:#include #include #define uchar unsigned char #define uint unsigned int extern void clearmen(void); extern uchar value; uchar temp; void delay1ms(uint time) uint i,j; for(i=0;itime;i+) for(j=0;j110;j+); void youyi(void) /7个流水灯逐个闪动 uint i; temp=0 x01; for(i=0;i8;i+) P2=temp;delay1ms(1000); temp

11、=1; void zuoyi(void) /7个流水灯反向逐个闪动 uint i; temp=0 x80; for(i=0;i=1; void quanliang(void)uint i; temp=0 xfe; for(i=0;i8;i+) /7个流水灯依次全部点亮 P2=temp; delay1ms(1000); temp=1; void fquanliang(void) uint i; temp=0 x7f; for(i=0;i=1; void main() clearmen(); P0=0 xff; while(1) if(value=1) P2=0 xfe; if(value=2)

12、P2=0 xfd; if(value=3) P2=0 xfb; if(value=4 P2=0 xf7; if(value=5) P2=0 xef; if(value=6) P2=0 xdf; if(value=7) P2=0 xbf; if(value=8) P2=0 x7f; if(value=9) P1=0 xfe; if(value=10) P1=0 xfd; if(value=11) youyi(); if(value=12) zuoyi(); if(value=13) quanliang(); if(value=14) fquanliang(); 演示结果当按下键1时,发光二极管L

13、ED1亮;当按下键2时,发光二极管LED2亮;当按下键3时,发光二极管LED3亮;当按下键4时,发光二极管LED4亮;当按下键5时,发光二极管LED5亮;当按下键6时,发光二极管LED6亮;当按下键7时,发光二极管LED7亮;当按下键8时,发光二极管LED8亮;当按下键9时,发光二极管LED9亮;当按下键10时,发光二极管LED10亮;当按下键11时,发光二极管LED8-LED1依次渐亮;当按下键12时,发光二极管LED1-LED8依次渐亮;当按下键13时,发光二极管LED8-LED1依次全亮;当按下键14时,发光二极管LED1-LED8依次全亮;附录:1.程序:#include #defin

14、e uint unsigned int #define uchar unsigned char #define keyrow P0 #define keyline P2 uchar code keyv8=1,2,4,8; uchar keyscan(void) uchar keyval,i; keyval=0; keyrow=0 xfe; if(keyline!=0 xff) for(i=0;i4;i+) if(keyline=keyvi) keyval=i+1; keyrow=0 xfd; if(keyline!=0 xff) for(i=0;i4;i+) if(keyline=keyvi)

15、 keyval=i+5; keyrow=0 xfb; if(keyline!=0 xff) for(i=0;i4;i+) if(keyline=keyvi) keyval=i+9; keyrow=0 xf7; if(keyline!=0 xff) for(i=0;i0;m-) delay1 ET1=1;TR1=1;delay1ms(1);ET1=0;TR1=0;remoteout=0; delay1ms(10); /*40KHZ发生器*/ void time_intt1(void) interrupt 3 remoteout=remoteout; extern uchar keyscan(vo

16、id); extern void init(void); extern void send_infrared(uchar keyval); void delay1ms(uint time) uint i,j; for(i=0;itime;i+) for(j=0;j110;j+); void main() uint keyval; init(); while(1) keyval=keyscan(); while(keyscan(); if(keyval) send_infrared(keyval); 接收系统:#include #include #define uchar unsigned ch

17、ar #define uint unsigned int sbit remotein=P31; extern void delay1ms(uint time); uchar value; /*初始化*/ void clearmen(void) EX0=1; EA=1; /*外中断遥控接收函数*/ void intt0(void) interrupt 0 uchar keyval,k,sign; EX0=0;sign=0;keyval=0; if(remotein=0) delay1ms(2); if(remotein=0) while(1) while(remotein=0); keyval+

18、;k=0;delay1ms(1); while(remotein=1) delay1ms(1);k+; if(k2) value=keyval-1; sign=1; break; if(sign) break; EX0=1; 接收主程序: extern void clearmen(void); extern uchar value; uchar temp; void delay1ms(uint time) uint i,j; for(i=0;itime;i+) for(j=0;j110;j+); void youyi(void) uint i; temp=0 x01; for(i=0;i8;i

19、+) P2=temp;delay1ms(1000); temp=1; void zuoyi(void) uint i; temp=0 x80; for(i=0;i=1; void quanliang(void)uint i; temp=0 xfe; for(i=0;i8;i+) P2=temp; delay1ms(1000); temp=1; void fquanliang(void) uint i; temp=0 x7f; for(i=0;i=1; void main() clearmen(); P0=0 xff; while(1) if(value=1) P2=0 xfe; if(valu

20、e=2) P2=0 xfd; if(value=3) P2=0 xfb; if(value=4 P2=0 xf7; if(value=5) P2=0 xef; if(value=6) P2=0 xdf; if(value=7) P2=0 xbf; if(value=8) P2=0 x7f; if(value=9) P1=0 xfe; if(value=10) P1=0 xfd; if(value=11) youyi(); if(value=12) zuoyi(); if(value=13) quanliang(); if(value=14) fquanliang(); 个人小结这次课程设计我们

21、的题目是设计单片机遥控系统设计,以51单片机为基础通过红外发射与接收装置来实现信息的传递,通过这次课程设计,我学会了红外通信装置的使用以及它们之间编码的设计。另外,通过自己设计焊接单片机让我对单片机的结构有了新的认识与理解。单片机的每一个端口都有自己所需的结构与电路,特别是P0口,需要接上拉电阻。这次课程设计我负责接收模块与部分程序设计,我用了一个hs0038一体化红外接收头,使接收电路大大的简洁化了,为了找hs0038的电路,还上网找了很多版本的资料,最终确定了一个相对简单的电路,且比较稳定。最后实验结果虽然不尽如人意,但是也学会了很多电路设计的方法。 章韬略这次课程设计,我们的设计共分为两

22、个模块,我负责的是红外发射模块。首先我在网上查询了一些关于红外发射模块硬件电路的资料,确定所需要的硬件材料。运用软件来绘制出了硬件电路图。再购买到了材料之后,开始了硬件电路的焊接工作,焊接完成后,开始编写程序。在写程序的过程中,我了解到了51单片机芯片的工作原理,学会了矩阵键盘的扫描原则。同时,也认清了红外发射的原理,这次我采用的是按脉冲个数来对应相应的功能,相对来说更为简单易懂。再完成这些工作之后,我们开始了测试和调节,虽然最终并没有完全达到预期的效果,但通过这次课程设计,我还是了学会了很多电路设计和单片机的知识。 -陈舒佳附录资料:不需要的可以自行删除测量平差程序设计角度(度分秒)到弧度A

23、ngleToRadian#define PI 3.14159265double AngleToRadian(double angle)int D,M;double S,radian,degree, angle,MS;D=int(angle+0.3);MS=angle-D;M=int(MS)*100+0.3);S=(MS*100-M)*100;degree=D+M/60.0+S/3600.0;radian=degree*PI/180.0;return radian;注意:防止数据溢出,要加个微小量,例如0.3.弧度换角度(度分秒) RadianToAngle#define PI 3.141592

24、65double RadianToAngle(double radian)int D,M;double S,radian,degree,MS,angle;degree=radian*180/PI;D=int(degree);MS=degree-D;M=int(MS*60);S=(MS*60-M)*60;angle=D+M/100.0+S/10000.0;return angle;已知两点求坐标方位角Azimuth#include double Azimuth(double xi,double yi,double xj,double yj)double Dx,Dy,S,T;Dx=xj-xi;Dy

25、=yj-yi;S=sqrt(Dx*Dx+Dy*Dy);if(S1e-10) return 0;T=asin(Dy/S);if(Dx0&(Dy0)|T0) T=2*PI+T;return T;4.开辟二维数组的动态空间的宏#include #define NewArray2D(type,A,i,n,m)A=(type*)malloc(n*sizeof(type*); for(i=0;im;i+) Ai=(type*)malloc(m*sizeof(type); 5.释放开辟的二维数组的空间#define FreeSpace(A,i,m)for(i=0;im;i+) free(Ai); free(

26、A); 注意:释放空间与开辟空间相反,释放空间是先释放列,后释放行.6.矩阵求转置transformmatrixvoid transformmatrix(double *A,double *B,int i,int j)int m,n;for(m=0;m=i;m+)for(n=0;n=j;n+)Bnm=Amn:7.矩阵相乘(mulmatrix)void mulmatrix(double *A,double *B,double *C,int i,int j,int k)int m,n,p;for(m=0;mi;m+)for(n=0;nj;n+)Cmn=0;for(p=0;pk;p+)Cmn+=Am

27、p*Bpn:8.矩阵求逆(countermatrix)#include void countermatrix(double *T, double *s, double *r, double *Q,double *N, double *rt,int n)for(i=0;in;i+)s=Nii;for(k=0;ki;k+)s-=Tki*Tki;Tii=sqrt(s)for(j=i+1;jn;j+)s=Nij;for(k=0;ki;k+)s-=Tki*Tkj;Tij=s/Tii;for(i=0;in;i+)for(j=0;j=0;i+)rii=1/Tii;for(j=i+1;jn;j+)s=0;fo

28、r(k=i;kj-1;k+)s-=rik*Tkj;rij=s/Tii;for(i=0;in;i+)for(j=0;jn;j+)rij=0;transformmatrix(r,rt,n,n)mulmatrix(r,rt,Q,n,n)9.平差主程序之读入数据typedef struct POINTchar name8;double x,y;int type;POINT;typedef struct READVALUEPOINT *begin;POINT *end;double value;READVALUE;POINT *GETPOINT(char *name,POINT *pPoint,int

29、nPoint)int i;for(i=0;inPoint;i+)if (strcmp(pP,name)=0)return (pPoint+i) for(i=0;i0)pPoint=(POINT*)malloc(nDirect*sizeof(POINT);if(nDirect0)pDirect=(READVALUE*)malloc(nDirect*sizeof(READVALUE);if(nDistance0)pDistance=(READVALUE*)malloc(nDistance*sizeof(RAADVALUE);fscanf(fp,”%lf,%lf,%lfn”,&m

30、o,&mf,&ms);for(i=0;inKnownPoint;i+)fscanf(fp,”%s,%lf,%lfn”,pP,&pPointi.x,&pPointi.y);type=1;for( ;inPoint;i+)pP=NULL; pPointi.x=0;pPointi.y=0;pPointi.type=0; for(i=0;inDirect;i+)fscanf(fp,”%s,%s,%lfn”,begin,end,&pDirecti.value);pDirecti.begin=GetPoint(begin,pPoint,nPoint);pDirect

31、i.end=GetPoint(end,pPoint,nPoint);for(i=0;inDistance;i+)fscanf(fp,”%s,%s,%lfn”,begin,end,&pDistancei.value);pDistancei.begin=GetPoint(begin,pPoint,nPoint);pDistancei.end=GetPoint(end,pPoint,nPoint);fclose(fp);10.角度检验(checkangle)#include int checkangle(double angle)int M,S;double MS;if(angle=0&angle3

32、60)MS=angle-(int)(angle);if(M6)S=(int)(MS*1000);if(S%106)return 1;return 0;11.前方交会#define PI=3014159265/*此处调用程序角度换弧度AngleToRadian*/Qianfang(double XE, double YE, double XF, double YF, doubleDEG, double DEF, double DFG, double DFE, double *DFE, double *DFG)double C,A,B;C=DGE-DGF;A=DEF-DEG;B=DFG-DFE;i

33、f(C-2*PI)|(C0&C-PI&CPI&C2*PI)XG=(XE/tan(B)+XF/tan(A)+YE-YF)/(1/tan(A)+ 1/tan(B);YG=(YE/tan(B)+YF/tan(A)-XE+XF)/ (1/tan(A)+ 1/tan(B);12.坐标概算全方向法子函数取出观测方向GetAllDirectint GetAllDirect(char *name,int nDirect,READVALUE *pDirect, READVALUE *pStation)int i,nCount=0;for(i=0;iname,name)=0)pStationnCount.begi

34、n=p(pDirectnCount.begin;pStationnCount.end=p(pDirectnCount.end;pStationnCount.value=p(pDirectnCount.value; nCount+;return nCount;坐标概算全方向法子程序实现流程(coordinate)coordinate (入口参数设置)READVALUE pStation50,pObject50;int nCount,i,j,k,m,n,p,nobject;for(i=0;i1)|( nCount=1)for(j=0;jtype=1)for(k=0;ktype=0) nobject

35、=GetAllDirect(pStationj.end-name,nDirect,pDirect,pobject)m=-1;n=-1;for(p=0;pname,pP)=0)m=p; if(strcmp(pobjectp.end-name,pStationk.end-name)=0)n=p;if(m=0&n=0)pPointi=pStationk.end-pStationj.end;pStationj.end=pObjectm.value-pObjectn.value; Xe=pPointi.x; Ye=pPointi.y; Xf=pStationj.end-x; Yf=p

36、Stationj.end-y; Lef=pStationj.value; Leg=pStationk.value; Lfe=pObjectm.value; Lfg=pObjectn.value; Qianfang(Xe,Xf,Ye,Yf,Lef,Leg,Lfe,Lfg,*Xg,*Yg;) pStationk.end-x=*xg; pStationk.end-y=*yg; pStationk.end.type=2; 13.坐标增量法(calcoordinate)子函数由端点名称得边长值的函数GetDistancedouble GetDistance(char *begin,char *end,i

37、nt nDistance,READVALUE *pDistance)int i;for(i=0;iname,begin)=0&strcmp(pDistancei.end-name,end=0)|(strcmp(pDistancei.begin-name,end)=0&strcmp(pDistancei.end,begin)=0)return pDistancei.value;return -1;/*函数取出观测方向GetAllDirect*/void calcoordinate(int nDirect,READVALUE *pDirect,int nDistace,READVALUE *pDi

38、stance,int nPoint,POINT *pPoint) int nPoint,nCount,nDirect,nDistance; int m=-1,i,j,k; double x1,y1,x2,y2,A0,A,S,dx,dy; READVALUE*pDirect=NULL; READVALUE pStation50; for(i=0;i0) nCount=GetAllDirect(pP,nDirect,pDirect,pStation50); for(j=0;jtype0)m=j; if(m!=-1) for(k=0;ktype=0) x1=pPointi.x;

39、y1=pPointi.y; x2=pStationj.end-x; y2=pStationj.end-y; A0=Bearing(x1,y1,x2,y2); A=A0-(DMSToRAD(pStationm.value)-DMSToRAD(pStationk.value); if(A2*PI)A=A-2*PI; S=GetDistance(pPointi,pStationk.end,nDistance,pDistance); if(Sx=pPointi.x+dx; pStationk.end-y=pPointi.y+dy; pStationk.end-type=2; 14.高斯正反算高斯正算:#include #include #define PI 3.14159265double DMSToRAD(double dDMS)int L1,L2;double T,L3;L1=(int)(dDMS+0.3);L2=(int)(dDMS-L1)*100+0.3);L3=(dDMS-L1)*100-L2)*100;T=(L1+L2/60.0+L3/3600.0)*PI/180.0;return T;void PreGausePositive(double B,double L,double L0, double a, double b, double *N, doubl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论