微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 红外解码程序及很经典的38KHZ产生方法

红外解码程序及很经典的38KHZ产生方法

时间:10-02 整理:3721RD 点击:
# include <reg52.h>
# include <intrins.h>
typedef unsigned char uchar;// # define uchar unsinged char
typedef unsigned int  uint; // # define uint  unsinged int
sbit key1 = P3^3;
sbit key2 = P3^4;
sbit key3 = P3^5;
sbit out  = P3^7;
sbit led  = P1^0;
uchar i;//产生38KHZ时用到
//======初始化================================================
void init()
{
        EX0 = 1;//外中断0使能
        IE0 = 0//触发方式 电平
        PX0 = 1;//中断优先级 高
        EA  = 1;//总中断 开
       
        key1 = 1;
        key2 = 1;
        key3 = 1;
}
//======延时==================================================
void delay(uchar a)
{
        uchar b,c;
        for(b = 0; b < a; b++)
                for(c = 0; c < 200; c++);
               
}
void delayms(uchar a)//延时程序
{
        uchar b;
        for(b = 0; b < a; b++)
        {
                _nop_(); _nop_(); _nop_(); _nop_();
                _nop_(); _nop_(); _nop_(); _nop_();
        }
}
//======发送38KHZ程序====频率:38KHZ  周期:26us =================
void _38KHZ(uchar a)//调制脉冲发送时间
{
        //时间自己测试 周期 26us  高低电平各占 13us
        uchar j;
        for(j = 0; j < a; j++)
        {
                out = !out;
                i = 7;
                while( i > 0) i--; //26us  38KHZ
        }
        out = 1;
       
}
/*        延时时间测试值在括号内
        //khz(?);                  //   精确的时间
        //khz(?);                //
        //khz(?);                 //
        //delayms(?);        //   这里是一些时间的介绍
        //delayms(?);        //
        //delayms(?);        //
*/
//====================编码数据发送===本程序的关键==============================
void send_data(uchar temp)
{
        uchar num
        _38KHZ(116) //3ms 38khz  这里是发送引导码 开始码
        delayms(125); //2ms
        for(num = 0; num < 8; num++)
        {
                _38KHZ(40);// 1ms
                //out = 1;
                if(temp & 0x01)
                        delay(93)// 1.5ms  上面的1ms+这里的1.5ms 即发送的“1”
                else
                        delay(65)// 1ms                上面的1ms+这里的1ms 即发送的“0”
                temp = temp >> 1;//从最低位先发送
        }
        _38KHZ(20); //一字节的数据发送完成后的结束码
}
//====================发送成功状态指示灯=================================
void _38khz_led(void)
{
        uchar k;
        for(k = 0; k < 4; k++)
        {
                LED0 = !LED0;
                delay(50);
        }
        LED0 = 1;
}
//====================按键扫描功能程序=================================
void keyscan(void)
{
        if(0 == key1)//按键1
        {
                _nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
                _nop_(); _nop_(); _nop_(); _nop_();
                if(0 == key1)
                {
                        while(!key1);//按下按键后 收放开后开始红外线发射程序
                        send_data(0xf3);//发送数据
                        _38khz_led();        //状态指示
                }
        }
       
        if(0 == key2)//按键1
        {
                _nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
                _nop_(); _nop_(); _nop_(); _nop_();
                if(0 == key2)
                {
                        while(!key2);//按下按键后 收放开后开始红外线发射程序
                        send_data(0x3f);//发送数据
                        _38khz_led();        //状态指示
                }
        }
       
        if(0 == key3)//按键1
        {
                _nop_(); _nop_(); _nop_(); _nop_();//延时10us消除按键抖动
                _nop_(); _nop_(); _nop_(); _nop_();
                if(0 == key3)
                {
                        while(!key3);//按下按键后 收放开后开始红外线发射程序
                        send_data(0xf5);//发送数据
                        _38khz_led();        //状态指示
                }
        }
}
//====================主程序=================================
void main(void)
{
        init();//初始化
        key1 = 0;
        while(1)
        {
                keyscan();
        }
}

不错的资料,值得收藏

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top