数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2794|回复: 1

[C51] N76E003红外编码演示程序(一次发送一组数据)

[复制链接]
发表于 2021-3-9 19:10:38 | 显示全部楼层 |阅读模式
本帖最后由 xyg123321 于 2021-3-9 19:14 编辑

一次发送一组数据,采用普通红外发送发光二极管940nm红外发光管
N76e003PIN口P05接上拉电阻10K
  1. /*--------------------------------------------------
  2. NEC协议需要工作在38kHZ载波上,在N76E003中我们使用定时器0来产生
  3. 通过脉冲串之间的时间间隔来实现信号的调制(PPM)
  4. 位的周期为1.12ms(低电平0)或者2.25ms(高电平1)
  5. ---------------------------------------------------*/
  6. #include "n76e003.h"
  7. #include "Function_Define.h"

  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. sbit LED      = P0^2;
  11. sbit IR       = P0^5;    //定时器0引脚
  12. sbit CLK      = P1^1;    //时钟
  13. sbit CS       = P1^2;    //片选
  14. sbit DIN      = P1^0;    //数据
  15. sbit K1       = P0^1;    //长按短按
  16. sbit K2       = P0^0;    //按键2
  17. sbit K3       = P1^3;    //按键3
  18. sbit K4       = P1^4;    //按键4
  19. static bit OP;        //红外发射管的亮灭控制
  20. static uint count;    //延时计数器
  21. static uint endcount; //终止延时计数器
  22. static uchar flag;    //红外发送标志
  23. char   iraddr1;       //16位地址 第一字节
  24. char   iraddr2;       //16位地址 第二字节
  25. uchar code Table[]={0x5f,0x06,0x6b,0x2f,0x36,0x3d,0x7d,0x07,0x7f,0x3f,0xDf,0x86,0xeb,0xaf,0xb6,0xbd,0xfd,0x87,0xff,0xbf};//显示数字0-9、0-9带星期
  26. uchar  CNT=0;
  27. uchar  IR_data;
  28. uchar  IR_DATT[]={145,59,64,215,130,35,40,145,59,64,215,130,35,151,220,215};
  29. void Delayms(int ms)
  30. {
  31.   uchar y;
  32.   while(ms--)
  33.   {
  34.     for(y=0;y<250;y++)
  35.     {
  36.       _nop_();
  37.       _nop_();
  38.       _nop_();
  39.       _nop_();
  40.     }
  41.   }
  42. }
  43. void Delay_xms(uint x)                     
  44. {
  45.         uint i,j;
  46.         for(i=x;i>0;i--)
  47.                 for(j=110;j>0;j--);
  48. }
  49. void Write_1722_byte(uchar DATA) //写字节
  50. {
  51.                 uchar i;
  52.                 CS=0;               
  53.                 for(i=8;i>=1;i--)
  54.      {                  
  55.        CLK  = 0;                                                     //时钟拉低,写数据
  56.        DIN  = DATA & 0x01;             //DATA & 10000000,读取最高位写入max7219,最先发送高位(从左往右D7-D0)      
  57.        CLK  = 1;                                                     //时钟拉高,送数据
  58.                          DATA = DATA >> 1;                     //左移1位,重新&运算,读取最高位写入max7219,从右往左写
  59.      }                                 
  60. }
  61. void Write_1722_com(uchar com)   //写指令
  62. {
  63.         CS=0;
  64.         Write_1722_byte(com);
  65.   CS=1;       
  66. }       
  67. void TM1722_Write_Word(uchar addr,uchar dat)  //写数据
  68. {   
  69.   Write_1722_byte(addr);
  70.         Write_1722_byte(dat);
  71.   Delay_xms(10);           
  72.   CS=1;   
  73. }
  74. void Init_qingping()             //清屏程序
  75. {
  76.         P10_PushPull_Mode;
  77.         P11_PushPull_Mode;
  78.         P12_PushPull_Mode;
  79.         P05_PushPull_Mode;
  80.         P02_PushPull_Mode;
  81.         P00_PushPull_Mode;
  82.         P01_PushPull_Mode;
  83.         P13_PushPull_Mode;
  84.         P14_PushPull_Mode;
  85.         Write_1722_com(0x00);
  86.         Write_1722_com(0x40);
  87.         Write_1722_com(0xc0);
  88.         Write_1722_com(0x97);          //亮度
  89.         TM1722_Write_Word(0xc2,0x00);       
  90.         TM1722_Write_Word(0xc3,0x00);
  91.         TM1722_Write_Word(0xc6,0x00);
  92.         TM1722_Write_Word(0xc7,0x00);
  93.         TM1722_Write_Word(0xca,0x00);
  94.         TM1722_Write_Word(0xcb,0x00);
  95.         TM1722_Write_Word(0xce,0x00);
  96.         TM1722_Write_Word(0xcf,0x00);
  97. }
  98. void IR_init()
  99. {
  100.         count=0;
  101.         flag=0;
  102.         OP=0;
  103.         IR=0;
  104.         EA=1;               //总中断开
  105.         TMOD=0x11;          //设置定时器0和1为16位模式
  106.         ET0=1;              //定时器0中断允许
  107.         //设定定时大小 38K 等加于 26us中断一次            
  108.         TH0=0xff;
  109.         TL0=0xf1;
  110.         TR0=1;              //开始计数
  111.         //写16位地址
  112.         iraddr1=3;
  113.         iraddr2=252;
  114. }
  115. /********发送数据函数计时器endcount基于16MHZ的值*******/
  116. void SendIRdata(char p_irdata)
  117. {
  118.         int i;
  119.         char irdata=p_irdata;
  120.        
  121.         //发送9ms的起始码
  122.         endcount=665;
  123.         flag=1;
  124.         count=0;
  125.         while(count<endcount);

  126.         //发送4.5ms的结果码
  127.         endcount=351;
  128.         flag=0;
  129.         count=0;
  130.         do{}while(count<endcount);

  131.         //发送16位地址的前八位
  132.         irdata=iraddr1;
  133.         for(i=0;i<8;i++)
  134.         {
  135.                 //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)45
  136.                 endcount=45;
  137.                 flag=1;
  138.                 count=0;
  139.                 do{}while(count<endcount);

  140.                 //停止发送红外信号(即编码中的高电平)
  141.                 if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
  142.                 {
  143.                         endcount=132;//1
  144.                 }
  145.                 else
  146.                 {
  147.                         endcount=45;//0
  148.                 }
  149.                 flag=0;
  150.                 count=0;
  151.                 do{}while(count<endcount);
  152.                 irdata=irdata>>1;
  153.         }

  154.         //发送16位地址的后八位
  155.         irdata=iraddr2;
  156.         for(i=0;i<8;i++)
  157.         {
  158.                 //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)
  159.                 endcount=45;
  160.                 flag=1;
  161.                 count=0;
  162.                 do{}while(count<endcount);

  163.                 //停止发送红外信号(即编码中的高电平)
  164.                 if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
  165.                 {
  166.                         endcount=132;//1
  167.                 }
  168.                 else
  169.                 {
  170.                         endcount=45;//0
  171.                 }
  172.                 flag=0;
  173.                 count=0;
  174.                 do{}while(count<endcount);
  175.                 irdata=irdata>>1;
  176.         }


  177.         //发送8位数据
  178.         irdata=p_irdata;
  179.         for(i=0;i<8;i++)
  180.         {
  181.                 //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)
  182.                 endcount=45;
  183.                 flag=1;
  184.                 count=0;
  185.                 do{}while(count<endcount);

  186.                 //停止发送红外信号(即编码中的高电平)
  187.                 if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
  188.                 {
  189.                         endcount=132;//1
  190.                 }
  191.                 else
  192.                 {
  193.                         endcount=45;//0
  194.                 }
  195.                 flag=0;
  196.                 count=0;
  197.                 do{}while(count<endcount);
  198.                 irdata=irdata>>1;
  199.         }
  200.         //发送8位数据反码
  201.         irdata=~p_irdata;
  202.         for(i=0;i<8;i++)
  203.         {
  204.                 //先发送0.56ms的38K红外波(即编码中的0.56ms的低电平)
  205.                 endcount=45;
  206.                 flag=1;
  207.                 count=0;
  208.                 do{}while(count<endcount);
  209.                 //停止发送红外信号(即编码中的高电平)
  210.                 if(irdata-(irdata/2)*2)//判断二进制的个位是1还是0
  211.                 {
  212.                         endcount=132;//1
  213.                 }
  214.                 else
  215.                 {
  216.                         endcount=45;//0
  217.                 }
  218.                 flag=0;
  219.                 count=0;
  220.                 do{}while(count<endcount);
  221.                 irdata=irdata>>1;
  222.         }
  223.         //结束信息
  224.         endcount=45;
  225.         flag=1;
  226.         count=0;
  227.         do{}while(count<endcount);
  228.         flag=0;
  229. }
  230. void KEY()
  231. {
  232.         uchar DDIR;
  233.         if(!K1)
  234.         {
  235.                 for(DDIR=0;DDIR<16;DDIR++)
  236.                 {
  237.                         SendIRdata(IR_DATT[DDIR]);
  238.                         Delayms(20);
  239.                 }
  240.         }
  241.         if(!K2)
  242.         {
  243.                 IR_data=74;
  244.                 SendIRdata(IR_data);
  245.                 Delayms(10);
  246.                 LED=1;
  247.         }
  248.         if(!K3)
  249.         {
  250.                 IR_data=52;
  251.                 SendIRdata(IR_data);
  252.                 Delayms(10);
  253.                 LED=1;
  254.         }
  255.         if(!K4)
  256.         {
  257.                 IR_data=63;
  258.                 SendIRdata(IR_data);
  259.                 Delayms(10);
  260.                 LED=1;
  261.         }
  262.         TM1722_Write_Word(0xc3,Table[1]);                     //显示模式
  263.         TM1722_Write_Word(0xcf,Table[IR_DATT[DDIR]/1000]);          //2数码管
  264.         TM1722_Write_Word(0xce,Table[IR_DATT[DDIR]%1000/100]);      //3数码管
  265.         TM1722_Write_Word(0xcb,Table[IR_DATT[DDIR]%1000%100/10]);   //4数码管
  266.         TM1722_Write_Word(0xc7,Table[IR_DATT[DDIR]%1000%100%10]);   //5数码管
  267. }
  268. void main (void)
  269. {
  270.         Init_qingping();
  271.         IR_init();
  272.         while(1)
  273.         {
  274.                 KEY();
  275.         }
  276. }
  277. void timeint(void) interrupt 1
  278. {
  279.         TH0=0xff;         //设定定时器初值 255
  280.         TL0=0xf1;         //               241
  281.         count++;          //中断计数累加
  282.         if(flag==1)
  283.         {
  284.                 OP=~OP;
  285.         }
  286.         else
  287.         {
  288.                 OP=0;
  289.         }
  290.         IR=OP;            //IRP05为定时器0引脚
  291. }
复制代码

本帖子中包含更多资源

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

x

打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

 楼主| 发表于 2021-3-9 19:15:38 | 显示全部楼层
3mm/5mm直径的发射头都可以用,黑色的也可以:cool:
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 00:59 , Processed in 0.234000 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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