向各位师兄们讨教个 红外实验 的问题
// 主函数读出 码值,给P2口,驱动连接P2口的LED流水灯,看效果//**********************************************************************
#include <reg51.h>
extern unsigned char datanum[4];
sbit red_line=P3^2;
void init_int0() //中断初始化,下降沿触发方式
{
EA=1;
EX0=1;
IT0=1;
}
void delay1(unsigned int i)
{
unsigned char j;
for(i;i>0;i--)
for(j=100;j>0;j--);
}
void main()
{
led_line=1;
init_int0();
while(1){
P2=datanum[2];
delay1(1000);
}
}
//*******************************************************
中断部分
1.辨别是开始吗还是结束吗
有按键按下时,P3。2由高到低,触发中断,进入中断程序。第一步 关闭中断后,区分是引导吗还是结束吗,原理是,等待p3.2 口的电平为高,隔2.25ms后去检测P3.2的电平,如果是高电平,则是开始吗,进入码值读取部分,读取完32个位后,等待9MS后,此时的P3.2为高电平 开中断,历程结束。
如果是低电平,则是结束吗,跳过码值读取部分,等待9MS后,开中断,历程结束。
2.码值读取
由于引导吗读取后,P3.2电平为低的时候,才进入读取吗部分。所以,这个时候只需等待P3.2再次为高电平,等待0.84 ms后 读取P3.2的电平,为低则表示码值为0,为高表示码值为1,辨别完后,由
于不知道是读了1或者读了0,一律等待P3.2的电平为低电平后再次读取下一个位
//**************************************************************
#include <reg51.h>
sbit red_line=P3^2;
unsigned char i,j;
unsigned char datanum[4]={0,0,0,0};
void close_int0()
{
EX0=0;
}
void init_xlat0(unsigned char high,unsigned char low) //时钟初始化的历程
{
TMOD=9;
TH0=high;
TL0=low;
TF0=0;
TR0=1;
}
unsigned char guide_wipe() //引导吗和结束吗的分辨
{
while(1){
if(red_line==1){
init_xlat0(0xf7,0x35);
while(1){
if(TF0==1){
if(red_line==1)
return(1);
else
return(0);
}
}
}
}
}
unsigned char dist_one_zero() //1和0的分辨
{
init_xlat0(0xfd,0xc7);
while(1){
if(TF0==1){
if(red_line==1)
return(0x80);
else
return(0);
}
}
}
void delay(unsigned char a,unsigned char b) //延时历程
{
init_xlat0(a,b);
while(1){
if(TF0==1)
break;
}
}
void read_datenum_bit(unsigned char c) //字节读取历程
{
while(1){
if(red_line==1){
datanum[c]>>=1;
datanum[c]|=dist_one_zero();
break;
}
}
while(1){
if(red_line==0)
break;
}
}
void into_in(void) interrupt 0 //中断历程
{
close_int0();
if(guide_wipe()==1){
while(1){
if(red_line==0)
break;
}
for(i=0;i<4;i++)
for(j=0;j<8;j++){
read_datenum_bit(i);
}
}
delay(0xdc,0xd7);
EX0=1;
}
问题: 程序运行不正常,起先P2口灯全亮后, 无论怎么按键,就是木有变化
求逻辑上的改错,,,,求 各位师兄指点迷津,跪求。