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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51掉電模式下,紅外頭,INT1外部中斷喚醒,需要遙控器按2次的問題。

[復制鏈接]
跳轉到指定樓層
樓主
單片機用的是STC12C5A60S2,晶振11.0592MHz。

進入掉電模式的流程圖:

故障表現:進入wile循環后,已經進入掉電模式后,液晶屏會不定時自動的出現輸出的字符"D",或1分鐘,或5分鐘,或10分鐘(根據代碼會出現字符“D”是表示外部中斷喚醒,進入失?)。紅外遙控器按一次只會輸出一個“D”,無法完成整個解碼過程,連續按2次解碼正常。請問這是什么問題(下面有完整的電路圖,源代碼)?謝謝!

電路圖:點擊可放大


----
C源代碼:


/*STC12C5A60S2 11.0592MHz*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit rs=P3^6; //1602數據/命令
sbit e=P3^7; //1602使能控制
sbit dyled=P0^0; //電源指示燈及用作測試
sbit j=P2^0; //繼電器
sbit IR_INPUT = P3^3; //1838紅外接收引腳

bit irflag = 0; //紅外接收標志,收到一幀正確數據后置1

unsigned char ircode[4]; //紅外代碼接收
unsigned char disp[11];
unsigned char code Tab[16]="0123456789ABCDEF";

void InitInfrared()
{   
    IR_INPUT = 1;
    TMOD &= 0X0F;
    TMOD |= 0x10;
    TR1 = 0;
    ET1 = 0;
    IT1 = 1;
    EX1 = 1;
}
unsigned int GetHighTime()
{
    TH1 = 0;
    TL1 = 0;
    TR1 = 1;
    while(IR_INPUT)
    {
        if(TH1 > 0x40)
        {
            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);
}
void EXINT1_ISR() interrupt 2 //TNT1中斷 紅外一體接收頭
{
    unsigned char i, j;
    unsigned int time;
    unsigned char byt;

    time = GetLowTime();
    if((time <7833) || (time > 8755))      
    {
        IE1 = 0;
        return;   
    }

    time = GetHighTime();
    if((time<3686) || (time > 4608))
    {
        IE1 = 0;
        return;
    }

    dyled=0; //遙控器按下按鍵,掉電喚醒后,程序到這里終止(喚醒后的一瞬間無晶起振或是起振不及時導致?)

    for(i=0; i<4; i++)
    {
        for(j=0; j<8; j++)
        {
            time = GetLowTime();
            if((time<313) ||(time >718))
            {
                IE1 = 0;
                return;
            }
            time = GetHighTime();
            if((time>313) && (time <718))
            {
                byt >>= 1;   
            }
            else if((time>1345) && (time<1751))
            {
                byt >>= 1;
                byt |= 0x80;
            }
            else
            {
                IE1 = 0;
                return;
            }
        }
        ircode[ i] = byt;
    }
    irflag = 1;
    IE1 = 0;
}

void delay_50us(uint t) //延時
{
    uint j;
    for(;t>0;t--)
    for(j=6245;j>0;j--);
}

void write_com(uchar com) //液晶屏寫指令
{
    e=0;
    rs=0;
    P1=com;
    delay_50us(10);
    e=1;
    delay_50us(20);
    e=0;   
}

void write_data(uchar dat) //液晶屏寫數據
{
    e=0;
    rs=1;
    P1=dat;
    delay_50us(10);
    e=1;
    delay_50us(20);
    e=0;   
}

void init() //液晶屏初始化
{
    delay_50us(300);
    write_com(0x38);
    delay_50us(100);
    write_com(0x38);
    delay_50us(100);
    write_com(0x38);
    delay_50us(100);
    write_com(0x38);
    write_com(0x38);
    write_com(0x08);
    write_com(0x01);
    write_com(0x06);
    write_com(0x0c);
}

void main(void)
{
    EA = 1; //開總中斷
    InitInfrared(); //初始化紅外功能
    init(); //液晶屏初始化
   while (1)
   {
        if (irflag)  //接收到紅外數據時刷新顯示
        {
            irflag = 0;
               
            write_com(0x01); //清屏
            delay_50us(10);

            write_com(0x80); //定位寫出位置

            disp[0]=Tab[ircode[0]/16]; //二進制到十六進制賦值給紅外碼數組
            disp[1]=Tab[ircode[0]%16];
            disp[2]='-';
            disp[3]=Tab[ircode[1]/16];
            disp[4]=Tab[ircode[1]%16];
            disp[5]='-';
            disp[6]=Tab[ircode[2]/16];
            disp[7]=Tab[ircode[2]%16];
            disp[8]='-';
            disp[9]=Tab[ircode[3]/16];
            disp[10]=Tab[ircode[3]%16];
            
            write_data(disp[0]); //disp紅外碼數組,輸出到1602液晶屏
            delay_50us(5);
            write_data(disp[1]);
            delay_50us(5);
            write_data(disp[2]);
            delay_50us(5);
            write_data(disp[3]);
            delay_50us(5);
            write_data(disp[4]);
            delay_50us(5);
            write_data(disp[5]);
            delay_50us(5);
            write_data(disp[6]);
            delay_50us(5);
            write_data(disp[7]);
            delay_50us(5);
            write_data(disp[8]);
            delay_50us(5);
            write_data(disp[9]);
            delay_50us(5);
            write_data(disp[10]);
            delay_50us(5);

            write_com(0x80+0x40);
            delay_50us(5);
            write_data(disp[4]);
            delay_50us(5);

            if((disp[0] == '4') && (disp[4] == 'C') && (disp[6] == '1') && (disp[7] == '4'))
            {
                dyled=~dyled;
                j=~j; //繼電器響應紅外按鍵信號
            }
        }
        dyled=1;
        PCON = 0X02; //掉電模式
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
               
        delay_50us(5);
        write_data(' ');
        delay_50us(5);
        write_data('D'); //已經進入掉電模式后,液晶屏會不定時出現輸出的字符"D",或5秒 或7秒 或20秒(進入失?)
        dyled=1;
        //delay_50us(50);
    }
}

----
STC12C5A60S2官方的掉電模式代碼:

#include "reg51.h"
#include "intrins.h"

//External interrupt0 service routine
void exint1() interrupt 2           //(location at 0013H)
{
}

void main()
{
    IT1 = 1;                        //set INT1 int type (1:Falling 0:Low level)
    EX1 = 1;                        //enable INT1 interrupt
    EA = 1;                         //open global interrupt switch

    while (1)
    {
        INT1 = 1;                   //ready read INT1 port
        while (!INT1);              //check INT1
        _nop_();
        _nop_();
        PCON = 0x02;                //MCU power down
        _nop_();
        _nop_();
        P1++;
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:70094 發表于 2014-12-7 17:18 | 只看該作者
我也是菜鳥
回復

使用道具 舉報

板凳
ID:67992 發表于 2014-12-8 23:01 | 只看該作者
紅外解碼部分有問題,換一個解碼程序就可以了。
回復

使用道具 舉報

地板
ID:69706 發表于 2014-12-9 09:09 | 只看該作者
學習中。。。。。。。。。
回復

使用道具 舉報

5#
ID:69946 發表于 2014-12-9 17:50 | 只看該作者
程序原因,鍵盤掃描程序的問題
回復

使用道具 舉報

6#
ID:67992 發表于 2014-12-9 22:01 | 只看該作者
我推翻之前的論斷,不是紅外程序的原因。查了下資料,
回復

使用道具 舉報

7#
ID:67992 發表于 2014-12-9 22:07 | 只看該作者
我推翻之前的論斷,不是紅外程序的原因。查了下資料,空閑模式可用,掉電由于要重新啟動振蕩器須時間,會導致紅外解碼失敗,找不到好辦法。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:119355 發表于 2019-5-12 18:01 | 只看該作者
我也遇到這個問題了,感覺是宋老師這個定時器計時喚醒需要時間的問題,無奈換了解碼程序就正常了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲视频 | 天天综合网天天综合 | 久久av一区二区三区 | 视频第一区 | 欧美中文字幕 | 一道本不卡视频 | 在线观看国产wwwa级羞羞视频 | 中文字幕精品一区 | 天天躁日日躁狠狠躁2018小说 | 欧美性网| 久久国产欧美日韩精品 | 亚洲天堂一区二区 | 日韩一区二区在线视频 | 一级毛片视频在线观看 | 久久成人一区 | 精品视频国产 | 国产精品国产精品国产专区不卡 | 久久久久久久久久久福利观看 | 欧美日韩成人 | 黄片毛片免费看 | 亚洲一区中文字幕在线观看 | 欧美极品在线观看 | 国产一区二区毛片 | 久久6视频| 成人精品国产 | 久久久中文 | 精品久久久久久红码专区 | 中文字幕日韩欧美 | 91在线观看网址 | 日韩国产一区二区三区 | 久久精品久久久 | 欧美久久电影 | 日韩精品一区在线 | 久久久精品综合 | 密桃av| 精产国产伦理一二三区 | 国产精品久久9 | av中文字幕在线观看 | 一级免费a | 亚洲精品国产第一综合99久久 | 91色在线 |