找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助红外遥控编码

[复制链接]
跳转到指定楼层
楼主
小弟要用51单片机做一个简易的红外遥控器,现在结果出不来,请各位帮帮忙。接收的单片机根本没有反应。有一部份代码是网上找来的。
  1. #include "stc15.h"
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit IR_OUT=P3^5;

  6. uchar j3,j4;

  7. void delay_ms(uint ms)
  8. {
  9. uint i,j;
  10. for(i=0;i<120;i++)
  11. {
  12.    for(j=0;j<ms;j++);
  13. }
  14. }

  15. //T1 13us产生一次中断 用于产生38K载波
  16. //T0 方式1 16位  用于定时
  17. void Init_Timer(void)
  18. {
  19.         TMOD=0x21;  //T0 mode 1      T1 mode 2  
  20.         TH1=256-(1000*11.0592/38.0/12)/2+0.5;      
  21.         //特殊
  22.         TL1=TH1;
  23.         ET1=1;
  24.         EA=1;
  25. }

  26. //发送引导码  发送方:4.5ms高电平 4.5ms低电平
  27. void Send_Start_Bit(void)    //TR1的值=发送的电平
  28. {
  29.         //4.5ms 1
  30.         TH0=(65536-8295)/256;  
  31.         TL0=(65536-8295)%256;
  32.         TR0=1;
  33.         TR1=1;
  34.         while(!TF0);
  35.         TR1=0;
  36.         TF0=0;
  37.         TR0=0;
  38.         IR_OUT=1;
  39.         //4.5ms 0
  40.         TH0=(65536-4146)/256;  
  41.         TL0=(65536-4146)%256;
  42.         TR0=1;
  43.         TR1=0;
  44.         while(!TF0);
  45.         TR1=0;
  46.         TF0=0;
  47.         TR0=0;
  48.         IR_OUT=1;
  49. }

  50. //发送0  
  51. void Send_Bit_0(void)
  52. {
  53.         //0.565ms 1
  54.         TH0=(65536-521)/256;  
  55.         TL0=(65536-521)%256;
  56.         TR0=1;
  57.         TR1=1;
  58.         while(!TF0);
  59.         TR1=0;
  60.         TF0=0;
  61.         TR0=0;
  62.         IR_OUT=1;
  63.         //0.565ms 0
  64.         TH0=(65536-521)/256;  
  65.         TL0=(65536-521)%256;
  66.         TR0=1;
  67.         TR1=0;
  68.         while(!TF0);
  69.         TR1=0;
  70.         TF0=0;
  71.         TR0=0;
  72.         IR_OUT=1;
  73. }

  74. //发送1
  75. void Send_Bit_1(void)
  76. {
  77.         //0.565ms 1
  78.         TH0=(65536-521)/256;  
  79.         TL0=(65536-521)%256;
  80.         TR0=1;
  81.         TR1=1;
  82.         while(!TF0);
  83.         TR1=0;
  84.         TF0=0;
  85.         TR0=0;
  86.         IR_OUT=1;
  87.         //1.685ms 0
  88.         TH0=(65536-1563)/256;  
  89.         TL0=(65536-1563)%256;
  90.         TR0=1;
  91.         TR1=0;
  92.         while(!TF0);
  93.         TR1=0;
  94.         TF0=0;
  95.         TR0=0;
  96.         IR_OUT=1;  
  97. }

  98. void Send_over(void)     //发送一个结束码,因为最后一个位只有遇到下降沿才能读取(发射端的上升沿)
  99. {
  100.         //0.500ms 1       //小于0.5ms 接收端很难识别到
  101.         TH0=(65536-500)/256;  
  102.         TL0=(65536-500)%256;
  103.         TR0=1;
  104.         TR1=1;
  105.         while(!TF0);
  106.         TR1=0;
  107.         TF0=0;
  108.         TR0=0;
  109.         IR_OUT=1;
  110.         //0.500ms 0
  111.         TH0=(65536-500)/256;  
  112.         TL0=(65536-500)%256;
  113.         TR0=1;
  114.         TR1=0;
  115.         while(!TF0);
  116.         TR1=0;
  117.         TF0=0;
  118.         TR0=0;
  119.         IR_OUT=1;  
  120. }

  121. //发送一字节 8位
  122. void Send_Char()
  123. {
  124.         uchar i,j1,j2;//j3,j4;
  125.         j1=0x00;
  126.         j2=0xFF;
  127.         //j3=0xDE;
  128.         //j4=0x20;
  129.         Send_Start_Bit();
  130.         Send_Bit_0();
  131.          //发射引导码
  132.         for(i=0;i<8;i++)
  133.         {
  134.          if(j1&0x80)
  135.                 Send_Bit_0();
  136.          else
  137.                 Send_Bit_1();
  138.          j1=j1<<1;        
  139.          //先发射低位
  140.         }
  141.         for(i=0;i<8;i++)
  142.         {
  143.          if(j2&0x80)
  144.                 Send_Bit_0();
  145.          else
  146.                 Send_Bit_1();
  147.          j2=j2<<1;        
  148.          //先发射低位
  149. }
  150.         for(i=0;i<8;i++)
  151.         {
  152.          if(j3&0x80)
  153.                 Send_Bit_0();
  154.          else
  155.                 Send_Bit_1();
  156.          j3=j3<<1;        
  157.          //先发射低位
  158.         }

  159.         for(i=0;i<8;i++)
  160.         {
  161.          if(j4&0x80)
  162.                 Send_Bit_0();
  163.          else
  164.                 Send_Bit_1();
  165.          j4=j4<<1;        
  166.          //先发射低位
  167.         }
  168.         Send_over();        
  169. //结束符
  170. }

  171. Read_Key(void)
  172. {
  173.         uchar key=0; //初值按键值为一常数
  174. //        P3 &= 0xE0;  //初始化按键,避免上电亮灯
  175.         key = (P3&0x0F);
  176.         delay_ms(20);
  177.         if((P3&0x0F)==key)
  178.                 return key;
  179.         //else return 0; //为防止编译器报警,返回一无效数值
  180. }

  181. void Cmd_Travel(uchar codes)  //发送命令
  182. {
  183.         switch(codes)
  184.         {
  185.                 case 0x01 : j3 = 0x00; j4 = 0xFF; break;
  186.                 case 0x02 : j3 = 0x0F; j4 = 0xF0; break;
  187.                 case 0x04 : j3 = 0xF0; j4 = 0x0F; break;
  188.                 case 0x08 : j3 = 0xFF; j4 = 0x00; break;
  189.     default   : break;
  190.         }
  191. }

  192. void T1_ISR(void) interrupt 3
  193. {
  194.         IR_OUT=!IR_OUT;
  195. }

  196. void main(void)
  197. {
  198.         P3 = 0;
  199.         Init_Timer();
  200.         while(1)
  201.         {
  202.                 Cmd_Travel(Read_Key());
  203.                 Send_Char();
  204.                 delay_ms(1000);
  205.         }
  206. }
复制代码


8.jpg (80.65 KB, 下载次数: 135)

硬件电路

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

使用道具 举报

沙发
ID:51906 发表于 2014-12-26 11:59 | 只看该作者
24小时必答区为何没有人回家咧??
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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