欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51掉電模式下,紅外頭,INT1外部中斷喚醒,需要遙控器按2次的問題。 [打印本頁(yè)]

作者: TGl4    時(shí)間: 2014-12-7 17:08
標(biāo)題: 51掉電模式下,紅外頭,INT1外部中斷喚醒,需要遙控器按2次的問題。
單片機(jī)用的是STC12C5A60S2,晶振11.0592MHz。

進(jìn)入掉電模式的流程圖:

故障表現(xiàn):進(jìn)入wile循環(huán)后,已經(jīng)進(jìn)入掉電模式后,液晶屏?xí)欢〞r(shí)自動(dòng)的出現(xiàn)輸出的字符"D",或1分鐘,或5分鐘,或10分鐘(根據(jù)代碼會(huì)出現(xiàn)字符“D”是表示外部中斷喚醒,進(jìn)入失敗?)。紅外遙控器按一次只會(huì)輸出一個(gè)“D”,無(wú)法完成整個(gè)解碼過程,連續(xù)按2次解碼正常。請(qǐng)問這是什么問題(下面有完整的電路圖,源代碼)?謝謝!

電路圖:點(diǎn)擊可放大


----
C源代碼:


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

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

bit irflag = 0; //紅外接收標(biāo)志,收到一幀正確數(shù)據(jù)后置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; //遙控器按下按鍵,掉電喚醒后,程序到這里終止(喚醒后的一瞬間無(wú)晶起振或是起振不及時(shí)導(dǎo)致?)

    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) //延時(shí)
{
    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) //液晶屏寫數(shù)據(jù)
{
    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)  //接收到紅外數(shù)據(jù)時(shí)刷新顯示
        {
            irflag = 0;
               
            write_com(0x01); //清屏
            delay_50us(10);

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

            disp[0]=Tab[ircode[0]/16]; //二進(jìn)制到十六進(jìn)制賦值給紅外碼數(shù)組
            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紅外碼數(shù)組,輸出到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; //繼電器響應(yīng)紅外按鍵信號(hào)
            }
        }
        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'); //已經(jīng)進(jìn)入掉電模式后,液晶屏?xí)欢〞r(shí)出現(xiàn)輸出的字符"D",或5秒 或7秒 或20秒(進(jìn)入失敗?)
        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++;
    }
}

作者: shuimuqing123    時(shí)間: 2014-12-7 17:18
我也是菜鳥
作者: dgahz    時(shí)間: 2014-12-8 23:01
紅外解碼部分有問題,換一個(gè)解碼程序就可以了。
作者: 風(fēng)緣    時(shí)間: 2014-12-9 09:09
學(xué)習(xí)中。。。。。。。。。
作者: TY天網(wǎng)    時(shí)間: 2014-12-9 17:50
程序原因,鍵盤掃描程序的問題
作者: dgahz    時(shí)間: 2014-12-9 22:01
我推翻之前的論斷,不是紅外程序的原因。查了下資料,

作者: dgahz    時(shí)間: 2014-12-9 22:07
我推翻之前的論斷,不是紅外程序的原因。查了下資料,空閑模式可用,掉電由于要重新啟動(dòng)振蕩器須時(shí)間,會(huì)導(dǎo)致紅外解碼失敗,找不到好辦法。
作者: 7780000    時(shí)間: 2019-5-12 18:01
我也遇到這個(gè)問題了,感覺是宋老師這個(gè)定時(shí)器計(jì)時(shí)喚醒需要時(shí)間的問題,無(wú)奈換了解碼程序就正常了




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1