找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于NEC协议红外发射程序,STC89C52单片机开发板调试通过,附源码

[复制链接]
跳转到指定楼层
楼主
ID:965487 发表于 2021-10-15 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于NEC协议红外发射程序,STC89C52开发板调试通过,发这个贴子是呼应前期的帖子——接收程序,欢迎大家多提宝贵意见。
                  
NEC 标准下的编码表示

                发送端: 引导码高电平约9000us 左右,低电平约4500us 左右;
                接收端:引导码低电平约9000us 左右,高电平约4500us 左右;
                用户码16 位,数据码16 位,共32位;
           发送端:        数据0 是用“高电平约560us +低电平约560us”表示。
                                数据1 可用“高电平约560us+低电平约1680us”表示

             接收端反转:数据0 是用“低电平约560us +高电平约560us”表示。
                                数据1 可用“低电平约560us+高电平约1680us”表示


单片机源程序如下:
  1. /*****************************************************
  2.         主机:AT89C52  主频为11.0592Mhz   红外NEC协议编码
  3.                   编程:wzqwxx 水上人家
  4. ******************************************************/

  5. #include <REGX52.H>
  6. sbit IR_TX = P2^4;         //定义红外发射端口

  7. void T0_init()        //初始化定时器0
  8. {
  9.         TMOD = 0x01;
  10.         ET0 = 1;
  11.         EA = 1;
  12. }
  13. void T1_Init(void)                //13微秒@11.0592MHz
  14. {
  15.         TMOD &= 0x0F;                //设置定时器模式
  16.         TMOD |= 0x20;                //设置定时器模式
  17.         TL1 = 0xF4;                //设置定时初始值  38KHz
  18.         TH1 = 0xF4;                //设置定时重载值
  19.         TF1 = 0;                //清除TF1标志
  20.         TR1 = 1;                //定时器1开始计时
  21. }

  22. /****中断产生红外发射不同时长延时函数560us 1680us 4500us 9000us*****/

  23. void IR_TXD_time( unsigned char th0,tl0)
  24. {
  25.                 TH0 = th0;
  26.                 TL0 = tl0;
  27.                 TR0 = 1;  //打开定时器计时
  28.                 IR_TX = 1;
  29.                 while(TF0 == 0); //延时,等待产生中断
  30.                 TF0 = 0;
  31.                 TR0 = 0;
  32.                 TR1 = 0;
  33.                 IR_TX = 1;//结束时拉高发射端口,结束发射
  34. }

  35. /*********红外发送4字节数据函数**********/

  36. void IR_Send_4B_Date(unsigned char *p)
  37. {
  38.         unsigned char i,j;         
  39.         ET1 = 1; TR1 = 1;        //打开T1中断,产生38KHz频率波,调制产生高电平信号
  40.         IR_TXD_time(0xdf,0x9a);// 产生9000us信号
  41.         ET1 = 0;//关闭38KHz频率波,调制产生低电平信号 ,下同
  42.         IR_TXD_time(0xef,0xcd);//  产生4500us信号
  43.         for(i = 0 ; i < 4 ; i++)
  44.         {
  45.                 for(j = 0x01 ; j != 0 ; j <<= 1)//发送32位数据
  46.                 {
  47.                         ET1 = 1; TR1 = 1;
  48.                         IR_TXD_time(0xfe,0x08);//  产生560us高电平信号
  49.                         ET1 = 0;
  50.                         if(*(p+i) & j) //按位与是1则
  51.                                 IR_TXD_time(0xfa,0x4c);//  产生1680us低电平信号
  52.                          else
  53.                                 IR_TXD_time(0xfe,0x3f);//  产生560us低电平信号
  54.                 }
  55.         }
  56.         ET1 = 1;TR1 = 1;
  57.         IR_TXD_time(0xfd,0xfc);//  产生560us高电平信号,结束32位数据发送
  58.         ET1 = 0;
  59. }

  60. /*********主函数**********/

  61. void main()
  62. {
  63.         unsigned char IR_Data[] = {0x22,0xdd,0x00,0xff}        ;//待发数据
  64.         unsigned char num;
  65.         T0_init();
  66.         T1_Init();
  67.         while(1)
  68.         {
  69.                 P3 = 0x0f;
  70.                 if(P3 != 0x0f)
  71.                 {
  72.                         IR_TXD_time(0x8f,0x9a);// 延时消抖
  73.                         if(P3 !=0x0f)
  74.                         {  
  75.                                 num = P3&0x0f;
  76.                         }

  77.                 if(num == 0x0e)           //我家机顶盒的遥控数据,简单测试四个键值
  78.                 {IR_Data[2] =0xdc   ; IR_Data[3] = ~IR_Data[2];} //        电源
  79.                 else if(num == 0x0d)
  80.                         {IR_Data[2] = 0x99  ; IR_Data[3] = ~IR_Data[2];}//左移
  81.                 else if(num == 0x0b)
  82.                         {IR_Data[2] = 0xc1  ; IR_Data[3] = ~IR_Data[2];} //右移
  83.                 else if(num == 0x07)
  84.                         {IR_Data[2] = 0xd2  ; IR_Data[3] = ~IR_Data[2];}  //下翻
  85.                 IR_Send_4B_Date(IR_Data); //发送
  86.                 IR_TXD_time(0xff,0x01);// 延时间隔连发
  87.                 }               
  88.         }
  89. }
  90. void Timer1() interrupt 3
  91. {
  92.         IR_TX = ~IR_TX;  //13微秒@11.0592MHz ,产生38KHz载波
  93. }
  94. void Timer0() interrupt 1
  95. {
  96. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

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

使用道具 举报

沙发
ID:654797 发表于 2021-11-26 07:33 | 只看该作者
我有这红外模块,正可以下来玩玩,
回复

使用道具 举报

板凳
ID:654797 发表于 2021-11-26 07:34 | 只看该作者
我这有个带红外收发的模块,刚好可以下来玩玩
回复

使用道具 举报

地板
ID:928284 发表于 2022-2-17 17:22 | 只看该作者
刚刚学过了红外解码,正好学习发射。感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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