⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t.c

📁 通过51解码38khz的红外遥控器信号
💻 C
字号:
#include<reg51.h>
#include<ks0108.h>
#include<lib.h>
//===========================函数声明=====================================//
void SendData(unsigned char Serial_data)  ;
unsigned char ReadCode();
unsigned char DisplayUART();
void ChangCode();
//==========================================================================//
sbit key0=P3^2;//=======确认键
sbit key1=P3^3;//=======选择键
sbit key2=P3^4;//=======确认键2
sbit Inf=P3^5;//15pin
sbit LED=P0^0;
sbit LED2=P0^5;
unsigned char SerialBuf[100];
unsigned char SerialBufCount;
unsigned char Flag=0;
//=====================================================================//

//====================主程序======================//
main()
{
 TMOD=0x21;     
 TH1=0xE8;      //波特率1200时,定时器/计数器T1自动重装初值 
 TL1=0xE8; 
 PCON=0x00;     //SMOD为0不倍增模式 
 SCON=0xc0;     //串行口设置为模式3,//
 //REN=1;       //允许接收 
 //ES=0;          //串行口允许中断 
EA=1;
IT1=1;
IT0=1; //键盘中断
EX0=1;EX1=1;
Initialize();
ClearScr(0,0,8,128);
DisplayListChar(0,0,Tip,0);
DisplayPic(1,1,2,16,wu,1);DisplayPic(1,17,2,16,zhi,1);DisplayPic(1,33,2,16,bin,1);//汉字测试
DisplayPic(3,1,2,16,hzk[0],1);DisplayPic(3,17,2,16,hzk[1],1);DisplayPic(3,33,2,16,hzk[2],1);//汉字测试
Delay(200);
while(1)
{if (key2==0){Delay(2000);while(key2==0);Flag=3;}
switch (Flag)
{case 1:LED=0;ClearScr(0,0,8,128);DisplayListChar(0,0,Rec,0);
        ReadCode();LED2=0;DisplayListChar(0,0,End,0);Flag=0;break;
 case 2:ClearScr(0,0,8,128);DisplayUART();Flag=0;break;
 case 3:ClearScr(0,0,8,128);DisplayListChar(0,0,Cod,0);ChangCode();Flag=0;break;
}
}
}
//=============================================================================//
void Key_1() interrupt 2
{
Delay(2000);
while(key1==0);
Flag=1;
}
//==============================================================================//

//KEY0确认键处理子程序==============================================================//
void Key_0() interrupt 0
{
Delay(2000);
while(key0==0);
Flag=2;
}

//UART中断程序
void Uart() interrupt 4
{RI=0; 
SerialBuf[SerialBufCount]= SBUF;
 SerialBufCount++;
}
//==============================================================================//
unsigned char DisplayUART()
{
unsigned char i,x=0,y=0;
TR1=1;//ES=1;
for (i=0;i<SerialBufCount;i++)
{
SendData(SerialBuf[i]);
if (y>120)y=0,x++;
if (SerialBufCount>100)return(1);    
DisplayListChar(x,y,&Number[SerialBuf[i]],0);y+=14;
}
SerialBufCount=0;LED2=1;LED=1;
TR1=0;//ES=0;
}
//---------------------------------------------*/
void SendData(unsigned char Serial_data)   
{ 
      ACC=Serial_data; 
      TB8=P;TI=0; 
      SBUF=Serial_data; 
      while(!TI); 
      TI=0;                            
}

//---------------------------------------------  
unsigned char ReadCode()
{
unsigned char i;
SerialBufCount=0;
while(Inf==1);// 等待信号
TH0=0x00;      
TL0=0x00;
TR0=1;   // 如果有信号开定时器(这时的信号为引导码)
//--------------------------------
for (i=0;i<100;i++)//读值
{
while(Inf==0);TR0=0;  
//读值时先等待低电平可以省去判断引导码的过程(引导码过后的第一个低电平表示数据开始)
SerialBuf[SerialBufCount]= TH0; 
SerialBufCount++; TH0=0x00;TL0=0x00;TR0=1;//只需取个大概值所以省略TL0

while(Inf==1);
if (TH0>0x4e) {SerialBufCount--;return 0;}
//如果所有的数据接收完了就返回(当接收端出现大于0x4e时间的高电平就表示结束)
TR0=0;
SerialBuf[SerialBufCount]= TH0; 
SerialBufCount++; TH0=0x00;TL0=0x00;TR0=1;
}
}

//--------------------------------
void ChangCode()
{
unsigned char temp=0,i,k=3,x,Code[4];
for (x=0;x<4;x++)
{
 for (i=0;i<8;i++)
 {
 temp=temp>>1;
 if (SerialBuf[i+k]>0x04){temp=temp|0x80;k++;}
 else if (SerialBuf[i+k]<0x04){temp=temp&0x7f;k++;}
 }

Code[x]=temp;k=k+8;
}
i=30;
TR1=1;
for (x=0;x<4;x++)
{SendData(Code[x]);DisplayListChar(2,i,&Number[Code[x]],0);i+=14;}
TR1=0;LED2=1;LED=1;
}











⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -