欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

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

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

想利用單片機(jī)制作一個(gè)遙控器,問(wèn)題求解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:968724 發(fā)表于 2021-11-5 18:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
/************* 發(fā)送脈沖函數(shù) **************/
void        IR_TxPulse(u16 pulse)
{
        tx_cnt = pulse;
        B_Space = 0;        //發(fā)脈沖
        CCAPM2 = 0x48 | 0x04 | 0x01;        //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
        CR = 1;                //啟動(dòng)
        while(CR);
        P_IR_TX = IR_TX_OFF;
}

代碼中 CCAPM2   有什么用求解   在代碼中也沒(méi)看見(jiàn)CCAP2L 和CCAP2H 附值  搞不懂這段有什么用   求大神指點(diǎn)



以下是下載的代碼
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧撕昃Э萍嫉馁Y料及程序   */
/*---------------------------------------------------------------------*/



/*************        本程序功能說(shuō)明        **************


用戶可以在宏定義中改變MCU主時(shí)鐘頻率. 范圍 8MHZ ~ 33MHZ.

紅外接收程序。模擬市場(chǎng)上用量最大的NEC的編碼。

用戶可以在宏定義中指定用戶碼.

使用PCA0軟件定時(shí)產(chǎn)生38KHZ載波, 1/3占空比, 每個(gè)38KHZ周期發(fā)射管發(fā)射9us,關(guān)閉16.3us.

使用開(kāi)發(fā)板上的16個(gè)IO掃描按鍵, MCU不睡眠, 連續(xù)掃描按鍵.

當(dāng)鍵按下, 第一幀為數(shù)據(jù), 后面的幀為重復(fù)爭(zhēng),不帶數(shù)據(jù), 具體定義請(qǐng)自行參考NEC的編碼資料.

鍵釋放后, 停止發(fā)送.

******************************************/

#define         MAIN_Fosc                22118400UL        //定義主時(shí)鐘

#include        "STC15Fxxxx.H"


/*************        紅外發(fā)送相關(guān)變量        **************/
#define        User_code        0xFF00                //定義紅外用戶碼

sbit        P_IR_TX   = P3^7;        //定義紅外發(fā)送端口
#define        IR_TX_ON        0
#define        IR_TX_OFF        1

u16                PCA_Timer0;        //PCA2軟件定時(shí)器變量
bit                B_Space;        //發(fā)送空閑(延時(shí))標(biāo)志
u16                tx_cnt;                //發(fā)送或空閑的脈沖計(jì)數(shù)(等于38KHZ的脈沖數(shù),對(duì)應(yīng)時(shí)間), 紅外頻率為38KHZ, 周期26.3us
u8                TxTime;                //發(fā)送時(shí)間


/*************        IO口定義        **************/
sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock

/*************        IO鍵盤變量聲明        **************/

u8        IO_KeyState, IO_KeyState1, IO_KeyHoldCnt;        //行列鍵盤變量
u8        KeyHoldCnt;        //鍵按下計(jì)時(shí)
u8        KeyCode;        //給用戶使用的鍵碼, 1~16有效


/*************        本地函數(shù)聲明        **************/
void        delay_ms(u8 ms);
void        DisableHC595(void);
void        IO_KeyScan(void);
void        PCA_config(void);
void        IR_TxPulse(u16 pulse);
void        IR_TxSpace(u16 pulse);
void        IR_TxByte(u8 dat);




