找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3614|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

求大師指導(dǎo)為啥我的單片機(jī)STC51紅外遙控程序,按著按著就死機(jī)了,需要復(fù)位才好

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:404202 發(fā)表于 2018-11-1 12:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


//----------------------------------------------------------------------------------------------------------------------------------
//程序名
//程序功能:紅外線(xiàn)遙控七色小燈
// --------------------------------------------------------------------------------------------------------------------------------
#include<reg51.h>                                             //頭文件
sbit IRIN=P3^2;                                                 //定義紅外IR信號(hào)輸入位
sbit R_LED=P0^0;                             //定義發(fā)紅光LED控制引腳        
sbit G_LED=P0^1;                             //定義發(fā)綠光LED控制引腳
sbit B_LED=P0^2;                             //定義發(fā)藍(lán)光LED控制引腳
sbit SPK=P2^7;                               //定義壓電喇叭信號(hào)輸入位
unsigned char IRDATA[7];                             //定義數(shù)組,存儲(chǔ)紅外接收到的數(shù)據(jù)
void delay(unsigned char x);                 //延時(shí)約x*0.1ms 函數(shù)
void fs_d ( );                               //發(fā)聲函數(shù)
void IR_ZX();                                //遙控執(zhí)行函數(shù)


//-------------------------------------- 主函數(shù) --------------------------------------


void main()                                   //主函數(shù)
{
        EA=1;                                     //允許總中斷
    EX0=1;                                    //允許外部中斷INT0中斷
        IT0=1;                                    //外部中斷INT0采用脈沖觸發(fā)方式
        fs_d ( );
        {       
          IRIN=1;                                 //IR 輸入位設(shè)置為高電平
          P0=0xff;
             IR_ZX();  
          while(1);                               //無(wú)限循環(huán)
    }
}


//-------------------------------------- 延時(shí)函數(shù)  -----------------------------------


void delay(unsigned char x)                           //延時(shí)約x*0.1ms  
{                                                                                         
        unsigned char i;                                                                
        while(x--)                                                           
        {for(i=0;i<10;i++){}}                                
}


//------------------------------------- 中斷解碼函數(shù) ----------------------------------


void IR_IN() interrupt 0 using 0                        //外部中斷INT0函數(shù)
{
unsigned char j,k,n=0;                                            //定義變量,且n=0
    EX0=0;                                                                            //暫時(shí)先關(guān)中斷
        delay(20);                                                        //延時(shí)0.10ms*20=2ms
        if(IRIN==1)                                                //如果IRIN出現(xiàn)高電平,是干擾信號(hào)
         {                                                                    
           EX0=1;
           return;                                  //返回                 
         }
        while(!IRIN){delay(1);}                                //避開(kāi)9ms前導(dǎo)低電平信


   for(j=0;j<4;j++)                                                    //一共有4組數(shù)據(jù)
     {       
          for(k=0;k<8;k++)                                            //每組數(shù)據(jù)有8位
         {
   while(IRIN){delay(1);}                            // 避開(kāi)4.5ms高電平
   while(!IRIN){delay(1);}                                 
// 開(kāi)始接收數(shù)據(jù)         
   while(IRIN)                                                 
         {
           delay(1);                                             //延時(shí)0.1ms
       n++;                                                             //每過(guò)0.1ms時(shí)n就加1
           if(n>=30)                                         //如果超過(guò)30,放棄
                {                                                              
                  EX0=1;
                  return;}                               //返回
                }
                  
              IRDATA[j]=IRDATA[j]>>1;                //右移1位
          if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}                                                                   
              n=0;                                         //n清0
            }
     }
//檢查接收的數(shù)據(jù)和數(shù)據(jù)反碼是否相反          
    if(IRDATA[2]!=~IRDATA[3])                         //判斷數(shù)據(jù)碼和數(shù)據(jù)反碼是不是相反
           {                                                                         //否則就放棄
             EX0=1;
             return;
           }       
//        遙控執(zhí)行          
     else   
             EX0=1;                                  //開(kāi)中斷
         fs_d ( );                               //調(diào)用發(fā)聲函數(shù)       
        }       




//-------------------------------------  發(fā)聲函數(shù)  -----------------------------------------
void fs_d ( )                                                  
  {                                                                                                                   
        unsigned char i;                                               
        for(i=0;i<100;i++)
         {
           delay(4);                                                     
           SPK=~SPK;
         }                                                                        
           SPK=1;
}
            
