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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9262|回復: 8
打印 上一主題 下一主題
收起左側

昨晚上寫的AVR紅外遙控解碼代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:51090 發表于 2014-10-13 14:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/******************紅外遙控器解碼源代碼****************
編譯環境:ICCAVR
編譯人員:RJW
編譯時間:2013_01_10  06:36
代碼功能:實現紅外遙控器解碼,數碼管顯示用戶碼和數據碼

*******************************************************/
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
//定義外部中斷和定時器中斷
#progma interrupt_handler timer1:9
#progma interrupt_handler int0:2
//573使能端宏定義
#define DUAN    PA3
#define WEI     PA4
#define DUAN_OUT   DDRA |= BIT(DUAN)
#define DUAN_SET   PORTA |= BIT(DUAN)
#define DUAN_CLR   PORTA &= ~BIT(DUAN)
#define WEI_OUT   DDRA |= BIT(WEI)
#define WEI_SET   PORTA |= BIT(WEI)
#define WEI_CLR   PORTA &= ~BIT(WEI)
#progma data:code
    const uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
#progma data:code
    const uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//定義全局變量
uchar t_num=0,i_num=0,guide_ok=0,receive_ok=0;
//定義用來保存零時數據和編碼的數組
uchar time[33];
uchar code[4]={0x40,0x40,0x040,0x40};
/***********1us延時子函數***********
功能:用于延時1us
參數:無
返回值:無
******************************************/
void delay_1us()
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=3;a>0;a--);
}
/***********nus延時子函數***********
功能:用于延時nus
參數:z:代表延時時長,即本函數可延時范圍為:(0~65535us)
返回值:無
******************************************/
void delay_nus(int z)
{
     int i;
     for(i=z;i>0;i--)
     delay_1us();
}
/***********定時器中斷初始化函數***********
功能:設置定時器1中斷方式以及分頻情況
參數:無
返回值:無
******************************************/
void timer1_init()
{
    TCCR1B = 0x01;//設置外部中斷1無預分頻
    TCNT1H = 0xfb;
    TCNT1L = 0x4f;//設置定時時長為100US
    SREG |= BIT(7);//開啟總中斷
}
/***********外部中斷初始化函數***********
功能:設置外部中斷中斷方式以及開啟外部中斷
參數:無
返回值:無
******************************************/
void int0_init()
{
    MCUCR = 0x02;//設置外部中斷0下降沿觸發方式
    GICR = 0x40;//開啟外部中斷0中斷
    SREG |= BIT(7);//開啟總中斷
}
/***********定時器中斷服務程序***********
功能:用于定時器中斷時,計時變量加1
參數:無
返回值:無
******************************************/
void timer1()
{
    t_num++;
}
/***********外部中斷服務程序***********
功能:用于在響應外部中斷的情況下執行相應操作
參數:無
返回值:無
******************************************/
void int0()
{
    TIMSK |= BIT(2);//開啟定時器1中斷
    if(i_num==1)  //判斷是否是第二次外部中斷
   {
       if(t_num>80)//是否是引導碼
       {
            guide_ok=1; //是引導碼則標志1  
        }
        else
       {
            guide_ok=0;//不是引導碼則標志0
        }
    }
    if(guide_ok==1)    //如果是引導碼
    {
        time[i_num]=t_num; //將接收的各位數據保存
        t_num=0;         
        i_num++;
    }
    if(i_num==33)
    {
        i_num=0;
        guide_ok==0;    //清楚引導碼標志
        receive_ok=1;  //接收完成標志
    }
}
/***********紅外解碼函數***********
功能:將接收到的計時碼轉換為16進制碼
參數:無
返回值:無
******************************************/
void decode()
{
    uchar i,j,k=1,dat=0;
    for(i=0;i<4;i++)//循環4次取得用戶碼'用戶碼'數據碼'數據反碼
    {
        for(j=0;j<8;j++) //循環8次整合8個bit構成一個字節
        {
            dat>>=1;
            if(time[k]>17)  //PPM方式判斷該bit是0還是1
            {
                dat|=0x80;
            }
            k++;
         }
         code[i]=dat;   
     }
     k=0;
     receive_ok=0;
}
/***********數碼管顯示初始化函數***********
功能:設置數碼管段選位選為輸出模式
參數:無
返回值:無
******************************************/
void smg_init()
{
     DUAN_OUT;  //設置段選端為輸出模式
     WEI_OUT;   //設置位選端為輸出模式
     DDRB = 0xff;//設置數據端為輸出模式
}
/***********數碼管顯示函數***********
功能:用于顯示用戶碼和數據碼
參數:無
返回值:無
******************************************/
void smg_display()
{  
    uchar i,k=0;
    for(i=1;i<4;i++)
    {
        DUAN_SET;
        PORTB = duan[code[i]/10];   //將每個碼字節的數據高4位送入
        DUAN_CLR;

        WEI_SET;
        PORTB = wei[k];
        WEI_CLR;
        delay_nus(500);  //顯示駐留500us

        DUAN_SET;
        PORTB = duan[code[i]%10];   //將每個碼字節的數據低4位送入
        DUAN_CLR;

        WEI_SET;
        PORTB = wei[k+1];
        WEI_CLR;
        k=k+2;
        delay_nus(500);  //顯示駐留500us
     }
     k=0;
}
void main()
{
    smg_init();   //數碼管初始化
    timer1_init();//定時器1初始化
    int0_init();  //外部中斷0初始化
    while(1)
   {
       if(receive_ok==1)  //判斷33位數據是否接收完成
       {
           decode();      //完成接收開始解碼
       }
       smg_display();     //顯示
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:67366 發表于 2014-10-14 13:56 | 只看該作者
謝謝樓主
回復

使用道具 舉報

板凳
ID:72859 發表于 2015-1-27 10:57 | 只看該作者
樓主你也沒說你的avr是什么型號啊,晶振多少的,還有你的數碼管是怎么回事,一個數字9的十六進制還要高四位第四位讀寫嗎?
回復

使用道具 舉報

地板
ID:72859 發表于 2015-1-27 11:00 | 只看該作者
小泡泡 發表于 2015-1-27 10:57
樓主你也沒說你的avr是什么型號啊,晶振多少的,還有你的數碼管是怎么回事,一個數字9的十六進制還要高四位 ...

還有你的I_time++,在int0的中斷服務程序中何時才能為1,沒看到呢
回復

使用道具 舉報

5#
ID:75533 發表于 2015-3-28 19:36 | 只看該作者
好人!!受教了!!
回復

使用道具 舉報

6#
ID:85582 發表于 2015-8-3 14:53 | 只看該作者
樓主好人,一生平安
回復

使用道具 舉報

7#
ID:67705 發表于 2018-6-2 18:20 來自觸屏版 | 只看該作者
正需要,好人呀!
回復

使用道具 舉報

8#
ID:308958 發表于 2018-6-8 09:58 | 只看該作者
謝謝摟主無私奉獻!
回復

使用道具 舉報

9#
ID:373684 發表于 2018-7-21 17:00 | 只看該作者
控制什么的啊 ??樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人春色成人网 | 欧美中文字幕一区二区 | 日日夜夜精品视频 | 久久久青草婷婷精品综合日韩 | 嫩草视频在线看 | 日韩av一区二区在线观看 | 99精品免费| 日韩精品一区二区三区视频播放 | 黄色片免费 | 久久久精品视频免费看 | 日本中文字幕一区 | 啪一啪| 粉嫩av久久一区二区三区 | 看片网站在线 | 在线观看免费高清av | 午夜成人免费电影 | 亚洲精品久久 | 天天久久 | 国内精品久久精品 | 欧美性猛交一区二区三区精品 | 亚洲久久久 | 精品九九| 精品久久精品 | 国产精品一区二区久久 | 久久亚洲精品国产精品紫薇 | 国产午夜精品久久久久免费视高清 | 久久中文字幕一区 | 免费看黄色片 | 一级片成人 | 久久精品免费 | 欧美舔穴 | 欧美a区 | 亚洲精品一区二区三区在线 | 91久久精品一区二区二区 | 羞羞视频免费观 | 国产精品99一区二区 | 盗摄精品av一区二区三区 | 亚洲精品福利在线 | 精品久久国产 | 天天操天天操 | 欧洲在线视频 |