找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外遥控器发射程序

[复制链接]
跳转到指定楼层
楼主
ID:197152 发表于 2021-11-11 19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该代码使用51单片机,晶振为11.0592m,实现红外发送的作用,也就是模拟遥控器的作用,如果想要发送的远,建议加三极管放大,其对应按键,以及IR接口在程序可见。

单片机源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define SBM   0x80                //识别码
  6. #define ms9    (65536-9000)               //约9mS
  7. #define ms4_5  (65536-4500)               //约4.5mS
  8. #define ms1_6  (65536-1630)               //约1.65mS
  9. #define ms_65  (65536-580)               //约0.65mS
  10. #define ms_56  (65536-560)               //约0.56mS
  11. #define ms40   (65536-40000)       //约40mS
  12. #define ms56   (65536-56000)       //56mS
  13. #define ms2_25 (65536-2250)        //约2.25mS
  14. sbit IR  = P0^1;                                  //定义发射引脚(接PNP三极管基极)
  15. sbit IR2  = P0^2;       
  16. sbit IR3  = P0^3;
  17. sbit KEY0 = P1^7;               
  18. sbit KEY1 = P1^0;               
  19. sbit KEY2 = P1^3;       
  20. sbit KEY3 = P1^7;       
  21. sbit KEY4 = P1^1;       
  22. sbit KEY5 = P1^2;       
  23. sbit KEY6 = P1^4;       
  24. sbit KEY7 = P1^5;
  25. uchar KEY(void);
  26. void  SanZhuan(void);
  27. void  ZZ(uchar x);

  28. void  Z0(uchar temp);
  29. void  TT0(bit BT,uint x);
  30. void DelayUs2x(unsigned char t)
  31. {   
  32. while(--t);
  33. }
  34. void DelayMs(unsigned char t)
  35. {
  36.      
  37. while(t--)
  38. {
  39.      //大致延时1mS
  40.      DelayUs2x(245);
  41.          DelayUs2x(245);
  42. }
  43. }
  44. /*┈┈┈┈┈┈┈┈┈┈┈函数功能:主函数┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  45. void main(void)
  46. {
  47.         TMOD = 0x01;         //T0 16位工作方式
  48.         IR=1;                                   //发射端口常态为高电平

  49.         while(1)
  50.         {
  51.    
  52.                  SanZhuan();
  53.    
  54.      DelayMs(500);
  55.                
  56.                
  57.         }}
  58. uchar KEY(void)
  59. {
  60.         if(KEY0==0)   return 1;
  61.         if(KEY1==0)  return 2;
  62.         if(KEY2==0)  return 3;
  63.         if(KEY3==0)  return 4;
  64.    if(KEY4==0)  return 5;
  65.         if(KEY5==0)  return 6;
  66.         if(KEY6==0)  return 7;
  67.         if(KEY7==0)  return 8;
  68.         return 0;
  69. }
  70. void SanZhuan(void)                 
  71. {
  72.         uchar v;
  73.         v = KEY();
  74.         switch(v)
  75.         {
  76.                 case 1:ZZ(0x45);v=0;break;                //" 数字1 "
  77.                 case 2:ZZ(0x16);v=0;break;                //" 数字2 "
  78.                 case 3:ZZ(0x19);v=0;break;                //" 数字3 "
  79.                 case 4:ZZ(0x0d);v=0;break;                //" 数字4 "
  80.                 case 5:ZZ(0x0c);v=0;break;                //" 数字1 "
  81.                 case 6:ZZ(0x18);v=0;break;                //" 数字2 "
  82.                 case 7:ZZ(0x5e);v=0;break;                //" 数字3 "
  83.                 case 8:ZZ(0x08);v=0;break;                //" 数字4 "
  84.                 default:ZZ(0x19);v=0;
  85.         }
  86. }
  87. /*┈┈┈┈┈┈┈┈┈┈函数功能:发送主程序┈┈┈┈┈┈┈┈┈┈┈┈*/
  88. void ZZ(uchar x)
  89. {
  90.         TT0(1,ms9);                   //高电平9mS
  91.         TT0(0,ms4_5);               //低电平4.5mS
  92.         /*┈ 发送4帧数据 ┈*/
  93.         Z0(SBM);                                                                                                                                       
  94.         Z0(~SBM);
  95.         Z0(x);
  96.         Z0(~x);
  97.         /*┈┈ 结束码 ┈┈*/
  98.         TT0(1,ms_65);
  99.         TT0(0,ms40);
  100.         /*┈┈ 重复码 ┈┈*/
  101.         //while(KEY())
  102.         {
  103.                 TT0(1,ms9);
  104.         TT0(0,ms2_25);
  105.         TT0(1,ms_56);
  106.         TT0(0,ms40);
  107.                 TT0(0,ms56);                                  
  108.     }}


  109. void Z0(uchar temp)
  110. {
  111.         uchar v;
  112.        
  113.         for (v=0;v<8;v++)                     //循环8次移位
  114.         {
  115.                    
  116.                 TT0(1,ms_65);                        //高电平0.65mS         
  117.                 if(temp&0x01) TT0(0,ms1_6); //发送最低位
  118.                 else          TT0(0,ms_56);     
  119.                 temp >>= 1;                //右移一位
  120.                 }
  121.                
  122.         }


  123. /*┈┈┈┈┈┈┈┈┈38KHz脉冲发射 + 延时程序┈┈┈┈┈┈┈┈┈┈┈┈*/
  124. void TT0(bit BT,uint x)
  125. {
  126.         TH0 = x>>8;                    //输入T0初始值
  127.         TL0 = x;
  128.         TF0=0;                                //清0
  129.         TR0=1;                                //启动定时器0
  130.         if(BT == 0) while(!TF0);        //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;
  131.         else while(1)                            //38KHz脉冲,占空比5:26
  132.         {
  133.                 IR = 0;
  134.                 if(TF0)break;
  135.                 if(TF0)break;
  136.                 IR = 1;
  137.                 if(TF0)break;
  138.                 if(TF0)break;
  139.                 if(TF0)break;
  140.                 if(TF0)break;
  141.                 if(TF0)break;
  142.                 if(TF0)break;
  143.                 if(TF0)break;
  144.                 if(TF0)break;
  145.                 if(TF0)break;
  146.                 if(TF0)break;
  147.         }
  148.         TR0=0;                                //关闭定时器0
  149.         TF0=0;                                //标志位溢出则清0
  150.         IR =1;                                //脉冲停止后,发射端口常态为高电平
  151. }
复制代码

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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