[51单片机] 用51单片机做遥控器出现的问题

[复制链接]
1863|5
 楼主| wuxiaohuaer 发表于 2015-6-21 13:15 | 显示全部楼层 |阅读模式
因为我的51实验板上自带38K调制模块(下图有此模块的原理图),我认为将控制脚拉高就可以自动发射38K载波,将控制脚拉底就会持续发射底电平。以下代码是我根据网上流行的一个电视遥控器改的。请帮忙看下哪里出了问题?
SW1和SW2对应的两个码值分别为00FF06F9和00FF0DF2,是我手上一个红外遥控器的开机、关机码值,但是一直没能成功。是不是这个38K调制模块使用方式不正确,还是代码哪里有问题?


  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit InfraredSend = P1^4;        //红外发射引脚
  4. sbit SW1 = P3^0;        //独立按键定义
  5. sbit SW2 = P3^1;

  6. unsigned char KeyCode[23][4] ={{0x00,0xff,0x06,~0x06},{0x00,0xff,0x0d,~0x0d},{0x00,0xff,0x18,~0x18},{0x00,0xff,0x1a,~0x1a},{0x00,0xff,0x1b,~0x1b},        //Mute Code, Power Code, 1 Code, 2 Code, 3 Code
  7.                                                              {0x00,0xff,0x14,~0x14},{0x00,0xff,0x16,~0x16},{0x00,0xff,0x17,~0x17},{0x00,0xff,0x10,~0x10},{0x00,0xff,0x12,~0x12},        //4 Code, 5 Code, 6 Code, 7 Code, 8 Code
  8.                                                        {0x00,0xff,0x13,~0x13},{0x00,0xff,0x08,~0x08},{0x00,0xff,0x0c,~0x0c},{0x00,0xff,0x0f,~0x0f},{0x00,0xff,0x0a,~0x0a},        //9 Code, -/-- Code, 0 Code, Cycle Code, Video Code
  9.                                                        {0x00,0xff,0xf1,~0xf1},{0x00,0xff,0x02,~0x02},{0x00,0xff,0x04,~0x04},{0x00,0xff,0x00,~0x00},{0x00,0xff,0x07,~0x07},        //Hode Code, Channel+ Code, Volume- Code, Menu Code, Volume+ Code
  10.                                                        {0x00,0xff,0x06,~0x06},{0x00,0xff,0xfc,~0xfc},{0x00,0xff,0x0b,~0x0b}};                                                                                                //Channel- Code, Enter Code, Display Code


  11. void Delay100US(unsigned char x);        //参数为1时延时100us
  12. void Delay10US(unsigned char x);        //参数为1时延时10us

  13. void main(void)
  14. {
  15.         unsigned char i,Bit,Byte,KeyCodeSend;
  16.         while(1)
  17.         {
  18.                 SW1 = 1;
  19.                 SW2 = 1;
  20.                 if(SW1 == 0)        //1键按下,发射一组数据,四个字节
  21.                 {
  22.                         InfraredSend = 1;//发射引导码9ms
  23.                         Delay100US(90);
  24.                         InfraredSend = 0;
  25.                         Delay100US(45);                //4.5ms.引导码
  26.                         for(Byte = 0;Byte < 4;Byte++)        //开始发射四个字节内容
  27.                         {
  28.                                 KeyCodeSend = KeyCode[0][Byte];
  29.                                 for(Bit = 0;Bit < 8;Bit++)
  30.                                 {
  31.                                         InfraredSend = 1;//发射0.56ms
  32.                                         Delay10US(56);
  33.                                         // CarrierWave38K(21);                //发射0.56ms
  34.                                         if(KeyCodeSend & 0x01)        //由数据来判断高1.69ms还是0.56ms
  35.                                                 Delay10US(169);
  36.                                         else
  37.                                                 Delay10US(56);
  38.                                         KeyCodeSend >>= 1;
  39.                                 }        
  40.                         }
  41.                         InfraredSend = 1;//发射0.56ms
  42.                         Delay10US(56);
  43.                         for(i = 0;i < 10;i++)
  44.                                 Delay100US(180);        //结束正常控制在189ms
  45.                 }

  46.                 if(SW2 == 0)        //2键按下,发射一组数据,四个字节
  47.                 {
  48.                         InfraredSend = 1;//发射引导码9ms
  49.                         Delay100US(90);
  50.                         InfraredSend = 0;
  51.                         Delay100US(45);                //4.5ms.引导码
  52.                         for(Byte = 0;Byte < 4;Byte++)        //开始发射四个字节内容
  53.                         {
  54.                                 KeyCodeSend = KeyCode[1][Byte];
  55.                                 for(Bit = 0;Bit < 8;Bit++)
  56.                                 {
  57.                                         InfraredSend = 1;//发射0.56ms
  58.                                         Delay10US(56);
  59.                                         // CarrierWave38K(21);                //发射0.56ms
  60.                                         if(KeyCodeSend & 0x01)        //由数据来判断高1.69ms还是0.56ms
  61.                                                 Delay10US(169);
  62.                                         else
  63.                                                 Delay10US(56);
  64.                                         KeyCodeSend >>= 1;
  65.                                 }        
  66.                         }
  67.                         InfraredSend = 1;//发射0.56ms
  68.                         Delay10US(56);
  69.                         for(i = 0;i < 10;i++)
  70.                                 Delay100US(180);        //结束正常控制在189ms
  71.                 }
  72.                
  73. /* 参考为1时延时100us */
  74. void Delay100US(unsigned char X100us)
  75. {
  76.         unsigned char i;
  77.         while(X100us--)
  78.         {
  79.                 _nop_();
  80.                 _nop_();
  81.                 _nop_();
  82.                 _nop_();
  83.                 i = 12;
  84.                 while(i--);        
  85.         }
  86. }

  87. /* 参数为1时延时10us */
  88. void Delay10US(unsigned char X10us)
  89. {
  90.         while(X10us--)
  91.         {
  92.                 _nop_();
  93.                 _nop_();               
  94.         }
  95. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| wuxiaohuaer 发表于 2015-6-21 22:28 | 显示全部楼层
帖子沉的好快,自己顶一下
nbsmaps 发表于 2015-6-22 07:42 | 显示全部楼层
示波器一看就知道了哪里问题,为什么要从原理去分析呢?费时费力
gx_huang 发表于 2015-6-22 10:27 | 显示全部楼层
看程序就很累,虽然比较规整了。
发射输出程序,2个按键,2段代码,应该封装成一个函数呀,否则,100个按键,就100段代码了。
你这个发射程序,是低位先发射,检查一下是否方向错了。
我的习惯是,字节排列、比特排列,和纸上的一样。
另外,感觉你的发射脚控制可能有问题,发射程序结束后,应该不会发射。
你要确认一下1是发射还是0是发射。你的程序似乎是1是发射载波,又为何程序结束了,还一直发射?
 楼主| wuxiaohuaer 发表于 2015-6-22 22:12 | 显示全部楼层
nbsmaps 发表于 2015-6-22 07:42
示波器一看就知道了哪里问题,为什么要从原理去分析呢?费时费力

家里学习的,没有示波器,要不然马上就可以先看一下发射出的波形了
 楼主| wuxiaohuaer 发表于 2015-6-23 21:27 | 显示全部楼层
gx_huang 发表于 2015-6-22 10:27
看程序就很累,虽然比较规整了。
发射输出程序,2个按键,2段代码,应该封装成一个函数呀,否则,100个按键 ...

多谢提点,下面这句话提醒我了--“你要确认一下1是发射还是0是发射。你的程序似乎是1是发射载波,又为何程序结束了,还一直发射?”。
后来我看了下,确实是发射数据的0码前,没有把载波关掉。晚点放上调整后代码。
封装发射输出函数也是非常好的建议,后面码值多了可以考虑,多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部