研究學習
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (47.01 KB, 下載次數(shù): 56)
下載附件
2022-3-18 03:36 上傳
代碼是用的VS Code編輯器
單片機源程序如下:
- //elecfun 2018-04-01 01:22:17
- #include <STC12C2052AD.h>
- #include <intrins.h>
- #include "IRNEC.h"
- unsigned char IR_KEY[6][3] = {0xFF};
- sbit KEY_SET = P3^7;
- #define _DEBUG
- #ifdef _DEBUG
- unsigned char code ITC[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
- //12mhz 4800bps
- void UART_init(void)
- {
- PCON |= 0x80; //波特率不倍速
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- TMOD &= 0x0F;
- TMOD |= 0x20;
- TL1 = TH1 = 0xF3;
- ET1 = 0;
- TR1 = 1;
- }
- void SendChar(unsigned char dat)
- {
- SBUF = dat;
- while (!TI);
- TI = 0;
- }
- void SendString(unsigned char *s)
- {
- while (*s) //Check the end of the string
- {
- SendChar(*s++); //Send current char and increment string ptr
- }
- }
- #endif
- /********************讀字節(jié)函數(shù)*********************/
- unsigned char Byte_Read(unsigned int add)
- {
- ISP_DATA = 0x00;//清空數(shù)據(jù)
- ISP_CONTR = 0x83;//打開ISP,設置操作等待時間 12MHz以下0x83 30MHz以下0x80 6MHz以下0x84
- ISP_CMD = 0x01;//字節(jié)讀命令
- ISP_ADDRH = add>>8;//設置高8位地址
- ISP_ADDRL = add&0x00ff;//設置低8位地址
- ISP_TRIG = 0x46;//發(fā)送46h到觸發(fā)寄存器
- ISP_TRIG = 0xb9;//發(fā)送b9h到觸發(fā)寄存器
- _nop_();//延時
- ISP_CONTR = 0;//關(guān)閉IAP 功能
- ISP_CMD = 0;//清空命令寄存器
- ISP_TRIG = 0;//清空命令觸發(fā)寄存器
- ISP_ADDRH = 0;//清空地址高位
- ISP_ADDRL = 0;//清空地址低位
- return (ISP_DATA);//返回讀到的數(shù)據(jù)
- }
- /*******************字節(jié)編程函數(shù)********************/
- void Byte_Program(unsigned int add, unsigned char dat)
- {
- ISP_CONTR = 0x83;//打開ISP,設置操作等待時間
- ISP_CMD = 0x02;//字節(jié)編程命令
- ISP_ADDRH = add>>8;//設置高8位地址
- ISP_ADDRL = add&0x00ff;//設置低8位地址
- ISP_DATA = dat;//要編程的數(shù)據(jù)先送進ISP_DATA 寄存器
- ISP_TRIG = 0x46;//發(fā)送46h到觸發(fā)寄存器
- ISP_TRIG = 0xb9;//發(fā)送b9h到觸發(fā)寄存器
- _nop_();//延時
- ISP_CONTR = 0;//關(guān)閉IAP 功能
- ISP_CMD = 0;//清空命令寄存器
- ISP_TRIG = 0;//清空命令觸發(fā)寄存器
- ISP_ADDRH = 0;//清空地址高位
- ISP_ADDRL = 0;//清空地址低位
- }
- /********************扇區(qū)擦除函數(shù)**********************/
- void Sector_Erase(unsigned int add)
- {
- ISP_CONTR = 0x83;//打開ISP,設置操作等待時間
- ISP_CMD = 0x03;//扇區(qū)擦除命令
- ISP_ADDRH = add>>8;//設置高8位地址
- ISP_ADDRL = add&0x00ff;//設置低8位地址
- ISP_TRIG = 0x46;//發(fā)送46h到觸發(fā)寄存器
- ISP_TRIG = 0xb9;//發(fā)送b9h到觸發(fā)寄存器
- _nop_();//延時
- ISP_CONTR = 0;//關(guān)閉IAP 功能
- ISP_CMD = 0;//清空命令寄存器
- ISP_TRIG = 0;//清空命令觸發(fā)寄存器
- ISP_ADDRH = 0;//清空地址高位
- ISP_ADDRL = 0;//清空地址低位
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數(shù):紅外線解碼初始化
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void IR_Init()
- {
- TMOD &= 0xF0; //清定時器0
- TMOD |= 0x01; //定時器0:16位定時器
- TL0 = TH_L; //每步時間
- TH0 = TH_H;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- void Delayms(unsigned int dT)
- {
- unsigned int dA,dB;
- for(dA=0; dA<dT; dA++)
- for(dB=0; dB<113; dB++)
- ;
- }
- //從內(nèi)部EEPROM中讀取鍵值數(shù)據(jù)
- void ReadIRData(void)
- {
- unsigned char j;
- for (j=0; j<6; j++)
- {
- IR_KEY[j][0] = Byte_Read(3 * j);
- IR_KEY[j][1] = Byte_Read(3 * j + 1);
- IR_KEY[j][2] = Byte_Read(3 * j + 2);
- }
- }
- //鍵值保存到內(nèi)部EEPROM中
- void WriteIRData(void)
- {
- unsigned char j;
- Sector_Erase(0);
- for (j=0; j<6; j++)
- {
- Byte_Program(3 * j, IR_KEY[j][0]);
- Byte_Program(3 * j + 1, IR_KEY[j][1]);
- Byte_Program(3 * j + 2, IR_KEY[j][2]);
- }
- }
- void main(void)
- {
- unsigned char j;
- unsigned char curCh = 0;
- #ifdef _DEBUG
- UART_init();
- Delayms(500);
- SendString("start");
- #endif
- ReadIRData(); //讀EEPROM數(shù)據(jù)
- IR_Init(); //紅外接收初始化
- while (1)
- {
- #ifdef _DEBUG
- P30 = 1;
- if (!P30)
- {
- ISP_CONTR = 0x60;
- }
- #endif
- if (IR_BT > 0) //正確解碼
- {
- SendString("R:");
- SendChar(ITC[NEC[2]>>4]);
- SendChar(ITC[NEC[2]&0x0F]);
- if (!KEY_SET) //設置按鍵按下
- {
- if (curCh < 6) //6個通道,超過后丟棄
- {
- IR_KEY[curCh][0] = NEC[0]; //用戶碼高8位
- IR_KEY[curCh][1] = NEC[1]; //用戶碼低8位
- IR_KEY[curCh][2] = NEC[2]; //鍵值
- curCh++; //下一通道
- }
- } else { //設置按鍵未按下或剛松開
- if (curCh > 0) //通道值大于0說明剛才進行了設置,需要保存鍵值
- {
- curCh = 0; //清空通道值
- WriteIRData(); //保存鍵值
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 代碼要用vs code打開
所有資料51hei附件下載:
仿真程序.7z
(66.89 KB, 下載次數(shù): 57)
2022-3-18 03:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|