找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1942|回复: 7
打印 上一主题 下一主题
收起左侧

再次被单片机红外线发射程序整哭了!

[复制链接]
跳转到指定楼层
楼主
这是我写的红外发射程序,不成功,不知道错在哪里了?
我测的晶振是11.030,所以有些定时器数据是按11.030计算的.
反复测试按11.5092和11.030设置定时器数据都不成功,二个差值也不大.

不知道错在哪里,希望大神指导一下!!!!!

单片机源程序如下:
  1. #include<reg52.h>

  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.         
  5. sbit fs=P1^5;
  6. uchar i;
  7. uchar sj[]={        1,0,0,0,0,0,0,0,   0,1,1,1,1,1,1,1,         0,0,0,0,0,0,0,0,        1,1,1,1,1,1,1,1,        
  8.                
  9. };  //需要发送的数据

  10. void delayns(uchar i)
  11. {
  12. while(i--);
  13. }
  14. void Delay()                //@11.0592MHz
  15. {
  16.         unsigned char i, j, k;

  17.         i = 16;
  18.         j = 19;
  19.         k = 10;
  20.         do
  21.         {
  22.                 do
  23.                 {
  24.                         while (--k);
  25.                 } while (--j);
  26.         } while (--i);
  27. }


  28. void init()
  29. {
  30.         TMOD=0X11;
  31.         EA=1;
  32.         ET0=1;
  33. }

  34. void t0() interrupt 1
  35. {

  36. fs=~fs;
  37.         TR0=0;
  38.         TF0=0;
  39. }

  40. void n1()
  41. {


  42. <strong> </strong>       TH0=0xdf;
  43.         TL0=0x99;        //定时9MS
  44.         fs=0;         //开始发
  45.         TR0=1;          //开始定时
  46.         while(!TF0);      //中断变低
  47.         
  48.         TH0=0xEF;   
  49.         TL0=0xcc;            //定时4.5MS
  50.         TR0=1;
  51.         while(!TF0);     //中断高
  52. }

  53. void s1()
  54. {
  55.         TH0=0xfd;   //定时562US
  56.         TL0=0xfa;
  57.         TR0=1;
  58.         while(!TF0);    //中断变低
  59.         
  60.         TH0=0xf9;   //定时1654US
  61.         TL0=0xef;
  62.         TR0=1;
  63.         while(!TF0);   //中断变高
  64. }

  65. void s0()
  66. {
  67.         TL0=0xfa;    //定时562US
  68.         TH0=0xfd;
  69.         TR0=1;        //中断变低
  70.         while(!TF0);
  71.         
  72.         TL0=0xfa;   //定时562US
  73.         TH0=0xfd;
  74.         TR0=1;
  75.         while(!TF0);     //中断变高
  76.         
  77. }

  78. void main()
  79. {

  80.         init();

  81.         while(1)
  82.         {
  83.         n1();
  84.         for(i=0;i<32;i++){if(sj[i]==0)s0();else {s1();}}
  85.         delayns(58);fs=1;   //结束号562US后变低
  86.         Delay();        
  87.                 }
  88.         
  89. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:299872 发表于 2019-3-25 14:20 | 只看该作者
我觉得还有2个问题
1.波型差不多是对了的, 有可以延时问题.
2.可能是协议理解不对,发送数据格式不对.什么低位开始发,或者是数据发送时间间隔错了.
回复

使用道具 举报

板凳
ID:310519 发表于 2019-3-25 21:17 | 只看该作者
一般红外遥控是调制38KHZ的载波。

你的载波是外挂的?
回复

使用道具 举报

地板
ID:299872 发表于 2019-3-25 23:17 | 只看该作者
diy1997 发表于 2019-3-25 21:17
一般红外遥控是调制38KHZ的载波。

你的载波是外挂的?

越波是个什么东西呀???????不是太明白你的意思呀.
回复

使用道具 举报

5#
ID:246741 发表于 2019-3-26 09:27 | 只看该作者
是载波,不是越波,你直接把单片机输出的波形通过红外发射头发出是不行的。
需要把单片机输出的波形和38kHz的载波进行调制,再通过红外发射头发出。一般集成的红外接收头有解调的功能,能够把调制在38kHz上的波形解调出来,成为正常能够读取的信息。
为了实现波形和38kHz载波进行调制,最简单的办法就是:外部加一个38kHz的方波发生器(也可以用单片机的一个引脚输出),将该载波和波形通过与门相与,在通过红外发射头发射。
这个调制的原理和电话传输语音类似,需要把语音信号调制在高频的载波上,然后才能进行语音信号的传输。
回复

使用道具 举报

6#
ID:310519 发表于 2019-3-26 19:05 | 只看该作者
xjtong 发表于 2019-3-25 23:17
越波是个什么东西呀???????不是太明白你的意思呀.

载波,为了发射方便和抗干扰等目的,

把要发射的信息搭载在一些波形上发射,

比如收单机的调幅,调频。

红处遥控一般用的是频率为38KHZ的方波。

常用的三个脚的接收头对38KHz的方波信号很敏感(接收头有其它频率的),

当收到38KHZ的方波信号时,输出脚就输出低电平,

所以,以常用的NEC编码协议的引导码来说,

你要先发射9MS的38KHZ的方波,然后停止4.5MS,

接着就是数据了......






回复

使用道具 举报

7#
ID:299872 发表于 2019-3-26 19:49 | 只看该作者


完美的波型!!!!!!!!!!!!!!!!!!!!!

现再还一个问题.
红外发射头的功率非常小,半米内有效.

用万用测了,电流不到200ua,这还是接的8050的三极管,后来用PNP三极管还是一样的结果.
什么原因呀?







回复

使用道具 举报

8#
ID:466164 发表于 2019-3-26 21:34 | 只看该作者
你要先确定你接收有没有载波,即接收部件有没有专门的晶振,或震荡电路,如果有代表有载波,单片机晶振频率达不到,发送自然接收不了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表