代碼是紅外解碼程序,用的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;
- }
復制代碼
|