/********************** 主函數(shù) ************************/
void main(void)
{
        P0M1 = 0;        P0M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P2M1 = 0;        P2M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P3M1 = 0;        P3M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P4M1 = 0;        P4M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P5M1 = 0;        P5M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P6M1 = 0;        P6M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        P7M1 = 0;        P7M0 = 0;        //設(shè)置為準(zhǔn)雙向口
        
        PCA_config();
        P_IR_TX = IR_TX_OFF;
        
        EA = 1;                                                //打開(kāi)總中斷
        
        DisableHC595();                //禁止掉學(xué)習(xí)板上的HC595顯示,省電

        while(1)
        {
                delay_ms(30);                //30ms
                IO_KeyScan();

                if(KeyCode != 0)                //檢測(cè)到鍵碼
                {
                        TxTime = 0;
                                                                //一幀數(shù)據(jù)最小長(zhǎng)度 = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
                                                                //一幀數(shù)據(jù)最大長(zhǎng)度 = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
                        IR_TxPulse(342);        //對(duì)應(yīng)9ms,同步頭                9ms
                        IR_TxSpace(171);        //對(duì)應(yīng)4.5ms,同步頭間隔        4.5ms
                        IR_TxPulse(21);                //開(kāi)始發(fā)送數(shù)據(jù)                        0.5625ms

                        IR_TxByte(User_code%256);        //發(fā)用戶碼低字節(jié)
                        IR_TxByte(User_code/256);        //發(fā)用戶碼高字節(jié)
                        IR_TxByte(KeyCode);                        //發(fā)數(shù)據(jù)
                        IR_TxByte(~KeyCode);                //發(fā)數(shù)據(jù)反碼
                        
                        if(TxTime < 56)                //一幀按最大77ms發(fā)送, 不夠的話,補(bǔ)償時(shí)間                108ms
                        {
                                TxTime = 56 - TxTime;
                                TxTime = TxTime + TxTime / 8;
                                delay_ms(TxTime);
                        }
                        delay_ms(31);

                        while(IO_KeyState != 0)        //鍵未釋放
                        {
                                IR_TxPulse(342);        //對(duì)應(yīng)9ms,   同步頭                9ms
                                IR_TxSpace(86);                //對(duì)應(yīng)2.25ms,同步頭間隔        2.25ms
                                IR_TxPulse(21);                //開(kāi)始發(fā)送數(shù)據(jù)                                 0.5625ms
                                delay_ms(96);
                                IO_KeyScan();
                        }
                        KeyCode = 0;
                }
        }
}
/**********************************************/

//========================================================================
// 函數(shù): void  delay_ms(unsigned char ms)
// 描述: 延時(shí)函數(shù)。
// 參數(shù): ms,要延時(shí)的ms數(shù), 這里只支持1~255ms. 自動(dòng)適應(yīng)主時(shí)鐘.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 備注:
//========================================================================
void  delay_ms(u8 ms)
{
     u16 i;
         do{
              i = MAIN_Fosc / 13000;
                  while(--i)        ;   //13T per loop
     }while(--ms);
}



void DisableHC595(void)
{               
        u8        i;
        P_HC595_SER   = 1;
        for(i=0; i<20; i++)
        {
                P_HC595_SRCLK = 1;
                P_HC595_SRCLK = 0;
        }
        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;                                                        //鎖存輸出數(shù)據(jù)
        P_HC595_RCLK = 1;
        P_HC595_RCLK = 0;                                                        //鎖存輸出數(shù)據(jù)
}


/*****************************************************
        行列鍵掃描程序
        使用XY查找4x4鍵的方法,只能單鍵,速度快

   Y     P04      P05      P06      P07
          |        |        |        |
X         |        |        |        |
P00 ---- K00 ---- K01 ---- K02 ---- K03 ----
          |        |        |        |
P01 ---- K04 ---- K05 ---- K06 ---- K07 ----
          |        |        |        |
P02 ---- K08 ---- K09 ---- K10 ---- K11 ----
          |        |        |        |
P03 ---- K12 ---- K13 ---- K14 ---- K15 ----
          |        |        |        |
******************************************************/


u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

void IO_KeyDelay(void)
{
        u8 i;
        i = 60;
        while(--i)        ;
}

void        IO_KeyScan(void)        //50ms call
{
        u8        j;

        j = IO_KeyState1;        //保存上一次狀態(tài)

        P0 = 0xf0;        //X低,讀Y
        IO_KeyDelay();
        IO_KeyState1 = P0 & 0xf0;

        P0 = 0x0f;        //Y低,讀X
        IO_KeyDelay();
        IO_KeyState1 |= (P0 & 0x0f);
        IO_KeyState1 ^= 0xff;        //取反
        
        if(j == IO_KeyState1)        //連續(xù)兩次讀相等
        {
                j = IO_KeyState;
                IO_KeyState = IO_KeyState1;
                if(IO_KeyState != 0)        //有鍵按下
                {
                        F0 = 0;
                        if(j == 0)        F0 = 1;        //第一次按下
                        else if(j == IO_KeyState)
                        {
                                if(++IO_KeyHoldCnt >= 20)        //1秒后重鍵
                                {
                                        IO_KeyHoldCnt = 18;
                                        F0 = 1;
                                }
                        }
                        if(F0)
                        {
                                j = T_KeyTable[IO_KeyState >> 4];
                                if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
                                        KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16;        //計(jì)算鍵碼,17~32
                        }
                }
                else        IO_KeyHoldCnt = 0;
        }
        P0 = 0xff;
}



