久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3585|回復: 4
打印 上一主題 下一主題
收起左側

求大師指導為啥我的單片機STC51紅外遙控程序,按著按著就死機了,需要復位才好

[復制鏈接]
跳轉到指定樓層
樓主
ID:404202 發表于 2018-11-1 12:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


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


//-------------------------------------- 主函數 --------------------------------------


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


//-------------------------------------- 延時函數  -----------------------------------


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


//------------------------------------- 中斷解碼函數 ----------------------------------


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


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




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


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


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




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

使用道具 舉報

沙發
ID:303383 發表于 2018-11-1 14:03 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:419091 發表于 2018-11-1 14:16 | 只看該作者
你在每個while內設斷點,然后Debug運行,看看卡在哪里了,應該是卡在某一個while循環里出不來了
回復

使用道具 舉報

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

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产偷| 久久久91精品国产一区二区精品 | 亚洲一区电影 | 日韩成人av在线播放 | 久久无毛 | 欧产日产国产精品视频 | 精精国产xxxx视频在线播放7 | 中文字幕亚洲一区二区三区 | 九色www | 特级做a爰片毛片免费看108 | 亚洲人久久 | 国产高清精品一区二区三区 | 一级黄色影片在线观看 | 91久久久久久久久久久 | 国产区一区二区三区 | 欧美国产日韩在线观看 | 国产高清精品一区 | 色天堂影院 | 欧美一级片免费看 | 日韩精品一区在线观看 | 午夜精品久久久久久久99黑人 | 亚州视频在线 | 亚洲国产精品日本 | 久久久久久亚洲精品 | 亚洲精品1 | 欧美日韩在线一区二区 | 亚洲国产精品一区二区三区 | 国产91在线观看 | 一区二区三区在线免费 | 亚洲+变态+欧美+另类+精品 | 日韩中文久久 | 成年人在线电影 | 国产黑丝av| 中文字幕在线观看精品 | av官网在线 | 亚洲高清视频在线 | 偷拍自拍第一页 | 欧美一区二区三区视频在线观看 | 久久99精品久久久久久噜噜 | 国产精品国产三级国产aⅴ无密码 | 久久国产精品一区二区 |