#include<reg52.h>
#include"2.h"
/***************红外解码***********************/
unsigned char IR_DAT[4];
sbit IR=P3^2; //将IR位定义为P3.2引脚
unsigned int LowTime,HighTime; //储存高、低电平的宽度
unsigned char bz;
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
/*****************先知科技******************************
led显示驱动程序
V1.0-20190512
*******************************************************/
#include<reg52.h>
sbit SI=P2^0;//定义数据输入口
sbit SCK=P2^1;//上升沿时数据寄存器的数据移位,a>h
sbit RCK=P2^2;//上升沿时移位寄存器数据进入数据存储器
/**************************************************
函数功能:延时1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
**************************************************/
void delay(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay1ms();
}
void Ser_IN(unsigned char DataH,unsigned char DataL)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK=0;//现将移位寄存器时钟置低
SI=DataH&0x80;//取数据最高位
DataH<<=1;
SCK=1;
}
for(i=0;i<8;i++)
{
SCK=0;//现将移位寄存器时钟置低
SI= DataL&0x80;//取数据最高位
DataL<<=1;
SCK=1;
}
}
//并行数据输出
void Par_OUT(void)
{
RCK=0;
RCK=1;
}
void dispay_reset1(void)
{
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
}
void dispay_reset(void)
{
/**************************************
流水灯检测坏点
**************************************/
Ser_IN(0x7f,0xff);//1
Par_OUT();
delay(100);
Ser_IN(0xbf,0xff);//2
Par_OUT();
delay(100);
Ser_IN(0xdf,0xff);//3
Par_OUT();
delay(100);
Ser_IN(0xef,0xff);//4
Par_OUT();
delay(100);
Ser_IN(0xf7,0xff);//5
Par_OUT();
delay(100);
Ser_IN(0xfb,0xff);//6
Par_OUT();
delay(100);
Ser_IN(0xfd,0xff);//7
Par_OUT();
delay(100);
Ser_IN(0xfe,0xff);//8
Par_OUT();
delay(100);
Ser_IN(0xff,0x7f);//9
Par_OUT();
delay(100);
Ser_IN(0xff,0xbf);//10
Par_OUT();
delay(100);
Ser_IN(0xff,0xdf);//11
Par_OUT();
delay(100);
Ser_IN(0xff,0xef);//12
Par_OUT();
delay(100);
Ser_IN(0xff,0xf7);//13
Par_OUT();
delay(100);
Ser_IN(0xff,0xfb);//14
Par_OUT();
delay(100);
Ser_IN(0xff,0xfd);//15
Par_OUT();
delay(100);
Ser_IN(0xff,0xfe);//16
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
Ser_IN(0xff,0xfe);//16
Par_OUT();
delay(100);
Ser_IN(0xff,0xfd);//15
Par_OUT();
delay(100);
Ser_IN(0xff,0xfb);//14
Par_OUT();
delay(100);
Ser_IN(0xff,0xf7);//13
Par_OUT();
delay(100);
Ser_IN(0xff,0xef);//12
Par_OUT();
delay(100);
Ser_IN(0xff,0xdf);//11
Par_OUT();
delay(100);
Ser_IN(0xff,0xbf);//10
Par_OUT();
delay(100);
Ser_IN(0xff,0x7f);//9
Par_OUT();
delay(100);
Ser_IN(0xfe,0xff);//8
Par_OUT();
delay(100);
Ser_IN(0xfd,0xff);//7
Par_OUT();
delay(100);
Ser_IN(0xfb,0xff);//6
Par_OUT();
delay(100);
Ser_IN(0xf7,0xff);//5
Par_OUT();
delay(100);
Ser_IN(0xef,0xff);//4
Par_OUT();
delay(100);
Ser_IN(0xdf,0xff);//3
Par_OUT();
delay(100);
Ser_IN(0xbf,0xff);//2
Par_OUT();
delay(100);
Ser_IN(0x7f,0xff);//1
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部开启
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部关闭
Par_OUT();
delay(100);
}
main()
{
while(1)
{ EA=1; //开启总中断
EX0=1; //开外中断0
ET0=0; //定时器T1中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x11; //使用定时器T1的模式1
TR0=0; //定时器T0关闭
dispay_reset();
if(0x0a==bz)
{
Ser_IN(bz,bz);
Par_OUT();
}
else
{
dispay_reset1();
}
}
}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0
{
unsigned char i,j;
unsigned char IR_temp; //储存解码出的数据
EX0=0;//关闭外中断0,不在接收二次红外信号中断,只解码当前的红外
TH0=0;//定时器高八位清零
TL0=0;//定时器T0低八位清0
TR0=1;//定时器开启
while(IR==0);//等待低电平变为高电平计算低电平的时间
TR0=0;//关闭定时器T0
LowTime=TH0*256+TL0;//保存低电平的时间
TH0=0;
TL0=0;
TR0=1;//定时器清空之后,重新计算高电平的时间
while(IR==1);
TR0=0;//关闭定时器
HighTime=TH0*256+TL0;
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700)) //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
{
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR==0);//低电平不执行程序,滤掉低电平,只检测高电平
TH0=0;
TL0=0; //检测到高电平开始计算高电平持续时间
TR0=1;
while(IR==1);//等待高电平结束
TR0=0;//高电平结束停止计时
HighTime=TH0*256+TL0; //计算高电平的时间
IR_temp=IR_temp>>1;
if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
IR_temp=IR_temp&0x7f; //(520-100=420, 520+100=620),则该位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
IR_temp=IR_temp|0x80;
}
IR_DAT[i]=IR_temp;//将得到的数据保存在数组中
dispay_reset1();
}
/******************************
if(IR_DAT[2]!=~IR_DAT[3])
{
bz=0xff;
EX0=1;
Ser_IN(0xff,0x00);
Par_OUT();
return;
}
else
{
bz=IR_DAT[2];
Ser_IN(bz,bz);
Par_OUT();
EX0=1;
//
}
dispay_reset();
return;
}
// else
// {
// EX0=0;//关闭外中断0,不在接收二次红外信号中断,只解码当前的红外
//dispay_reset1();
// }
*******************************/
}
EX0=1;
//restart:
}
|