標(biāo)題: 請(qǐng)教如何把89c52單片機(jī)紅外解碼程序移植到15W408中 [打印本頁(yè)]

作者: 芙蓉焊料    時(shí)間: 2023-12-16 11:49
標(biāo)題: 請(qǐng)教如何把89c52單片機(jī)紅外解碼程序移植到15W408中
初次接觸1T的stc15W408as單片機(jī),不清楚哪些程序要改動(dòng)?
請(qǐng)教如何把89c52單片機(jī)紅外解碼程序移植到15W408中運(yùn)行?
#include <REGX52.H>
#include <intrins.h>
#define uchar unsigned char   
#define uint  unsigned int  

uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0xFF};

sbit        IR    = P3^2;        //紅外接收端         

uchar        N[4];                                 //識(shí)別碼,操作碼存放
uchar  sj=0;

void XSQ(void);
void YS(uchar time);

/****************** 主函數(shù) *******************/
void main(void)
{           
  IT0 = 1;
  EX0 = 1;
  EA  = 1;

  while(1)
  {
      XSQ();
  }
}

/**********************數(shù)碼管顯示函數(shù)************************/
void XSQ(void)
{
          
          P0=tab[X3];
           P2_6=0;
           YS(1);        //操作碼
           P2_6=1;
         P0=tab[X4];
           P2_7=0;
           YS(1);
           P2_7=1;
}

/********************** 外部中斷函數(shù)************************/
void exint0() interrupt 0
{          
   uint cnt;
   uchar i;

   EX0 = 0;
   cnt = 0;       
       
   while(!IR) cnt++;                               //記錄引導(dǎo)碼時(shí)間
   if(cnt < 1000){EX0=1;return;}                   //9ms的計(jì)數(shù)值(12MHz:1000< cnt <1500)
          
   cnt = 0;                         
   while(IR) if(cnt++ > 400){EX0=1;return;}        //防卡死,超時(shí)保護(hù)(12MHz: > 300)   
   if(cnt < 200){EX0=1;return;}                    //(12MHz不分頻: <260)            

   for(i=0; i<32; i++)                             //讀取32位位碼
       {
         cnt = 0;                                                                                                                                               
         while(!IR);                       
         while(IR) if(cnt++ > 200){EX0=1;return;}  //超時(shí)保護(hù)(12MHz:>=200)
         N[i/8] >>= 1;
         if(cnt>60) N[i/8] |= 0x80;                //0和1的計(jì)數(shù)界線(12MHz:< 109)   
       }

         if(N[0] == ~N[1] && N[2] == ~N[3])            //校驗(yàn)識(shí)別碼,操作碼       
           {
                   X1 = N[0]/16;
                   X2 = N[0]%16;
                   X3 = N[2]/16;
                   X4 = N[2]%16;
           }
                EX0 = 1;                 
}

/***************************************************************
函數(shù)功能:按鍵消抖    延時(shí)程序
入口參數(shù):1ms×time       (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
     uchar i,j;
         for(i=0; i<time; i++)
     for(j=0; j<247; j++)
        _nop_();
}





作者: yhfgdgr    時(shí)間: 2023-12-16 17:14
這兩個(gè)單片機(jī)的指令周期是不一樣的,計(jì)算時(shí)間的部分需要修改下。別的地方應(yīng)該不用怎么改
作者: yhfgdgr    時(shí)間: 2023-12-16 17:15
這兩個(gè)單片機(jī)的指令周期不一樣 ,你把計(jì)算時(shí)間的部分修改下就好啦
作者: lkc8210    時(shí)間: 2023-12-16 23:24
這種在中斷中死等的代碼
還是不要學(xué)比較好
作者: lkc8210    時(shí)間: 2023-12-16 23:28
stc15W408as有定時(shí)器2
可以直接用我的例程
http://www.torrancerestoration.com/bbs/dpj-225989-1.html
作者: 芙蓉焊料    時(shí)間: 2023-12-17 11:21
lkc8210 發(fā)表于 2023-12-16 23:28
stc15W408as有定時(shí)器2
可以直接用我的例程
http://www.torrancerestoration.com/bbs/dpj-225989-1.html

學(xué)習(xí)了,謝謝!
作者: man1234567    時(shí)間: 2023-12-18 09:30
這兩個(gè)單片機(jī)的速度是不一樣的,調(diào)適就好。
作者: wufa1986    時(shí)間: 2023-12-18 11:00
這程序你真的敢用嗎,在中斷寫一大堆功能,還有while
作者: 18680365301    時(shí)間: 2023-12-18 11:56
#include "IR.h"

/*
紅外5104
引導(dǎo)碼 4.5ms      高電平
Logic '0' 1.48ms  高電平
Logic '1' 2.43ms  高電平
*/

#define IR_STATUS_LOCK             0X01   //紅外鎖定
#define IR_STATUS_RECEIVE_OK       0X02   //紅外接收完成
#define IR_STATUS_KEY_UP           0X04   //紅外釋放
#define IR_STATUS_RECEIVE1_OK      0X08   //數(shù)據(jù)1接收完成
#define IR_STATUS_RECEIVE2_OK      0x10   //數(shù)據(jù)2接收完成
#define IR_STATUS_RECEIVE1_EN      0X20   //數(shù)據(jù)1接收允許
#define IR_STATUS_RECEIVE2_EN      0X40   //數(shù)據(jù)2接收允許

