打印
[51单片机]

遥控器解码 中断函数移位异常

[复制链接]
785|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CrazyCpu|  楼主 | 2015-3-15 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/************************************************************************
9(L) + 4.5(H) = 13.5       START    单位:MS
0.56(L) + 0.565(H) = 1.125 '0'
0.56(L) + 1.685(H) = 2.245 '1'
9(L) + 2.5(H) = 11.5       STOP

4个字节 两个部分
第一部分 遥控器辨识码
第二部分 操作码

问题:
我这是写的一个遥控器解码的程序,用的芯片是STC15F2K60S2
用示波器查看遥控器的辨识码是 0x00 0xFD
读取红外一体化接收用的是P11,利用捕获的下降沿中断
在中断中读取脉冲的间隔来判断是‘1’,还是‘0’
然后利用位运算将数据存到全局变量Code中
用串口将解码显示出来
可是在中断中左移和右移的情况不同,左移的数据有点怪,辨识码不是0x00 0xFD 总是0xFF 0xFF
理论上应该都是一样的啊,请问有没有朋友遇到过类似情况,请问各位有什么见解?
*****************************************************************************/

#include <IAP15F2K61S2.h>
#include <intrins.h>
#include "Uart.h"

#define uchar unsigned char
#define uint unsigned int

//调试标志
#define DEBUG_BIT 0
#define DEBUG_BIT2 1

unsigned long int Code = 0;
char Bit = 31;
char Bit2 = 0;
uint Time_Span = 0;   // 时间间隔
uchar Start = 0; // 开始标志

void UartInit(void)                //9600bps@12.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0xE6;                //设定定时初值
        TH1 = 0xFF;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
void Timer0Init()                //100微秒@24.000MHz
{
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0x00;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 0;                //定时器0开始计时
        ET0 = 0;
}
void CCP0Init()
{
        CCAPM0 = 0x11;
        CCF0 = 0;
}

void CCP0() interrupt 7
{
        TR0 = 0; //关闭定时器
        Time_Span = (TH0<<8)+TL0; //读出间隔
        TH0 = 0x00; //清零
        TL0 = 0x00;
        TR0 = 1; //开启定时器

        #if DEBUG_BIT  //串口读回的数据有点怪
        if(Bit>=0)
        {
                if(Time_Span>=1000 && Time_Span<1300)
                {
                        Code = Code & (~(0x00000001<<Bit));
                        Bit--;
                }
                if(Time_Span>=2000 && Time_Span<2500)
                {
                        Code = Code | (0x00000001<<Bit);
                        Bit--;
                }
        }
        #endif
       
        #if DEBUG_BIT2 //数据正常
        if(Bit2<=31)
        {
                if(Time_Span>=1000 && Time_Span<1300)
                {
                        Code = Code & (~(0x80000000>>Bit2));
                        Bit2++;
                }
                if(Time_Span>=2000 && Time_Span<2500)
                {
                        Code = Code | (0x80000000>>Bit2);
                        Bit2++;
                }
        }
        #endif
        CCF0 = 0;
}

void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 10;
        j = 31;
        k = 147;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void main()
{
        UartInit();
        Timer0Init();
        CCP0Init();
       
        EA = 1;
       
        while(1)
        {
                #if DEBUG_BIT
                if(Bit<0)
                {
                        sendChar_Uart((Code>>24)&0xFF);
                        sendChar_Uart((Code>>16)&0xFF);
                        sendChar_Uart((Code>>8)&0xFF);
                        sendChar_Uart(Code&0xFF);
                        Delay200ms();
                        Bit=31;
                }
                #endif
               
                #if DEBUG_BIT2
                if(Bit2>31)
                {
                        sendChar_Uart((Code>>24)&0xFF);
                        sendChar_Uart((Code>>16)&0xFF);
                        sendChar_Uart((Code>>8)&0xFF);
                        sendChar_Uart(Code&0xFF);
                        Delay200ms();
                        Bit2=0;
                }
                #endif
        }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

0

粉丝