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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求解——紅外解碼,鍵碼數碼管顯示問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:88716 發表于 2015-9-24 13:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*******************************infrared************************************/
#include <reg52.h>

sbit IR_INPUT = P3^2;  //紅外接收引腳

bit irflag = 0;  //紅外接收標志,收到一幀正確數據后置1
unsigned char ircode[4];  //紅外代碼接收緩沖區

void InitInfrared()
{       
        IR_INPUT = 1;    //釋放紅外引腳
        TMOD &= 0X0F;
        TMOD |= 0x10;         //配置定時器1定時1模式
        TR1 = 0;
        ET0 = 0;
        IT0 = 1;                  //外部 *下降沿* 產生外部中斷
        EX0 = 1;
}
/*獲取當前高電平的持續時間*/
unsigned int GetHighTime()                 
{
        TH1 = 0;
        TL1 = 0;
        TR1 = 1;
        while(IR_INPUT)                     //當紅外引腳為1時,循環檢測等待,變為0時,
        {                                                 //則結束本循環
                if(TH1 > 0x40)                 //當T1大于0x40即高電平持續時間超過約18ms時,強制退出循環,
                {                                         //是為了避免信號異常是,程序假死在這里
                        break;
                }
        }
        TR1 = 0;

        return(TH1 * 256 + TL1);
}
/*獲取當前低電平的持續時間*/
unsigned int GetLowTime()
{
        TH1 = 0;
        TL1 = 0;
        TR1 = 1;
        while(!IR_INPUT)
        {
                if(TH1 > 0x40)
                {
                        break;
                }
        }
        TR1 = 0;

        return(TH1 * 256 + TL1);
}
/*外部中斷INT1中斷服務程序,執行紅外接收及解碼*/
void EXINT0_ISR() interrupt 0
{
        unsigned char i, j;
        unsigned int time;
        unsigned char byt;

        time = GetLowTime();                                   //接收并判定引導碼的9ms低電平
        if((time <7833) || (time > 8755))          //時間在8.5-9.5ms內,如果不在范圍內,關閉外部中斷,即關閉紅外接收,退出檢測
        {
                IE0 = 0;
                return;       
        }

        time = GetHighTime();                             //接收并判定引導碼4.5ms
        if((time<3686) || (time > 4608))   //如果接收高電平的時間不在4ms-5ms之間
        {                                                                  
                IE0= 0;                                           //關閉外部中斷,退出紅外檢測
                return;
        }
        for(i=0; i<4; i++)                                 //如果滿足上述引導碼電平時間要求,進入數據0,1判定
        {
                for(j=0; j<8; j++)                         //循環8次,獲取1 個字節
                {
                        time = GetLowTime();          //獲取低電平時間
                        if((time<313) ||(time >718))         //判斷電平時間是否在340us-780之內,因為比特值0:560us+560us的空閑
                        {                                                                 //如果不滿足要求,退出外部中斷服務程序
                                IE0 = 0;
                                return;
                        }                                                                                                               
                        time = GetHighTime();           //獲取高電平時間(空閑時間)
                        if((time>313) && (time <718))         //判斷空閑時間是否在340-780us之內,如果是的話,說明發送了1位  0
                        {
                                byt >>= 1;                                               //先獲取位(0),
                        }
                        else if((time>1345) && (time<1751))                 //如果在此獲取的空閑時間(高電平時間)在此范圍內,說明發送了1位  1
                        {
                                byt >>= 1;                                                         //獲取位1 操作
                                byt |= 0x80;
                        }
                        else                                                                 //否則 既不是發送了0 也不是發送了 1 ,無效,退出外部中斷服務程序
                        {
                                IE0 = 0;
                                return;
                        }
                }
                ircode[i] = byt;
        }
        irflag = 1;
        IE0 = 0;
}
/******************************************main*****************************************/

#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit du=P2^6;
sbit we=P2^7;
uchar num,jianma1,jianma2;
unsigned char code dofly_DuanMa[]={  0x3F,          //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄滅
                0x00  //自定義
                                };// 顯示段碼值0~9
