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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

串口通信發送紅外遙控器解碼值

作者:寒竹子   來源:本站原創   點擊數:  更新時間:2014年03月31日   【字體:

本程序所用的原理圖下載: 點這里 ,單片機芯片使用的stc89c52;找到數碼管的原理圖即可.這是一整個單片機開發板的電路圖其他的忽略.


/**
  ***********************************************************************************************
  * @file       main.c
  * @author     xr
  * @date       2014年3月31日10:26:47
  * @version    V1.2.3
  * @brief      紅外通信 NEC協議進行紅外遙控器解碼 顯示用戶碼和鍵碼到數碼管上
  * @note       單片機STC89C52RC MCU 晶振 11.0592MHZ
  ***********************************************************************************************
  */
 
#include <reg52.h>

//紅外輸出數據口
sbit IRD = P3^3;//外部中斷引腳

bit irflag = 0;
unsigned char ircode[4];//接收解碼得到的數據

unsigned char code LedTable[] = { 
0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
                0x88,  //"A"
                0x83,  //"B"
                0xC6,  //"C"
                0xA1,  //"D"
                0x86,  //"E"
                0x8E   //"F"
};

unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//數碼管顯示緩沖區

unsigned char thr0, tlr0;

void ConfigTimer0(unsigned int xms);
void ConfigTimer1();

void main()
{
ConfigTimer0(1); //定時1ms
ConfigTimer1();

while (1)
{
if (irflag)//接收到紅外數據,則刷新顯示
{
LedBuff[5] = LedTable[ircode[0] >> 4];//取用戶碼的高4位字節
LedBuff[4] = LedTable[ircode[0] & 0x0F];//取用戶碼的低四位字節
LedBuff[1] = LedTable[ircode[2] >> 4];//取鍵碼的高四位
LedBuff[0] = LedTable[ircode[2] & 0x0F];//取鍵碼的低四位
}
}
}

/**
  * @brief    定時器T0配置
  * @param    定時時間xms
  * @retval   無
  */
void ConfigTimer0(unsigned int xms)
{
unsigned int tmp;
tmp = 65536-xms*11059200/12/1000;
thr0 = (unsigned char)(tmp >> 8);
tlr0 = (unsigned char)(tmp & 0x00FF);
TMOD &= 0xF0;
TMOD |= 0x01;//T0方式1
TH0 = thr0;
TL0 = tlr0;
TR0 = 1;
EA  = 1;
ET0 = 1;
//設置定時器T0的中斷優先級高于外部中斷的優先級
//IP中斷優先級寄存器 PT2 PS PT1 PX1 PT0 PX0
PT0 = 1;//提高T0的優先級,優先進行數碼管刷新,消除數碼管顯示抖動
}

/**
  * @brief    數碼管刷新
  * @param    無
  * @retval   無
  */
void refresh()
{
static unsigned char j = 0;

P0 = 0xFF;//消隱
P1 = (0x08 | j);//000 0 1 ADDR2 ADDR1 ADDR0
P0 = LedBuff[j++];
if (j >= 6)
j = 0;
}

/**
  * @brief    T0中斷服務
  * @param    無
  * @retval   無
  */
void Timer0_ISP() interrupt 1
{
TH0 = thr0;
TL0 = tlr0;
refresh();//數碼管刷新
}

/**********************紅外解碼*************************************/

/**
  * @brief    配置定時器T1,開啟外部中斷,T1用來計數
  * @param    無
  * @retval   無
  */
void ConfigTimer1()
{
TMOD &= 0x0F;//清零T1控制位
TMOD |= 0x10;//T1方式1
TH1 = 0;
TL1 = 0;//初始化計數值為0
TR1 = 0;//在沒有進入外部中斷前,先關閉定時器T1
ET1 = 0;//關閉T1中斷,只用來計數
IT1 = 1;//設置外部中斷為下降沿觸發中斷
EX1 = 1;//開啟外部中斷
}

/**
  * @brief    獲得高電平時間(空閑時間)
  * @param    無
  * @retval   無
  */
unsigned int getHeighTime()
{
//在檢測外部電平之前,先將紅外檢測引腳拉高釋放
IRD = 1;

TH1 = 0;
TL1 = 0;//重新清零
TR1 = 1;//打開定時器T1開始計數
while (IRD)
{
//進行超時判斷,若高電平時間大于9ms,即引導碼時間,則直接退出
if (TH1 > 0x40) //(0x40*256) * (12/11059200) s = 17.7ms
{
break;//退出
}
}
TR1 = 0;//關閉計數

return (TH1*256 + TL1);//返回IRD引腳持續的高電平時T1計數值
}

