• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)紅外接收解碼程序

    51單片機(jī)紅外接收解碼程序

    作者: 時(shí)間:2012-09-05 來源:網(wǎng)絡(luò) 收藏

    以S52作為系統(tǒng)。以S52的P3.3口作為端口,該端口是外部中斷1。

    本文引用地址:http://www.czjhyjcfj.com/article/170912.htm

    這個(gè)接受是以XC866作為發(fā)送控制系統(tǒng),接收如下:

    #includereg52.h> //頭文件
    #includeintrins.h>

    #define uchar unsigned char //宏定義
    #define uint unsigned int

    sbit HWRx=P3^3; //位聲明

    code uchar Table[]= //共陰數(shù)碼管 0-9 a-f - 表
    {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
    0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};

    uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于顯示的數(shù)組
    uchar Table_Rx[67];//用于存儲(chǔ)判斷接收是1或0的參數(shù)

    void Delay();//延時(shí)子函數(shù)

    void Display(uchar *lp,uchar lc)//顯示
    {
      uchar i; //定義變量
    P2=0; //端口2為輸出,關(guān)閉
    P1=P10xF8; //將P1口的前3位輸出0,對(duì)應(yīng)138譯門輸入腳,

    全0為第一位數(shù)碼管
    for(i=0;ilc;i++) //循環(huán)顯示,采用動(dòng)態(tài)掃描
    {
        P2=Table[lp[i]]; //查表法得到要顯示數(shù)字的數(shù)碼段
         if(lp[i]>0x7f)
        P2+=0x80;
        Delay(); //延時(shí)
        P2=0; //清0端口,準(zhǔn)備顯示下位
        if(i==7) //檢測(cè)顯示完8位否,完成直接退出,不讓P1口再加1,

    否則進(jìn)位影響到第四位數(shù)據(jù)
        break;
        P1++; //點(diǎn)亮下一位數(shù)碼管
    }
    }


    void main() //主函數(shù)
    {
    EA=1; //首先開啟總中斷
    EX1=1; //開啟外部中斷 1
    IT1=1; //設(shè)置成下降沿觸發(fā)方式

    while(1) //一直顯示,其它由中斷處理
    {
        Display(Table_Data,8);
    }

    }

    void Delay() //延時(shí)時(shí)間大約為31us,晶振12M
    {
    uchar i=13;
    while(i)
        i--;
    }

    void Delay_ms(uint z) //延時(shí)時(shí)間約為 1ms*X 晶振為12M
    {
    uint x=0,y=0;
    for(x=z;x>0;x--)
    for(y=54;y>0;y--);
    }
    void hongwai() interrupt 2 //外部中斷 1 ,INT1(P3^3)連接線接收IC數(shù)據(jù)腳
    {
    uchar i,j,tmp;
    EX1=0; //關(guān)閉中斷

    j=33; //傳送一組數(shù)包括引導(dǎo)碼1位,4個(gè)八位數(shù)據(jù),總共33位
    i=0; //從第一維數(shù)組開始

    Delay_ms(10);
    if(HWRx)
    { //然后再檢測(cè)紅線接收腳是有數(shù)據(jù)招收,有繼續(xù),沒有則退出
    EX1=1;
    return;
    }

    while(j--)
    { //循環(huán)接收33位數(shù)據(jù),為何我們用到66位數(shù)組,我們可以不接收高電平

    時(shí)間常數(shù),只接低電平常數(shù)就
    //可以判斷1或0了,在這里我們都接收,還有一點(diǎn)要知道,

    接收波形是反向,在沒有接收時(shí)端口為高電平
      tmp=0;
        Table_Rx[i]=1; //時(shí)間量從1開始
        while(!HWRx) //檢測(cè)高低電平的變化,這里檢測(cè)的是高電平
         {
         Table_Rx[i]++; //沒變繼續(xù)加1
         Delay(); //家一個(gè)延時(shí)防止,計(jì)數(shù)值一下子就加滿了
         tmp++; //加1
         if(tmp==250)
         break;
        }
        i++;

    tmp=0;
        Table_Rx[i]=1; //時(shí)間量從1開始
    while(HWRx) //檢測(cè)高低電平的變化,這里檢測(cè)的是低電平
        {
    Table_Rx[i]++; //沒變繼續(xù)加1
    Delay(); //同上
    tmp++; //加1,用于判斷是1還是0的,低電平來了
    if(tmp==250)
         break;
        }
    i++;
    }

    P1=0xf8;
    i=200; //加入循環(huán)延時(shí),抗干擾
    while(i) //在有接收數(shù)據(jù)的時(shí)候顯示一個(gè)H
    {
        tmp=255;
        while(tmp)
        {
         tmp--;
         P2=0x76;
        }
        i--;
      }

    tmp=0;
    for(i=3;i19;i++,i++) //處理發(fā)送的數(shù)據(jù)
    {
    tmp>>=1; //右移一位,接收低位在前
        if(Table_Rx[i]>30) //檢測(cè)低電平時(shí)間超過30就確認(rèn)為1
         tmp+=0x80;
    }
    Table_Data[0]=tmp/16; //分開2位以16進(jìn)制顯示,用顯示發(fā)送的數(shù)據(jù)
    Table_Data[1]=tmp%16;

    tmp=0;
    for(i=19;i35;i++,i++) //同上
    {
    tmp>>=1;
        if(Table_Rx[i]>30)
         tmp+=0x80;
      }
    Table_Data[2]=tmp/16;
    Table_Data[3]=tmp%16;

    tmp=0;
    for(i=35;i51;i++,i++)
    {
        tmp>>=1;
        if(Table_Rx[i]>30)
         tmp+=0x80;
    }
    Table_Data[4]=tmp/16;
    Table_Data[5]=tmp%16;

    tmp=0;
    for(i=51;i67;i++,i++)
    {
        tmp>>=1;
    if(Table_Rx[i]>30)
    tmp+=0x80;
    }
    Table_Data[6]=tmp/16;
    Table_Data[7]=tmp%16;
    EX1=1; //剛進(jìn)中斷時(shí)關(guān)閉了分控,現(xiàn)在要打開
    }

    51單片機(jī)相關(guān)文章:51單片機(jī)教程


    單片機(jī)相關(guān)文章:單片機(jī)教程


    單片機(jī)相關(guān)文章:單片機(jī)視頻教程


    單片機(jī)相關(guān)文章:單片機(jī)工作原理


    晶振相關(guān)文章:晶振原理


    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 花垣县| 玛纳斯县| 荥经县| 建瓯市| 巩留县| 安平县| 无棣县| 漳浦县| 伊宁市| 手游| 盐城市| 上蔡县| 弋阳县| 萍乡市| 康乐县| 曲靖市| 乌拉特后旗| 大邑县| 通化县| 故城县| 武夷山市| 寿阳县| 江都市| 阳西县| 依兰县| 成武县| 宜春市| 望江县| 禹城市| 鹿邑县| 南阳市| 汽车| 平南县| 陆丰市| 上栗县| 邹城市| 福贡县| 林甸县| 韶山市| 岳普湖县| 黄梅县|