unsigned char T0RH = 0;  //T0重載值的高字節
unsigned char T0RL = 0;  //T0重載值的低字節

extern bit irflag;
extern unsigned char ircode[4];
extern void InitInfrared(void);
void ConfigTimer0(unsigned int ms);
void main()
{
    EA = 1;      //開總中斷,開始準備接受紅外信號
    InitInfrared();   //初始化紅外功能
    ConfigTimer0(1);  //配置T0定時1ms
    PT0 = 1;        //配置T0中斷為高優先級,啟用本行可消除接收時的閃爍

    while (1)
    {
        if (irflag)  //紅外接收標志位,1表示接受完畢,
        {
            irflag = 0;
/*                        switch(ircode[2])
                        {
                         case 0x0c:num=dofly_DuanMa[1];break;//1 顯示相應的按鍵值
                         case 0x18:num=dofly_DuanMa[2];break;//2
                         case 0x5e:num=dofly_DuanMa[3];break;//3
                         case 0x08:num=dofly_DuanMa[4];break;//4
                         case 0x1c:num=dofly_DuanMa[5];break;//5
                         case 0x5a:num=dofly_DuanMa[6];break;//6
                         case 0x42:num=dofly_DuanMa[7];break;//7
                         case 0x52:num=dofly_DuanMa[8];break;//8
                         case 0x4a:num=dofly_DuanMa[9];break;//9
                         default :break;       
                        }        */
                        jianma1=dofly_DuanMa[ircode[2] >> 4];
                        jianma2=dofly_DuanMa[ircode[2]&0x0f];
        }
    }
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;  //臨時變量

    tmp = 11059200 / 12;      //定時器計數頻率
    tmp = (tmp * ms) / 1000;  //計算所需的計數值
    tmp = 65536 - tmp;        //計算定時器重載值
    tmp = tmp + 18;           //補償中斷響應延時造成的誤差
    T0RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0為模式1
    TH0 = T0RH;     //加載T0重載值
    TL0 = T0RL;
    ET0 = 1;        //使能T0中斷
    TR0 = 1;        //啟動T0
}
/* 數碼管動態掃描刷新函數,需在定時中斷中調用 */
void LedScan()
{
/*        du=1;
        P0=num;
        du=0;
        P0=0xff;
        we=1;
        P0=0xfe;
        we=0;        */
       
        du=1;
        P0=jianma1;
        du=0;
        P0=0xff;
        we=1;
        P0=0xbf;
        we=0;
        _nop_();
        du=1;
        P0=jianma2;
        du=0;
        P0=0xff;
        we=1;
        P0=0x7f;
        we=0;
        _nop_();
}
/* T0中斷服務函數,執行數碼管掃描顯示 */
void InterruptTimer0() interrupt 1
{
    TH0 = T0RH;  //重新加載重載值
    TL0 = T0RL;
    LedScan();   //數碼管掃描顯示
}
功能:講遙控器鍵碼顯示在數碼管的第7,8位。 問題:第7位數碼管,顯示不清楚,只是個殘影,第八位數碼管顯示正常,無論我怎么減小延遲函數(最后用_nop_)也無法解決這個現象,求高手 幫我看看。謝謝了


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

使用道具 舉報

