找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1746|回复: 6
收起左侧

单片机红外遥控解码程序更换IO口后不能解码,请教大佬们一下,在此感激不敬。

[复制链接]
ID:959051 发表于 2021-11-26 18:04 | 显示全部楼层 |阅读模式
代码是红外解码程序,用的P3.2口,外部中断0。我想更换到P5.5 外部中断3.但是更换后就不能解码了。请问大佬们,除了更换到外部中断3,和IO口以外,还要更改定时器吗? 这个代码不更改IO口是能正常使用。在STC8G1A08中使用。

单片机源程序如下:
  1. #include "IR.h"
  2. //用12M晶震
  3. unsigned char ir_flag = 0;
  4. unsigned char ircode[4]; //红外代码接收缓冲区
  5. unsigned int HighTime,LowTime;
  6. void IR_Init(void)
  7. {
  8.         IR_INPUT = 1;
  9. //        INTCLKO = 0x20;  //外部中断3
  10.         IT0 = 1; //下降沿触发
  11.         EX0 = 1; //打开外部中断        
  12.         AUXR &= 0x7F;
  13.         TMOD &= 0xF0;
  14.         TMOD |= 0x01; //设置T0 工作方式1
  15.         TR0 = 0;
  16.         EA = 1; //开总中断
  17.         
  18. }

  19. void EX0_ISR(void) interrupt 0
  20. {
  21.         ir_flag = 1;
  22.         EX0 = 0;
  23.         TH0 = 0;  //定时器清零 为定时作准备
  24.         TL0 = 0;  
  25.         TR0 = 1;  //打开定时器0 计算引导码的低电平时间 9ms
  26.         while(IR_INPUT == 0);
  27.         TR0 = 0; //关闭定时器
  28.         LowTime = TH0*256+TL0; //计算低电平时间 us
  29.         if(((LowTime>8500)&&(LowTime<9500))!=1)  //大于8.5ms小于9.5ms 就是正常的,否则退出
  30.         {
  31.                 EX0 = 1;
  32.                 return;
  33.         }
  34.         TH0 = 0;  //定时器初值清零 为定时作准备
  35.         TL0 = 0;  
  36.         TR0 = 1;  //打开定时器0 计算引导码的高电平时间 4.5ms
  37.         while(IR_INPUT);  //等待高电平结束
  38.         TR0 = 0;
  39.         HighTime = TH0*256+TL0; //计算高电平时间 us
  40.         if((HighTime > 4000)&&(HighTime < 5000)) //引导码正常,则接收4个字节
  41.         {                                
  42.                 ir_flag = ir_read(ircode);               
  43.         }
  44.         EX0 = 1;

  45. }


  46. bit ir_read(unsigned char *pbuf)
  47. {
  48.         unsigned char i,j;
  49.         unsigned char temp = 0;

  50.                 //接收4个字节的数据
  51.                 for(i = 0;i<4;i++)
  52.                 {
  53.                         //接收一个字节 8bit
  54.                         for(j=0;j<8;j++)
  55.                         {
  56.                                 temp = temp >> 1;
  57.                                 TH0 = 0;
  58.                                 TL0 = 0;
  59.                                 TR0 = 1;
  60.                                 while(IR_INPUT == 0);
  61.                                 TR0 = 0;
  62.                                 LowTime = TH0*256+TL0; //数据的低电平时间 载波的时间
  63.                                 
  64.                                 TH0 = 0;
  65.                                 TL0 = 0;
  66.                                 TR0 = 1;
  67.                                 while(IR_INPUT);
  68.                                 TR0 = 0;
  69.                                 HighTime = TH0*256+TL0; //高电平时间 us
  70.                                 
  71.                                 if((LowTime < 360)||(LowTime > 680))
  72.                                         return 0;
  73.                                 if((HighTime > 500)&&(HighTime < 600))
  74.                                         temp = temp & 0x7f; //0111 1111
  75.                                 if((HighTime > 1500)&&(HighTime < 1800))
  76.                                         temp = temp | 0x80; //1000 0000
  77.                         }
  78.                         pbuf[i] = temp;
  79.                         temp = 0;
  80.                 }
  81.                 if((pbuf[0]+pbuf[1]) == 255)  //校验数据正确性
  82.                         if((pbuf[2]+pbuf[3]) == 255)
  83.                                 return 1;               
  84.                
  85.                 return 0;
  86. }
复制代码

回复

使用道具 举报

ID:624769 发表于 2021-11-26 18:53 | 显示全部楼层
主程序呢? 着代码不用主程序的么??

换到 P5.5的话, 主程序里记得要加:
P5M0 = 0;
P5M1 = 0;
回复

使用道具 举报

ID:959051 发表于 2021-11-26 19:10 | 显示全部楼层
188610329 发表于 2021-11-26 18:53
主程序呢? 着代码不用主程序的么??

换到 P5.5的话, 主程序里记得要加:

主程序里面设置了双向口输出P5M0 = 0;
P5M1 = 0;
回复

使用道具 举报

ID:235200 发表于 2021-11-26 21:03 | 显示全部楼层
没有把更换到外部中断3的程序贴出来,不好解答,只要按说明书配置好INIT3的触发方式和中断号,应该是没有问题的
回复

使用道具 举报

ID:959051 发表于 2021-11-26 21:19 | 显示全部楼层
csmyldl 发表于 2021-11-26 21:03
没有把更换到外部中断3的程序贴出来,不好解答,只要按说明书配置好INIT3的触发方式和中断号,应该是没有问 ...

外部中段3就是前面注释了那句。INTCLKO = 0x20;  //外部中断3  这个就是开启外部中段3,然后之前的是外部中断0, 外部中段0有两句,就是IT0 = 1;EX0 = 1;我就是把这两句注释了,换成INTCLKO = 0x20;换了后就不行了。IO口也都配置了 是准双向口。定时器没动。不知道这个是什么原因。
回复

使用道具 举报

ID:959051 发表于 2021-11-26 21:20 | 显示全部楼层
本帖最后由 guoqiang881245 于 2021-11-26 21:28 编辑
csmyldl 发表于 2021-11-26 21:03
没有把更换到外部中断3的程序贴出来,不好解答,只要按说明书配置好INIT3的触发方式和中断号,应该是没有问 ...

外部中段3 为什么就一句呢,外部中断0 和1 都有单独的开关。
回复

使用道具 举报

ID:959051 发表于 2021-11-26 21:21 | 显示全部楼层
guoqiang881245 发表于 2021-11-26 21:19
外部中段3就是前面注释了那句。INTCLKO = 0x20;  //外部中断3  这个就是开启外部中段3,然后之前的是外部 ...

我没有配置中段号 我晕 ,大意了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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