您的位置 首页 培训

红外解码数码管显现+串口接纳

#includereg52.h>#includeintrins.h>//**********************************************************

#include

#include

//***********************************************************
// TC9012 红外遥控接纳数码管显现+串口接纳—–成功! *
//***********************************************************
#define uchar unsigned char //界说一下方便使用
#define uint unsigned int
//unsigned char code dgw[] = {0xfe,0xfd,0xfb,0xf7};//数码管操控
unsigned char scan[4]={0xf7,0xfb,0xfd,0xfe};//p1位挑选
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char code led_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char disbuf[4];//数码管显现缓冲
uchar irdate[33];
char DAT[4]={0};

uchar temp,keynum,ledstop=8,irtime;
uchar startfleg,bitnum,irallok;
uchar irok;
uchar ircode[4];
uchar jia,flog;

void delay(unsigned char x) ;//x*0.14MS
//sbit sm = P1^0;
sbit BEEP = P3^7 ; //声响输出接口

/*
红外接纳,并辨认遥控上的数字 P3.7声响输出接口
P0数码管段选 P1数码管位选 P3.2红外输入端

*/

void delay1ms(int n) //差错 0us
{
unsigned char a,b;
int m;
for(m=0;m {
for(b=9;b>0;b–)
for(a=1;a>0;a–);
}

}

void DELAY_MS (unsigned int a)//延时程序
{
unsigned int i;
while( –a != 0)
{
for(i = 0; i < 125; i++);
}
}

////////////////////////
//简化显现函数
void disp(int x)
{
int i,temp = 0x01;
DAT[0]=x/1000;
DAT[1]=x/100%10;
DAT[2]=x/10%10;
DAT[3]=x%10;
for(i=0;i<4;i++)
{
P1 = ~temp;
P0 = tab[DAT[i]];
DELAY_MS(4);
temp = temp<<1; //左移位
}

}

void irwork() // disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);//机器码,取高4位
{
// 16进制显现(键值)
disbuf[0] = (((ircode[1]&0xf0)>>4)&0x0f);
disbuf[1] = ircode[1]&0x0f;

disbuf[2] = (((ircode[2]&0xf0)>>4)&0x0f);
disbuf[3] = ircode[2]&0x0f;

//以下是十进制显现(键码)
//disbuf[0] = ircode[2]; //经过缓冲得到数值
//disbuf[1] = ircode[3];

}

void LedDisp()//键值显现
{
unsigned char i;
for(i=0;i<4;i++)
{
P0=tab[disbuf[i]];
P1 = scan[i];
DELAY_MS(5);
P1=0xff;
}
}

void irtimeA() //中止初始化
{
TMOD = 0X22;//设守时器0并用工作方法2
TH0 = 0;//高位赋初值
TL0 = 0;//低位赋初值 //使守时器256us中止一次
EA = 1;//敞开总中止开关
ET0 = 1;//发动守时中止
TR0 = 1;//敞开守时器
EX0 = 1;//翻开外部中止
IT0 = 1;//挑选外部中止方法1

TH1 = 0XF3;//守时器初值高8位设置
TL1 = 0XF3;//守时器初值低8位设置
TR1 = 1;//发动守时器
SM0 = 0;
SM1 = 1;//设置串口工作方法
REN = 1;//使串口接纳使能
//EA = 1;//翻开总中止开关
ES = 1;//翻开串口中止
PCON = 0x80;//波特率倍频(屏蔽本句波特率为2400)
//IP = 0x10;
}

void beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay1ms(10);
BEEP=!BEEP;
}
BEEP=1 ;
}

void irpros(void) //对接纳到的数据处理
{
uchar k,value, i,j;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++) //循环8次得到一段8位的码
{
value = value>>1;
if(irdate[k]>6) //判别有几个irtime=255us 大于6个是1
{
value = value | 0x80;

}
k++;
}
ircode[j] = value; //将一段8位的码存入数组中
}

irallok = 1;

}

main()
{
//uchar wx=0x01,js;
irtimeA();

while(1)
{
if(irok==1)
{
irpros();
irok = 0;
}
if(irallok==1)
{
irwork();
//ircal();
irallok = 0;
beep();

ES = 0;//封闭串口中止

///////////////////解码结束串口接纳显现///
flog = 0;
SBUF = ircode[0]; //单片机向pc发送数据////
while(!TI);//等候数据发送结束 ////
TI = 0; //发送标志方位0 ////
ES = 1;//翻开串口中止 ////
//DELAY_MS(5);
//////////////////////////////////////////
flog = 0;
SBUF = ircode[1]; //单片机向pc发送数据////
while(!TI);//等候数据发送结束 ////
TI = 0; //发送标志方位0 ////
ES = 1;//翻开串口中止 ////
//DELAY_MS(5);
//////////////////////////////////////////
flog = 0;
SBUF = ircode[2]; //单片机向pc发送数据////
while(!TI);//等候数据发送结束 ////
TI = 0; //发送标志方位0 ////
ES = 1;//翻开串口中止 ////
//DELAY_MS(5);
//////////////////////////////////////////
flog = 0;
SBUF = ircode[3]; //单片机向pc发送数据////
while(!TI);//等候数据发送结束 ////
TI = 0; //发送标志方位0 ////
ES = 1;//翻开串口中止 ////
//////////////////////////////////////////发送结束标志位
flog = 0;
SBUF =0x64; //单片机向pc发送数据////
while(!TI);//等候数据发送结束 ////
TI = 0; //发送标志方位0 ////
ES = 1;//翻开串口中止 ////
//////////////////////////////////////////

}
LedDisp();
//disp(shiyan);
//disp(disbuf[1]);
//ledshine();
//ledshines();
}
}

void timer0() interrupt 1 //守时器0中止
{
irtime++;
}
void inter0() interrupt 0 //外部中止
{

if(startfleg)
{
if(irtime>32) //判别引导码是否发送结束
{
bitnum = 0;

}
irdate[bitnum] = irtime; //接纳数据并把数据存入数组
irtime = 0;
bitnum++;
if(bitnum==33)
{
bitnum = 0;
irok = 1;

}
}
else
{
startfleg = 1; //是否接纳到数据标志位
irtime = 0;

}

//serial() interrupt 4;
}

void serial() interrupt 4 //串口中止函数
{
//a = SBUF;

RI = 0; //中止接纳标志方位0
flog = 1;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/266997.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部