/**
  * @brief    獲取低電平時間(載波)
  * @param    無
  * @retval   無
  */
unsigned int getLowTime()
{
//釋放IRD檢測引腳
IRD = 1;
TH1 = 0;
TL1 = 0;//清零T1計數值
TR1 = 1;//啟動T1計數
while (!IRD)
{
if (TH1 > 0x40) //TL1計數滿則進位TH1,時間:TH1*256*12/11059200 s = 17.7ms
{ //時間大于了NEC協議的引導碼載波時間9ms,進行強制退出,避免假等待
break;
}
}
TR1 = 0;//關閉計數

return (TH1*256 + TL1);//返回低電平持續的計數值 每計數一次是一個機器周期的時間即1.08us
}

/**
  * @brief    外部中斷服務,檢測紅外信號
  * @param    無
  * @retval   無
  */
void ExINT_ISP() interrupt 2 //外部中斷1中斷標號為2
{
unsigned int time;//時間
unsigned char i, j;
unsigned char byte = 0;

time = getLowTime();//獲取低電平T1計數值,即引導碼的9ms載波
if ((time < 7833) || (time > 8755)) //范圍8.5-9.5ms X=0.0085/(12/11059200)
{
//錯誤引導碼
IE1 = 0;//清零外部中斷標志
return;//退出中斷
}
//符合引導碼的9ms
time = getHeighTime();//獲取高電平時間
if ((time < 3686) || (time > 4608)) //范圍4ms-5ms
{
//不是4.5ms的空閑
IE1 = 0;//清零外部中斷
return;//退出中斷
}
//是正確的引導碼
for (i = 0; i < 4; i++) //循環接收用戶碼 用戶反碼 鍵數值碼 鍵數值反碼
{
for (j = 0; j < 8; j++) //接收八位
{
//560us的載波(低電平)+560us的空閑(高電平) = 0 560us的載波(低電平)+1.68ms的空閑(高電平) = 1
time = getLowTime();//載波時間
if ((time < 322) || (time > 645)) //范圍350us-700us
{
IE1 = 0;//清零外部中斷標志
return;//退出中斷
}
time = getHeighTime();//空閑時間
if ((time > 322) && (time < 645)) //560us的空閑
{
//bit 0
byte >>= 1;//地位在前,先接收低位
}
else if ((time > 1198) && (time < 1658)) //1300us-1800us 1.68ms的空閑
{
//bit 1
byte >>= 1;
byte |= 0x80;//高位置1
}
else
{
//無效碼
IE1 = 0;
return;
}
}
ircode = byte;//接收數據
}
//全部接收完畢
irflag = 1;
IE1 = 0;//清零外部中斷標志位
}

關閉窗口

相關文章

主站蜘蛛池模板: 可以免费观看的av片 | 日韩成人在线视频 | 亚洲视频欧美视频 | 成人黄色网址大全 | 国产 日韩 欧美 中文 在线播放 | 玖玖国产精品视频 | 久久久久久久久国产 | 999久久久 | 色av一区| 一区二区三区电影在线观看 | 九九久久国产 | 亚洲国产精品va在线看黑人 | 天天曰天天曰 | 成人性视频免费网站 | 精品免费观看 | 国产精品永久久久久 | 国产精品久久久久久久久 | 国产精品久久久久久久久久久久久 | 国产日韩一区二区三免费高清 | www.青青草| 久久不卡| 久久久青草婷婷精品综合日韩 | 婷婷久久综合 | 国产精品亚洲视频 | 羞羞视频免费观 | 精品香蕉一区二区三区 | 久久一区二区视频 | 日韩欧美电影在线 | 精品国产1区2区3区 一区二区手机在线 | 国产成人高清成人av片在线看 | 中文字幕日韩欧美一区二区三区 | 国产一区三区在线 | 中文字幕 在线观看 | 久久久久国产一区二区 | 精品国产一级 | 日韩国产在线观看 | 国产精品日日摸夜夜添夜夜av | 天天欧美 | 人妖无码| 欧美久久久久久久久 | 免费看大片bbbb欧美 |