Altium Designer畫的ESP8266自學習紅外遙控原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (50.69 KB, 下載次數: 74)
下載附件
2019-4-13 02:39 上傳
0.png (63.87 KB, 下載次數: 61)
下載附件
2019-4-13 02:39 上傳
0.png (4.15 KB, 下載次數: 67)
下載附件
2019-4-13 02:39 上傳
ESP8266單片機源程序如下:
- #include "stc12c2052ad.h"
- #include "wifi_IR.h"
- #include <intrins.h>
- //#define ENABLE_IAP 0x83 //if SYSCLK<20MHz
- #define FOSC 11059200UL//12M晶振
- #define CMD_IDLE 0 //Stand-By
- #define CMD_READ 1 //Byte-Read
- #define CMD_PROGRAM 2 //Byte-Program
- #define CMD_ERASE 3 //Sector-Erase
- uint addr;//EPPROM地址
- //uchar cou;
- bit study_send_switch,LED_state;
- void SaveLevelTimeLength(uint addr);//存儲電平時長
- void IrSend();//紅外發射
- void Read_Key();
- void IrStudy();
- void IapIdle();
- void byte_write(uint addr, uchar dat);
- void SectorErase(uint sector_addr);
- uchar byte_read(uint addr);
- void TIMER0_RELOAD(uint addr)//裝入定時器
- {
- TR0=0;
- TF0=0;
- TH0=byte_read(addr);//從指定的地址讀出電平的長度
- TL0=byte_read(addr+1);//從指定的地址讀出電平的長度
- TR0=1;//啟動定時器
- }
- //---------------------------------------------------
- void IrSend()//紅外發射
- {
- uchar level_cnt; //電平個數
- level_cnt=byte_read(addr);//讀出電平個數
- addr++;//地址后移一位
- while (1)
- {
- F38_4KHZ_ON();//因為紅外碼大部分都是起始一段高電平,所以此處一開始就打開。
- TIMER0_RELOAD(addr);//時長裝入定時器,開始計時
- addr+=2;// 地址移到沒有取過的地方,TIMER0_RELOAD函數取了兩個地址的數據
- while (!TF0);//等待定時器0溢出
-
- if(level_cnt--==0)break;//判斷是否取完
- F38_4KHZ_OFF(); IR_SEND = 1;//停止發射
- TIMER0_RELOAD(addr);//時長裝入定時器,開始計時
- addr+=2;//地址移到沒有取過的地方,TIMER0_RELOAD函數取了兩個地址的數據
- while (!TF0);//等待定時器0溢出
- if(level_cnt--==0)break;//電平數是否完畢
- }
- F38_4KHZ_OFF(); IR_SEND = 1;//停止發射
- }
- //---------------------------------------------------
- void SaveLevelTimeLength(uint addr)//存電平時長
- {
- TR0=0;
- byte_write(addr, ~TH0);
- byte_write(addr+1, ~TL0); //電平時長存入eeprom中
- TH0=0;//定時器初值歸0
- TL0=0x65;//查手冊知道,編程一個字節需要55us,編程兩個字節,所以此處需要110us。
- TR0=1;//開始計數
- }
- void IrStudy()
- {
- uint level_cnt;
- uint addrtmp;
- TF0 = 0;
- SectorErase(addr);
- addrtmp=addr;//記錄第一個地址,存儲電平個數
- addr++;
- TR0=0;//停止計數
- while (IR_REV);//等待紅外接收管腳為低電平
- //編碼與解碼是一對逆過程,不僅在原理上是一對逆過程,在碼的發收過程也是互反的,即以前發射端原始信號是高電平,那接收頭輸出的就是低電平
- TH0=0;
- TL0=0;
- TR0=1;//開啟定時器
-
-
- while (1)
- {
- while (!IR_REV) //等待高電平,等待超時;超過70MS退出
- {
- if (TF0)
- {
- goto StudyFinish;
- }
-
- }
-
- SaveLevelTimeLength(addr); //高電平到來,存低電平時長到eeprom}
- level_cnt++;
- addr += 2;
-
- while (IR_REV) //等待低電平,等待超時;超過70MS退出
- {
- if (TF0)
- {
- goto StudyFinish;
- }
- }
- SaveLevelTimeLength(addr);//低電平到來存高電平電平時長
- level_cnt++;//存儲的電平個數加11
- addr+=2;//地址后移兩位
- }
- StudyFinish:
- TF0=0;
- TR0=0;
- byte_write(addrtmp,level_cnt);
- level_cnt = 0;
- }
- void Delay100ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void IapIdle()
- {
- IAP_CONTR = 0; //Close IAP function
- IAP_CMD = 0; //Clear command to standby
- IAP_TRIG = 0; //Clear trigger register
- IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area
- IAP_ADDRL = 0; //Clear IAP address to prevent misuse
- }
- /************************************************************************
- 函數名稱:字節寫
- 全局變量:無
- 參數說明:addr:寫入地址, dat:寫入數據
- ************************************************************************/
- void byte_write(uint addr,uchar dat)
- {
- IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
- IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command
- IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
- IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
- IAP_DATA = dat; //Write ISP/IAP/EEPROM data
- IAP_TRIG = 0x46; //Send trigger command1 (0x46)
- IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- IapIdle();
- }
- /************************************************************************
- 函數名稱:扇區擦除
- 全局變量:無
- 參數說明:sector_addr:扇區地址
- ************************************************************************/
- void SectorErase(uint addr)
- {
- IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
- IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command
- IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
- IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
- IAP_TRIG = 0x46; //Send trigger command1 (0x46)
- IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- IapIdle();
- }
- /************************************************************************
- 函數名稱:字節讀函數
- 全局變量:無
- 參數說明:addr:所要讀取的地址
- 返回說明:讀取到的數據
- ************************************************************************/
- uchar byte_read(uint addr)
- {
- uchar dat; //Data buffer
- IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
- IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command
- IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
- IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
- IAP_TRIG = 0x46; //Send trigger command1 (0x46)
- IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- dat = IAP_DATA; //Read ISP/IAP/EEPROM data
-
- IapIdle();
- return dat; //Return Flash data
- }
- /*****************************
- 主程序
- ******************************/
- void main()
- {
- uchar i;
- /***********************************按復位鍵下載***********************************************************/
- if((PCON&0x10)==0) //如果POF位=0 不是上電復位
- { PCON=PCON|0x10; //將POF位置1 此處置1是為了下一條語句復位的時候不進入此函數
- ISP_CONTR=0x60; //軟復位,從ISP監控區啟動 復位完成 ISP_CONTR 寄存器的值是多少???
- }
- else
- {
- PCON=PCON&0xef; //將POF位清零
- }
- /***********************************按復位鍵下載***********************************************************/
-
- wifi_power = 0;
- IR_REV = 1;
-
- P1M0 = 0;
-
- P1M1 = 0x02; //定義P1.1為推挽輸出
-
- P3M0 = 0;
-
- P3M1 = 0xA0; //定義P3.5 P3.7為推挽輸出
-
- SW_WIFI_DL = 1;
-
- TIMER0_INIT();
- serial_init();
- DEBUG_LED = 1;
-
- while(1)
- {
- PCON = 0X01;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- r_string();
- if(r_comp == 1)
- {
- r_comp = 0;
-
- if(tp[0] == 0)
- {
- study_send_switch = 1; //學習狀態
- }
-
- else if(tp[0] == 0x15)
- {
- study_send_switch = 0; //發射狀態
- }
- else if(tp[0] == 0x16)
- {
- HS0038_power = 1;
- wifi_power = 1;
- IR_SEND = 1;
-
- PCON=2;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
-
- }
- else
- {
- EA = 0;
-
- switch(tp[0])
- {
-
- // case 0x00: study_send_switch = !study_send_switch;break;
- case 0x01: addr = 0; break;
- case 0x02: addr = 0x200; break;
- case 0x03: addr = 0x400; break;
- case 0x04: addr = 0x600; break;
- case 0x05: addr = 0x800; break;
- case 0x06: addr = 0xa00; break;
- case 0x07: addr = 0xc00; break;
- case 0x08: addr = 0xe00; break;
- case 0x09: addr = 0x1000;break;
- case 0x0a: addr = 0x1200;break;
- case 0x0b: addr = 0x1400;break;
- case 0x0c: addr = 0x1600;break;
- case 0x0d: addr = 0x1800;break;
- case 0x0e: addr = 0x1a00;break;
- case 0x0f: addr = 0x1c00;break;
- case 0x10: addr = 0x1e00;break;
- case 0x11: addr = 0x2000;break;
- case 0x12: addr = 0x2200;break;
- case 0x13: addr = 0x2400;break;
- case 0x14: addr = 0x2600;break;
-
-
- default: addr = 0x8000;break;
-
- }
-
- if(study_send_switch)
- {
- HS0038_power = 0;
-
- for(i = 0;i < 5;i++)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
wifi紅外學習遙控源代碼V1.0.zip
(13.48 KB, 下載次數: 207)
2019-4-12 16:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
wifi紅外遙控PCB工程V1.0.zip
(437.44 KB, 下載次數: 201)
2019-4-12 16:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|