/************* 發(fā)送脈沖函數(shù) **************/
void        IR_TxPulse(u16 pulse)
{
        tx_cnt = pulse;
        B_Space = 0;        //發(fā)脈沖
        CCAPM2 = 0x48 | 0x04 | 0x01;        //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
        CR = 1;                //啟動(dòng)
        while(CR);
        P_IR_TX = IR_TX_OFF;
}

/************* 發(fā)送空閑函數(shù) **************/
void        IR_TxSpace(u16 pulse)
{
        tx_cnt = pulse;
        B_Space = 1;        //空閑
        CCAPM2 = 0x48 | 0x01;        //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
        CR = 1;                //啟動(dòng)
        while(CR);
        P_IR_TX = IR_TX_OFF;
}


/************* 發(fā)送一個(gè)字節(jié)函數(shù) **************/
void        IR_TxByte(u8 dat)
{
        u8 i;
        for(i=0; i<8; i++)
        {
                if(dat & 1)                IR_TxSpace(63),        TxTime += 2;        //數(shù)據(jù)1對(duì)應(yīng) 1.6875 + 0.5625 ms
                else                        IR_TxSpace(21),        TxTime++;                //數(shù)據(jù)0對(duì)應(yīng) 0.5625 + 0.5625 ms
                IR_TxPulse(21);                        //脈沖都是0.5625ms
                dat >>= 1;                                //下一個(gè)位
        }
}

//========================================================================
// 函數(shù): void        PCA_config(void)
// 描述: PCA配置函數(shù).
// 參數(shù): None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void        PCA_config(void)
{
        //  PCA0初始化
        CCON = 0x00;        //清除所有中斷標(biāo)志
        CCAPM0  = 0x48 | 0x01;        //工作模式 + 中斷允許 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
        PCA_Timer0 = 100;                //隨便給一個(gè)小的初值
        CCAP0L = (u8)PCA_Timer0;        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
        CCAP0H = (u8)(PCA_Timer0 >> 8);        //后寫CCAP0H

        PPCA = 1;        //高優(yōu)先級(jí)中斷
        CMOD  = (CMOD  & ~0xe0) | 0x08;        //選擇時(shí)鐘源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
        CH = 0;
        CL = 0;
        CR = 0;
        tx_cnt = 2;
}

//========================================================================
// 函數(shù): void        PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中斷處理程序.
// 參數(shù): None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================

#define        D_38K_DUTY        ((MAIN_Fosc * 26) / 1000000UL + MAIN_Fosc / 3000000UL)        /*         38KHZ周期時(shí)間        26.3us */
#define        D_38K_OFF        ((MAIN_Fosc * 17) / 1000000UL + MAIN_Fosc / 3000000UL)        /* 發(fā)射管關(guān)閉時(shí)間        17.3us */
#define        D_38K_ON        ((MAIN_Fosc * 9) / 1000000UL)                                                        /* 發(fā)射管導(dǎo)通時(shí)間        9us */

void        PCA_Handler (void) interrupt PCA_VECTOR
{
        CCON = 0x40;        //清除所有中斷標(biāo)志,但不關(guān)CR
        if(!B_Space)        //發(fā)送載波
        {                                                                //發(fā)送脈沖,交替裝載TH0值,溢出時(shí)自動(dòng)重裝
                P_IR_TX = ~P_IR_TX;
                if(P_IR_TX)
                {
                        PCA_Timer0 += D_38K_OFF;        //裝載高電平時(shí)間        17.3us
                        if(--tx_cnt == 0)        CR = 0;        //pulse has sent,        stop
                }
                else        PCA_Timer0 += D_38K_ON;        //裝載低電平時(shí)間        9us
        }
        else        //發(fā)送暫停時(shí)間
        {
                PCA_Timer0 += D_38K_DUTY;        //裝載周期時(shí)間        26.3us
                if(--tx_cnt == 0)        CR = 0;        //空閑時(shí)間
        }
        CCAP0L = (u8)PCA_Timer0;                        //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
        CCAP0H = (u8)(PCA_Timer0 >> 8);        //后寫CCAP0H
}


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

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-11-5 20:51 | 只看該作者
代碼中的注釋不是注明了么?

0x48 : 當(dāng)定時(shí)器用。

至于,沒(méi)有看到 CCAP2L 和CCAP2H  的賦值兩個(gè)可能,可能1,只需要0就可以了。可能2,CCAP2的設(shè)置,因?yàn)榉N種原因放棄了。但是代碼沒(méi)有刪除干凈。

最后,遙控器,那么簡(jiǎn)單的一個(gè)功能,有必要搞CCAP么? 不做學(xué)習(xí)型的話,連定時(shí)器都可以不用。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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