下面是紅外通信數據解碼程序,功能是:按遙控器上的按鍵,使按鍵的數據以16進制的方式在數碼管上顯示出來,當某個按鍵按下時執行相應的功能。此代碼放在12T的STC89C52上運行正常,但是放在1T的STC8G1K08上就出現問題了,現象是:只有幾個按鍵的數據可以解碼出來,大部分的按鍵無效,兩款單片機的運行速度不一樣,延時函數的時間調了也是沒用,難道是STC的12T和1T的單片機內核不一樣嗎?求大佬們賜教!!
#include"stc8g.h"
typedef unsigned int u16; //對數據類型聲明定義
typedef unsigned char u8;
sbit Relay=P5^5;
sbit IRIN=P3^2; //定義紅外接收INT0輸入口
u8 IrValue[4];
u8 Time;
u8 DisplayData[4];
u8 code smgduan[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xff};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼
void delay(u16 z) //z=1時,大約延時10us
{
u16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void DigDisplay() //數碼管顯示函數
{
u8 i;
P1=0xff; //消隱
P3&=0x0f; //位清0
P1=DisplayData[i]; //段碼
P3|=0x10<<i; //位碼
i++;
i%=4;
}
void IrInit() //初始化紅外線接收
{
IT0=1; //下降沿觸發
EX0=1; //打開中斷0允許
EA=1; //打開總中斷
IRIN=1; //初始化端口
}
void main()
{
P1M0=0x00;
P1M1=0x00;
P3M0=0xff; //P3口設置為強推挽
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
IrInit();
while(1)
{
DisplayData[3] = smgduan[17]; //此位不顯示
DisplayData[2] = smgduan[IrValue[2]/16]; //顯示解碼后的16進制的數據值
DisplayData[1] = smgduan[IrValue[2]%16];
DisplayData[0] = smgduan[16]; //顯示H,表示16進制的意思
DigDisplay();
if(IrValue[2]==0x10) //接收到某個數值時,執行的功能
{
Relay=~Relay;
}
}
}
void ReadIr() interrupt 0 //解碼紅外數值的中斷函數
{
u8 j,k;
u16 err;
Time=0;
delay(700);
if(IRIN==0)
{
err=1000;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
if(IRIN==1)
{
err=500;
while((IRIN==1)&&(err>0))
{
delay(1);
err--;
}
for(k=0;k<4;k++) //共有4組數據
{
for(j=0;j<8;j++) //接收一組數據
{
err=60;
while((IRIN==0)&&(err>0))
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0))
{
delay(10);
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1; //k表示第幾組數據
if(Time>=8)
{
IrValue[k]|=0x80;
}
Time=0;
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
|