//------------------------------------  遙控執(zhí)行函數(shù) --------------------------------------


void IR_ZX()                                       //遙控執(zhí)行函數(shù)
     {
       while(1)
        {
                  switch(IRDATA[2])  
            {
//發(fā)紅色光   
                         case 0x01:                     
               {
                                 G_LED=1;                          //綠光LED熄滅
                 B_LED=1;                          //藍(lán)光LED熄滅
                 R_LED=0;                          //紅光LED亮
                 break;
                          }
//發(fā)黃色光         
             case 0x02:                     
               {
                             B_LED=1;                         //藍(lán)光LED熄滅
                 R_LED=0;                         //紅光LED亮
                 G_LED=0;                         //綠光LED亮
                 break;
                          }
  //發(fā)綠色光               
            case 0x03:                        
               {
                     B_LED=1;                         //藍(lán)光LED熄滅
                 R_LED=1;                         //紅光LED滅
                 G_LED=0;                         //綠光LED亮
                 break;
                          }
//發(fā)青色光
            case 0x04:                        
               {
                     R_LED=1;                          //紅光LED熄滅
                 G_LED=0;                          //綠光LED亮
                 B_LED=0;                          //藍(lán)光LED亮
                 break;
                          }
  //發(fā)藍(lán)色光        
             case 0x05:                        
               {
                     R_LED=1;                          //紅光LED熄滅
                 G_LED=1;                          //綠光LED熄滅
                 B_LED=0;                          //藍(lán)光LED亮
                 break;
                          }   
  //發(fā)紫色光
             case 0x06:                        
               {
                     G_LED=1;                          //綠光LED熄滅
                 R_LED=0;                          //紅光LED亮                                   
                 B_LED=0;                          //藍(lán)光LED亮
                 break;
                          }
  //發(fā)白色光
             case 0x07:                          
               {
                 R_LED=0;                          //紅光LED亮
                 G_LED=0;                          //綠光LED亮
                 B_LED=0;                          //藍(lán)光LED亮
                 break;
                          }
  //關(guān)閉彩燈            
                    case 0x08:                           
               {
                     R_LED=1;                          //紅光LED熄滅
                 G_LED=1;                          //綠光LED熄滅
                 B_LED=1;                          //藍(lán)光LED熄滅
                 break;
                          }
            }
        }
     }  


//-------------------------------------------------------------------------------------------------  
          
                  
                  
               




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:303383 發(fā)表于 2018-11-1 14:03 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

板凳
ID:419091 發(fā)表于 2018-11-1 14:16 | 只看該作者
你在每個(gè)while內(nèi)設(shè)斷點(diǎn),然后Debug運(yùn)行,看看卡在哪里了,應(yīng)該是卡在某一個(gè)while循環(huán)里出不來(lái)了
回復(fù)

使用道具 舉報(bào)

地板
ID:401564 發(fā)表于 2018-11-1 15:36 | 只看該作者
用的是STC的單片機(jī)嗎?
如果是,那就先看一下你所用的單片機(jī)的數(shù)據(jù)手冊(cè),重點(diǎn)看時(shí)鐘,如果你這個(gè)程序是在89C52上面的,用在了5A60S2上面肯定是不行的,雖然延時(shí)函數(shù)一樣,但執(zhí)行的時(shí)鐘不一樣,所以,時(shí)間也不一樣
而紅外檢測(cè)是要等待一個(gè)電平的,有可能是你這個(gè)電平已經(jīng)過(guò)了,而且,由于紅外發(fā)射器的誤差,就變成了有時(shí)候給收得到,有時(shí)候按了沒(méi)反應(yīng),有時(shí)候就卡住不再動(dòng)了.
為了防止它不動(dòng),你可以在中斷函數(shù)里加入看門(mén)狗,而在主函數(shù)清除看門(mén)狗數(shù)據(jù),這樣一來(lái),只要卡在某個(gè)地方了,看門(mén)狗會(huì)幫你復(fù)位的.
以上是按我曾經(jīng)寫(xiě)過(guò)的一個(gè)紅外程序,用在兩個(gè)不同的51上面的經(jīng)驗(yàn)而寫(xiě)的.

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:149144 發(fā)表于 2018-11-1 16:56 | 只看該作者
unsigned char IRDATA[7] = {‘\0’};
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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