找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2290|回复: 10
收起左侧

51单片机的红外遥控接收程序 为什么接收端没有显示?

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:931877 发表于 2022-11-20 14:16 | 显示全部楼层 |阅读模式
接收程序
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data    IRcode[4];   //定义一个4字节的数组用来存储代码
uchar     CodeTemp;     //编码字节缓存变量
uchar     i,j,k;    //延时用的循环变量
uchar     dat=0;
uchar     num;
uint time;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit led7=P1^6;
sbit led8=P1^7
sbit     IRsignal=P3^2;   //HS0038接收头OUT端直接连P3.2(INT0)
void delay(uint z);
void delay(uint z)
{
   uint a,b;
   for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{uchar j,k;
     for(j=18;j>0;j--)
       for(k=20;k>0;k--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{uchar i,j;
   for(i=2;i>0;i--)
      for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{uchar i,j;
     for(i=10;i>0;i--)
      for(j=225;j>0;j--) ;
}
/**************************** 延时子程序 ************************/
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0 using 2      
{
EX0=0;
P3_0=!P3_0;
num=0;
        for(k=0;k<4;k++)
   {
                          Delay0_9ms();
     if (IRsignal==1)         //如果0.9msIRsignal=1,说明不是引导码
     {
         k=4;
                 break;        //P0=0XFF;
                                 }
     else if(k==2)           //如果持续了3×0.9ms=9ms的低电平,说明是引导码
      {
                //P0=0;
        time=0;
num=0;
        while(IRsignal==0);
                         //if(IRsignal==0)
                        // num+=1;
//        P1=num;
                        //        while(IRsignal==0);
while(time<100)
{
        time++;
Delay0_9ms();    //跳过持续1ms的高电平
Delay0_9ms();     //跳过持续1ms的高电平
if(IRsignal==0)
{
P0=num;
num+=1;
   //P1=num;
}
while(IRsignal==0);
}  

                                                                if(num==1)
                                                                led1=!led1;
                                                                if(num==2)
                                                                led2=!led2;
                                                                if(num==3)
                                                                led3=!led3;
                                                                if(num==4)
                                                                led4=!led4;
                                                                if(num==5)
                                                                led5=!led5;
                                                                if(num==6)
                                                                led6=!led6;
                                                                if(num==7)
                                                                led7=!led7;
                                                                if(num==8)
                                                                led8=!led8;
                                break;
//   delay(2);
       }
   }
EX0=1;
}
void init()// 定时器初始化
{
         TMOD=0x11;
         EA=1;
  IT0=1;    //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
  EX0=1;    //外部中断INT0, (1:开,      0:关    )
  CodeTemp=0;    //初始化红外编码字节缓存变量
}
main()
{                        
init();
while(1)
{
}
}
求求各位大佬看看我这个为什么接收端没有显示

51hei截图20221120141625.png
回复

使用道具 举报

ID:931877 发表于 2022-11-20 14:36 | 显示全部楼层
对于这个网上找了很久了   有点头大了
回复

使用道具 举报

ID:342822 发表于 2022-11-20 15:19 | 显示全部楼层
看看这语句末尾
sbit led8=P1^7   <————       缺点什么?????
回复

使用道具 举报

ID:931877 发表于 2022-11-20 19:24 | 显示全部楼层
taotie 发表于 2022-11-20 15:19
看看这语句末尾
sbit led8=P1^7

有点不太理解
回复

使用道具 举报

ID:34149 发表于 2022-11-20 19:41 | 显示全部楼层
应该是解码环节出了问题。NEC编解码有点复杂。
但是你用单片机写发送码,哪跟编码还有一定关系。
编解码要一致。
我没有仔细研究过代码,但就这是这个思路。
回复

使用道具 举报

ID:648281 发表于 2022-11-20 20:53 | 显示全部楼层
1、晶振用的多少,是否合适
2、收发程序都发上来
3、用示波器观察波形,是怎样波形
回复

使用道具 举报

ID:931877 发表于 2022-11-20 22:45 | 显示全部楼层
51hei**1140 发表于 2022-11-20 20:53
1、晶振用的多少,是否合适
2、收发程序都发上来
3、用示波器观察波形,是怎样波形

晶振用的都是38KHZ  发射程序也放上来了  人都要麻了  发射那里波形出来  然后接收模块都不动的
回复

使用道具 举报

ID:931877 发表于 2022-11-20 22:47 | 显示全部楼层
  1. #include <at89c51.h>
  2. #include <intrins.h>
  3. #define uchar  unsigned char
  4. #define uint   unsigned int
  5. # define _BV(bit) (1<<(bit))
  6. sbit k1=P2^0;
  7. sbit k2=P2^1;
  8. sbit k3=P2^2;
  9. sbit k4=P2^3;
  10. sbit k5=P2^4;
  11. sbit k6=P2^5;
  12. sbit k7=P2^6;
  13. sbit k8=P2^7;
  14. sbit out=P3^7;
  15. static bit OP;        //红外发射管的亮灭
  16. static unsigned int count;       //延时计数器
  17. static unsigned int endcount; //终止延时计数
  18. static unsigned char Flag;      //红外发送标志
  19. char iraddr1;  //十六位地址的第一个字节
  20. char iraddr2;  //十六位地址的第二个字节
  21. void SendIRdata(char p_irdata);
  22. uchar t=16;
  23. uchar CODE=0Xff;
  24. void delay_LCM(uint);  //LCD延时子程序
  25. /*********延时K*1ms,12.000mhz**********/
  26. void delay_LCM(uint k)
  27. {
  28.     uint i,j;
  29.     for(i=0;i<k;i++)
  30.     {
  31.         for(j=0;j<60;j++)
  32.                 {;}
  33.     }
  34. }
  35. void key()
  36. {
  37. if(k1==0)// 开
  38. {
  39.   delay_LCM(5);
  40.   if(k1==0)
  41.   {
  42.    SendIRdata(1);
  43.                         P0=1;
  44.    while(k1==0);
  45.   }
  46. }
  47.   if(k2==0)// 开
  48. {
  49.   delay_LCM(5);
  50.   if(k2==0)
  51.   {
  52. SendIRdata(2);
  53.                         P0=2;
  54.    while(k2==0);
  55.   }
  56. }
  57. if(k3==0)// 开
  58. {
  59.   delay_LCM(5);
  60.   if(k3==0)
  61.   {
  62. SendIRdata(3);
  63.                         P0=3;
  64.    while(k3==0);
  65.   }
  66. }
  67.   if(k4==0)// 开
  68. {
  69.   delay_LCM(5);
  70.   if(k4==0)
  71.   {
  72.    SendIRdata(4);
  73.                         P0=4;
  74.    while(k4==0);
  75.   }
  76. }
  77. if(k5==0)// 开
  78. {
  79.   delay_LCM(5);
  80.   if(k5==0)
  81.   {
  82.    SendIRdata(5);
  83.                         P0=5;
  84.    while(k5==0);
  85.   }
  86. }

  87.   if(k6==0)// 开
  88. {
  89.   delay_LCM(5);
  90.   if(k6==0)
  91.   {
  92.                         SendIRdata(6);
  93.                         P0=6;
  94.    while(k6==0);
  95.   }
  96. }

  97.   if(k7==0)// 开
  98. {
  99.   delay_LCM(5);
  100.   if(k7==0)
  101.   {
  102.    SendIRdata(7);
  103.                         P0=7;
  104.    while(k7==0);
  105.   }
  106. }
  107. if(k8==0)// 开
  108. {
  109.   delay_LCM(5);
  110.   if(k8==0)
  111.   {
  112.    SendIRdata(8);
  113.                         P0=8;
  114.    while(k8==0);
  115.   }
  116. }
  117. }      //定时器0中断处理
  118. void timeint(void) interrupt 1
  119. {
  120.   TH0=0xFF;
  121.   TL0=0xe6; //设定时值为38K 也就是每隔26us中断一次
  122.   count++;
  123. }      //定时器1中断处理
  124. void time1(void) interrupt 3
  125. {
  126. out=!out;
  127. }
  128. void SendIRdata(char p_irdata)
  129. {
  130.   int i;
  131.   char irdata=p_irdata;         //发送9ms的起始码
  132.   endcount=74;
  133.   Flag=1;
  134.   count=0;
  135.   out=0;
  136.         TR1=1;
  137.   do{}while(count<endcount);
  138.         TR1=0;
  139.         out=1;        //发送4.5ms的结果码
  140.                  //endcount=117;
  141.                  //Flag=0;
  142.                  //count=0;
  143.                  //out=1;
  144.                  //do{}while(count<endcount);
  145. endcount=25;
  146.      Flag=1;
  147.      count=0;
  148.             out=1;       //TR1=1;
  149.      do{}while(count<endcount);     //发送八位数据
  150. //irdata=~p_irdata;
  151.   for(i=0;i<irdata;i++)
  152.   {
  153.      endcount=25;
  154.      Flag=1;
  155.      count=0;
  156.             out=0;
  157.                    TR1=1;
  158.      do{}while(count<endcount);
  159.                           TR1=0;
  160.                    out=1;
  161. endcount=25;
  162.      Flag=1;
  163.      count=0;
  164.             out=1;
  165.                    //TR1=1;
  166.      do{}while(count<endcount);
  167.                           }
  168. }
  169. main()
  170. {
  171.   count = 0;
  172.   Flag = 0;
  173.   OP = 0;
  174.   out = 1;
  175.   EA = 1; //允许CPU中断
  176.   TMOD = 0x21; //设定时器0和1为16位模式1
  177.   ET0 = 1; //定时器0中断允许
  178. P1=0xff;
  179.   TH0 = 0xFF;
  180.   TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  181.   TR0 = 1;//开始计数
  182. TH1 = 256-13;
  183.   TL1 = 256-13; //设定时值0为38K 也就是每隔26us中断一次
  184.         ET1 = 1; //定时器1中断允许
  185.                 //TR1 = 1;
  186. //定时器1中断允许
  187. iraddr1=0x00;
  188. iraddr2=0x00;
  189.   while(1)
  190. {
  191.   key();
  192.         //P2=CODE=P1;
  193. //delay_LCM(100);
  194.          //SendIRdata(CODE);
  195. }
  196. }
复制代码
回复

使用道具 举报

ID:1055814 发表于 2022-12-6 13:24 | 显示全部楼层
sbit led8=P1^7   <——   缺了一点什么
回复

使用道具 举报

ID:1055814 发表于 2022-12-6 13:24 | 显示全部楼层


sbit led8=P1^7   <————缺一点什么
回复

使用道具 举报

ID:1056229 发表于 2022-12-7 12:07 | 显示全部楼层
sbit led8=P1^7   <——缺点什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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