沙發
ID:79544 發表于 2015-9-24 18:51 | 只看該作者
你試試這個程序,改一下。
  1. /* 51單片機紅外遙控解碼程序 */

  2.   /* 適用uPD6121系列 */

  3.   #include

  4.   #define DIGPORT P2

  5.   #define WORDPORT P0

  6.   unsigned char code LED_num[]={0x3f,0x18,0x76,0x7c,0x59,0x6d,0x6f,0x38,0x7f,0x7d};

  7.   #define Imax 14000 //此處為晶振為11.0592時的取值,

  8.   #define Imin 8000 //如用其它頻率的晶振時,

  9.   #define Inum 1450 //要改變相應的取值。

  10.   unsigned char Im[]={0x00,0x00,0x00,0x00};

  11.   unsigned long m,Tc;

  12.   unsigned char i,IrOK;

  13.   void DelayMy(unsigned int t){

  14.   while(--t);

  15.   }

  16.   void Display_LED(unsigned long num)

  17.   {

  18.   unsigned int ii;

  19.   unsigned int jj=0;

  20.   unsigned long aa,bb;

  21.   unsigned int xx[8]={0,0,0,0,0,0,0,0};

  22.   do {

  23.   bb=num/10;

  24.   aa=num-bb*10;

  25.   xx[jj]=aa;

  26.   num=bb;jj++;

  27.   }

  28.   while(num>0);

  29.   DIGPORT=0x80;

  30.   for(ii=0;ii<8;ii++) {

  31.   WORDPORT=LED_num[xx[ii]];

  32.   DelayMy(60);

  33.   DIGPORT=DIGPORT>>1;

  34.   };

  35.   WORDPORT=0;

  36.   }

  37.   //外部中斷解碼程序

  38.   void intersvr1(void) interrupt 2 using 1

  39.   {

  40.   Tc=TH0*256+TL0; //提取中斷時間間隔時長

  41.   TH0=0; TL0=0; //定時中斷重新置零

  42.   if((Tc>Imin)&&(Tc

  43.   if(Tc>Inum) Im[m/8]=Im[m/8]>>1|0x80; else Im[m/8]=Im[m/8]>>1; //取碼

  44.   if(m==32) if((Im[2]|0x01)==~Im[3]) IrOK=1; else IrOK=0; //取碼完成后判斷讀碼是否正確

  45.   m++; //準備讀下一碼

  46.   }

  47.   /*演示主程序*/

  48.   void main(void)

  49.   {

  50.   m=0;

  51.   EA=1;

  52.   IT1=1;EX1=1;

  53.   TMOD=0x11;

  54.   TH0=0;TL0=0;

  55.   TR0=1;ET0=1;

  56.   for(;;){

  57.   DelayMy(100);

  58.   if(IrOK==1) for(i=0;i<400;i++) Display_LED(Im[2]);

  59.   IrOK=0;

  60.   }

  61.   }
復制代碼
回復

使用道具 舉報

板凳
ID:88716 發表于 2015-9-24 20:25 | 只看該作者
騰飛的龍 發表于 2015-9-24 18:51
你試試這個程序,改一下。

謝謝,還是想明白自己上述的程序到底哪里出了問題,放棄了,心里會不安。。。
回復

使用道具 舉報

地板
ID:88716 發表于 2015-9-25 18:19 來自手機 | 只看該作者
已經解決了,取消用定時器中斷程序來刷新數碼管顯示,直接在主函數while里不停刷新數碼管就ok了
回復

使用道具 舉報

5#
ID:84746 發表于 2015-9-25 23:33 來自手機 | 只看該作者
嗯摸摸摸兔兔講解
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频第一页 | 欧美日韩国产一区二区三区 | 国产中文字幕亚洲 | 日韩综合一区 | 一区二区三区视频在线观看 | 中文字幕国产视频 | 91精品在线播放 | 欧美精品一区二区三区在线 | 欧美一区二区三区久久精品视 | 久久人体 | 91av免费观看 | 午夜av电影 | 国产一区二区三区四区五区加勒比 | 国产亚洲精品久久久久久牛牛 | 一区二区国产精品 | 一区二区三区观看视频 | 九九伦理片 | 国产欧美视频一区 | 日韩成人高清在线 | 久久久久久久久精 | 欧美大片在线观看 | 久久久亚洲一区 | 天天综合久久 | 欧美一级特黄aaa大片在线观看 | 亚洲444eee在线观看 | 精品国产乱码久久久久久丨区2区 | 久久国产精彩视频 | 国产色婷婷精品综合在线播放 | 国产精品亚洲一区 | 日本黄色不卡视频 | 日韩在线视频一区二区三区 | 久久综合伊人一区二区三 | 精品亚洲一区二区三区 | 国产男女精品 | 欧美成年人视频在线观看 | 特级a欧美做爰片毛片 | 日本精品一区二区三区在线观看视频 | 91精品久久久 | 伦理二区 | 国产精品国产精品国产专区不卡 | 青青操91 |