代码是红外解码程序,用的P3.2口,外部中断0。我想更换到P5.5 外部中断3.但是更换后就不能解码了。请问大佬们,除了更换到外部中断3,和IO口以外,还要更改定时器吗? 这个代码不更改IO口是能正常使用。在STC8G1A08中使用。
单片机源程序如下:
- #include "IR.h"
- //用12M晶震
- unsigned char ir_flag = 0;
- unsigned char ircode[4]; //红外代码接收缓冲区
- unsigned int HighTime,LowTime;
- void IR_Init(void)
- {
- IR_INPUT = 1;
- // INTCLKO = 0x20; //外部中断3
- IT0 = 1; //下降沿触发
- EX0 = 1; //打开外部中断
- AUXR &= 0x7F;
- TMOD &= 0xF0;
- TMOD |= 0x01; //设置T0 工作方式1
- TR0 = 0;
- EA = 1; //开总中断
-
- }
- void EX0_ISR(void) interrupt 0
- {
- ir_flag = 1;
- EX0 = 0;
- TH0 = 0; //定时器清零 为定时作准备
- TL0 = 0;
- TR0 = 1; //打开定时器0 计算引导码的低电平时间 9ms
- while(IR_INPUT == 0);
- TR0 = 0; //关闭定时器
- LowTime = TH0*256+TL0; //计算低电平时间 us
- if(((LowTime>8500)&&(LowTime<9500))!=1) //大于8.5ms小于9.5ms 就是正常的,否则退出
- {
- EX0 = 1;
- return;
- }
- TH0 = 0; //定时器初值清零 为定时作准备
- TL0 = 0;
- TR0 = 1; //打开定时器0 计算引导码的高电平时间 4.5ms
- while(IR_INPUT); //等待高电平结束
- TR0 = 0;
- HighTime = TH0*256+TL0; //计算高电平时间 us
- if((HighTime > 4000)&&(HighTime < 5000)) //引导码正常,则接收4个字节
- {
- ir_flag = ir_read(ircode);
- }
- EX0 = 1;
- }
- bit ir_read(unsigned char *pbuf)
- {
- unsigned char i,j;
- unsigned char temp = 0;
- //接收4个字节的数据
- for(i = 0;i<4;i++)
- {
- //接收一个字节 8bit
- for(j=0;j<8;j++)
- {
- temp = temp >> 1;
- TH0 = 0;
- TL0 = 0;
- TR0 = 1;
- while(IR_INPUT == 0);
- TR0 = 0;
- LowTime = TH0*256+TL0; //数据的低电平时间 载波的时间
-
- TH0 = 0;
- TL0 = 0;
- TR0 = 1;
- while(IR_INPUT);
- TR0 = 0;
- HighTime = TH0*256+TL0; //高电平时间 us
-
- if((LowTime < 360)||(LowTime > 680))
- return 0;
- if((HighTime > 500)&&(HighTime < 600))
- temp = temp & 0x7f; //0111 1111
- if((HighTime > 1500)&&(HighTime < 1800))
- temp = temp | 0x80; //1000 0000
- }
- pbuf[i] = temp;
- temp = 0;
- }
- if((pbuf[0]+pbuf[1]) == 255) //校验数据正确性
- if((pbuf[2]+pbuf[3]) == 255)
- return 1;
-
- return 0;
- }
复制代码
|