/************************************************變量聲明********************************************/
idata u8 Ir_Status;             //紅外狀態(tài)
idata u8 Ir_Receive_Bit_Count;  //紅外接收位計(jì)數(shù)
idata u8 Ir_H_Time;             //紅外高電平計(jì)數(shù)
idata u8 Ir_L_Time;             //紅外高電平計(jì)數(shù)
idata u16 Ir_Map;               //紅外映射
idata u16 Ir_Receive_Data0;
idata u16 Ir_Receive_Data1;
idata u16 Ir_Receive_Data2;
idata u16 Ir_Receive_Data3;
/**********************************************變量聲明結(jié)束******************************************/




/************************************************函數(shù)聲明********************************************/
void IR_Receive();
void IR_Key_Handle();
/**********************************************函數(shù)聲明結(jié)束******************************************/


/************************************************函數(shù)功能實(shí)現(xiàn)********************************************/
//功能:紅外解碼
//調(diào)用方式:125us中斷
void IR_Receive()
{
        if(IR_RECEIVE_IO)
        {
        if(Ir_H_Time < 0xff)
        {
            Ir_H_Time++;
            if((Ir_Status & IR_STATUS_LOCK) && (Ir_H_Time > 80))
            {
                Ir_Status &= ~(IR_STATUS_LOCK | IR_STATUS_RECEIVE1_OK | IR_STATUS_RECEIVE2_OK);
                Ir_Status |= IR_STATUS_KEY_UP;
            }
        }
        
        if(Ir_L_Time)
        {
            if(Ir_L_Time >= 15)
            {
                Ir_L_Time = 0;
                return ;
            }
            
            //接收第一個(gè)16位數(shù)據(jù)
            if(Ir_Status & IR_STATUS_RECEIVE1_EN)
            {
                Ir_Receive_Data0 <<= 1;
                if(Ir_L_Time > 5)
                {
                    Ir_Receive_Data0 |= 0x01;
                }
                Ir_Receive_Bit_Count++;
                if(Ir_Receive_Bit_Count >= 12)
                {
                    Ir_Status &= ~IR_STATUS_RECEIVE1_EN;
                    Ir_Status |= IR_STATUS_RECEIVE1_OK;
                }
            }
            
            //接收第二個(gè)16位數(shù)據(jù)
            if(Ir_Status & IR_STATUS_RECEIVE2_EN)
            {
                Ir_Receive_Data1 <<= 1;
                if(Ir_L_Time > 5)
                {
                    Ir_Receive_Data1 |= 0x01;
                }
                Ir_Receive_Bit_Count++;
                if(Ir_Receive_Bit_Count >= 12)
                {
                    Ir_Status &= ~IR_STATUS_RECEIVE2_EN;
                    if(Ir_Receive_Data0 == Ir_Receive_Data1)
                    {
                        Ir_Receive_Data2 = Ir_Receive_Data0;
                        Ir_Receive_Data3 = Ir_Receive_Data1;
                        Ir_Status |= IR_STATUS_LOCK | IR_STATUS_RECEIVE_OK | IR_STATUS_RECEIVE2_OK;
                        Ir_Map = 0;//快速響應(yīng)
                    }
                    else
                    {
                        //接收錯(cuò)誤重接收
                        Ir_Status &= ~(IR_STATUS_LOCK | IR_STATUS_RECEIVE1_OK | IR_STATUS_RECEIVE2_OK);
                    }
                }
            }
        }
        Ir_L_Time = 0;
        }
        else
        {
        Ir_L_Time++;
        if(Ir_H_Time > 12)//12 * 125 = 1500us
        {
            if((Ir_Status & IR_STATUS_RECEIVE1_OK) == 0)
            {
                Ir_Receive_Data0 = 0;
                Ir_Status |= IR_STATUS_RECEIVE1_EN;
            }
            else if((Ir_Status & IR_STATUS_RECEIVE2_OK) == 0)  
            {
                Ir_Receive_Data1 = 0;
                Ir_Status |= IR_STATUS_RECEIVE2_EN;
            }
            Ir_Receive_Bit_Count = 0;
        }
        Ir_H_Time = 0;
        }
}



//功能:紅外按鍵碼的功能處理
//調(diào)用方式:建議Main中10毫秒處理一次
void IR_Key_Handle()
{
    //紅外按鍵單次處理
    if(Ir_Status & IR_STATUS_RECEIVE_OK)
    {
        Ir_Status &= ~IR_STATUS_RECEIVE_OK;                  //清除IR接收成功標(biāo)志
        
        if(Ir_Receive_Data2 != Ir_Receive_Data3)
        {
            //兩次接收數(shù)據(jù)不相同不執(zhí)行按鍵處理
            return ;
        }
        
        //紅外按鍵映射到觸摸按鍵處理上
        switch(Ir_Receive_Data2)
        {
            case 0X0D81://開關(guān)
                Ir_Map |= KEY_POWER;
                break;
            case 0X0D90://擋位
                Ir_Map |= KEY_LEVEL;
                break;
            case 0X0D84://溫度
                Ir_Map |= KEY_TEMP;
                break;
            case 0X0D88://定時(shí)
                Ir_Map |= KEY_TIMING;
                break;
            case 0X0D82://童鎖
                Ir_Map |= KEY_IR_CHIP;
                break;
            default:
                Ir_Status &= ~(IR_STATUS_LOCK | IR_STATUS_RECEIVE1_OK | IR_STATUS_RECEIVE2_OK);
                break;
        }
    }
   
    //紅外按鍵釋放
    if(Ir_Status & IR_STATUS_KEY_UP)
    {
        Ir_Status &= ~IR_STATUS_KEY_UP;
        Ir_Map = 0;
    }
}

/**********************************************函數(shù)功能實(shí)現(xiàn)結(jié)束******************************************/





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1