红外遥控(初版)stc8h1k16

#include "STC8H.H"

#include "IR.h"

#include <TIME0.H>

sbit INT = P3^2;

sbit LED = P3^3;

unsigned char Data[4];

bit IR_volunteer;

unsigned int overtime_Statistics;

 unsigned int Heig_Time,Low_time;

    void UartInit(void) ;

    void Send_bit(unsigned char Bit);

void main()

{

P3M1=(P3M1&0xFB)|0x00;  //设置IO口模式

P3M0=(P3M0&0xFB)|0x00;  //设置IO口模式

/*

P3.0维持不变

P3.1维持不变

P3.2弱上拉

P3.3维持不变

P3.4维持不变

P3.5维持不变

P3.6维持不变

P3.7维持不变

*/


 

    Timer0_Init();

    INT0();

    EA =1;

    LED =0;

    UartInit();

   

    while(1)

    {

        if (IR_volunteer)

        {

            IR_volunteer=0;

            Send_bit(Data[2]);

        }

    }

}

char Data_Reception()

{

    unsigned char i,j;

    static unsigned char Themiddle_Variables;

   

    for ( i = 0; i < 4; i++)

    {

        for ( j = 0; j < 8; j++)

        {

            Themiddle_Variables >>= 1;

            TH0 = 0;

            TL0 = 0;//计数清除

            TR0 = 1; //打开计数

            while (INT==0);//低电平时间

            TR0 = 0;//关闭计数

            Low_time =  TH0*256+TL0;

            TH0 = 0;

            TL0 = 0;//计数清除

            TR0 = 1; //打开计数

            while (INT);//高电平时间

            TR0 = 0;//关闭计数

            Heig_Time =  TH0*256+TL0;

            if ((Low_time>620)||(Low_time<360))

            {

                return 0;

            }

            if ((Heig_Time>450)&&(Low_time<550))     Themiddle_Variables &=0x7f;

            if ((Heig_Time>1550)&&(Heig_Time<1700))  Themiddle_Variables |= 0x80;

        }

        Data[i] = Themiddle_Variables;

       

        Themiddle_Variables=0;

        // LED  =0;

    }

    // return 1;

    // 数据判断

    if ((Data[0]+Data[1])==255)

    {

        // LED =1;

        if ((Data[2]+Data[3])==255)

        {

            return 1;

        }

    }

    return 0;

}

void UartInit(void)     //115200bps@22.1184MHz

{


 

    PCON|=0x80;

    SCON = 0x50;        //8位数据,可变波特率

    AUXR |= 0x40;       //定时器时钟1T模式

    AUXR &= 0xFE;       //串口1选择定时器1为波特率发生器

    TMOD &= 0x0F;       //设置定时器模式

    TL1 = 0xC7;     //设置定时初始值

    TH1 = 0xFE;     //设置定时初始值

    ET1 = 0;        //禁止定时器%d中断

    TR1 = 1;        //定时器1开始计时

    TI=1;           //开启打印

    EA=1;

}

void Send_bit(unsigned char Bit)

{

    SBUF = Bit;

    while (!TI);

    TI =0;

}

void INT0_Isr() interrupt 0

{  

    //引导码低电平时间9MS

    //引导码高电平时间4.48MS

    //低电平618us 高电平514us 为0

    //低电平590us 高电平1.639ms 为1

    static unsigned int Value;

    EX0 = 0;

    TH0 = 0;

    TL0 = 0;//计数清除

    TR0 = 1;//打开定时计数器

    while (!INT);//引导码低电平时间//9MS

   

    TR0 =0;//关闭定时计数器

    Value = TH0*256 + TL0;

    if (((Value>8500) && (Value < 9500))==0)

    {

        EX0 = 1;//打开外部中断

        return;

    }

    TH0 = 0;

    TL0 = 0;//计数清除

    TR0 = 1; //打开计数

    while (INT);//引导码高电平时间//4.48MS

    TR0 = 0;//关闭计数

    Value =  TH0*256+TL0;

    TH0 = 0;

    TL0 = 0;//计数清除

    if ((Value>4000)&&(Value<5000))

    {

        //引导码没问题开始接收数据

        IR_volunteer=Data_Reception();

       

    }

    EX0 =1;//打开外部中断

}




 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值