新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)紅外遙控程序beta

        單片機(jī)紅外遙控程序beta

        作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏
        千辛萬(wàn)苦,終于把這個(gè)完成了。不錯(cuò)不錯(cuò)。現(xiàn)在的問(wèn)題就在上板子上測(cè)試了。剛才發(fā)了,發(fā)現(xiàn)"/""*""*""/"居然被屏蔽了。標(biāo)注只能用兩個(gè)杠杠表示。為了以后更好的發(fā)布,我寫(xiě)程序注釋的時(shí)候盡量用雙斜杠。

        #include
        #define uchar unsigned char
        #define uint unsigned int

        本文引用地址:http://www.104case.com/article/201611/320670.htm

        uchar code table[]={
        0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71}; //定義數(shù)字顯示

        sbit remote=P3^3;//定義中斷源外中斷3.3

        int count=0;//定義全局變量計(jì)數(shù)計(jì)時(shí)器
        bit get_over;//定義讀取數(shù)據(jù)結(jié)束
        int dat[33],ircode[4]; //第一個(gè)是直接讀取數(shù)據(jù),第二個(gè)是解碼之后的數(shù)據(jù)

        void ini_rem(void); //遙控器的初始化
        void ini_other(void); //其他設(shè)定初始化
        void exchange(void); //編碼轉(zhuǎn)換
        //void timer0(void) interrupt 0 //計(jì)時(shí)器0中斷,計(jì)時(shí)計(jì)算上升沿個(gè)數(shù)來(lái)測(cè)定1,0,和開(kāi)始結(jié)束碼
        //void ex_rem(void) interrupt 4 //外中斷1,通過(guò)上升沿來(lái)讓定時(shí)器計(jì)時(shí)
        void dis(void);//顯示函數(shù)
        void delay(uint z); //顯示延時(shí)函數(shù)
        main()
        {
        ini_other();
        ini_rem();
        while(1)
        {
        if(get_over==1)
        {
        exchange();
        dis();
        get_over=0;
        }
        }
        }

        void ini_other()
        {
        EA=1; //總中斷



        ET0=1; //定時(shí)器0中斷
        TR0=1; //定時(shí)器0中斷
        TMOD=0X01; //定時(shí)器狀態(tài) 定時(shí)器0方式1,16位計(jì)數(shù)器
        TH0=(65535-300)/256; //初值設(shè)定為300us=0.30ms
        TL0=(65535-300)%6;



        EX1=1; //開(kāi)啟外部中斷 1
        IT1=1; // 設(shè)置成 下降沿觸發(fā)方式 (為0時(shí)為低電平觸發(fā))
        PX1=1;//將外中斷設(shè)置為高優(yōu)先級(jí)
        }

        ex_rem(void) interrupt 2
        {
        bit flag;
        int i=0;
        EX1=0;


        if(flag)
        {

        if(count>=27&&count<=33)// 引導(dǎo)碼接受成功
        {
        i=0;//給計(jì)數(shù)標(biāo)志位
        }

        dat[i]=count;//將計(jì)時(shí)數(shù)存入,備用處理
        count=0;//計(jì)數(shù)清零
        i++;//下一次的計(jì)時(shí)數(shù)

        if(i==33)//如果一次信號(hào)32位全部OK
        {
        i=0;//給計(jì)數(shù)標(biāo)志位
        get_over=1;//置計(jì)數(shù)標(biāo)志
        }
        else
        {
        count=0;//否則計(jì)數(shù)清零,置標(biāo)志位,繼續(xù)
        flag=1;
        }
        }
        EX1=1;
        }

        void timer0(void) interrupt 1
        {
        TH0=(65535-500)/256;
        TL0=(65535-500)%6;
        //TMOD=0X01;
        count++;

        }

        void exchange(void) //編碼子程序從第三個(gè)數(shù)據(jù)開(kāi)始
        {
        unsigned char i,j,k,val,tmp1;

        k=1;


        for(i=0;i<4;i++)
        {
        for(j=0;j<8;j++)

        {
        tmp1=dat[k];

        if(tmp1>4)
        val=val|0x80;
        else val=val;

        if(j<8)
        val=val>>1;

        k++;
        }

        ircode[i]=val;
        val=0;
        }
        }

        void dis() //顯示子程序 OK
        {
        P1=0XF0;
        P2=table[ircode[2]/10];
        delay(1);
        P1=0xF1;
        P2=table[ircode[2]];
        delay(1);

        }

        void delay(uint z) //延時(shí)子函數(shù)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }




        關(guān)鍵詞: 單片機(jī)紅外遙控bet

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 崇阳县| 涪陵区| 宝清县| 平原县| 沙洋县| 澄迈县| 昌图县| 长阳| 榆树市| 湖北省| 乐平市| 霍山县| 许昌市| 温州市| 抚远县| 芮城县| 遵化市| 温宿县| 余庆县| 临湘市| 滦平县| 连南| 盐亭县| 潞城市| 北川| 肥东县| 永宁县| 丹江口市| 历史| 许昌县| 苍梧县| 神池县| 敦化市| 惠水县| 南投县| 镇江市| 义乌市| 晋江市| 石门县| 大冶市| 武汉市|