找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3047|回復(fù): 0
收起左側(cè)

一個紅外實驗課程的問題,求指點迷津

[復(fù)制鏈接]
ID:48374 發(fā)表于 2013-3-4 16:36 | 顯示全部樓層 |閱讀模式
// 主函數(shù)讀出 碼值,給P2口,驅(qū)動連接P2口的LED流水燈,看效果
//**********************************************************************
#include <reg51.h>
extern unsigned char datanum[4];
sbit red_line=P3^2;
void init_int0()             //中斷初始化,下降沿觸發(fā)方式
{
        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.辨別是開始嗎還是結(jié)束嗎
按鍵按下時,P3。2由高到低,觸發(fā)中斷,進(jìn)入中斷程序。第一步 關(guān)閉中斷后,區(qū)分是引導(dǎo)嗎還是結(jié)束嗎,原理是,等待p3.2 口的電平為高,隔2.25ms后去檢測P3.2的電平,如果是高電平,則是開始嗎,進(jìn)入碼值讀取部分,讀取完32個位后,等待9MS后,此時的P3.2為高電平 開中斷,歷程結(jié)束。
如果是低電平,則是結(jié)束嗎,跳過碼值讀取部分,等待9MS后,開中斷,歷程結(jié)束。
2.碼值讀取
   由于引導(dǎo)嗎讀取后,P3.2電平為低的時候,才進(jìn)入讀取嗎部分。所以,這個時候只需等待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()                //引導(dǎo)嗎和結(jié)束嗎的分辨
{
        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)     //字節(jié)讀取歷程
{
        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口燈全亮后, 無論怎么按鍵,就是木有變化
         求邏輯上的改錯,,,,求 各位師兄指點迷津,跪求。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表