打印
[DemoCode下载]

使用pwm及capture作紅外學習及發送的功能

[复制链接]
1570|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a_ziliu|  楼主 | 2017-4-6 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用nuc240 nuedu, 作38khz紅外線發射及學習。
NUC230_240 IR LEARN.zip (487.41 KB)
沙发
天灵灵地灵灵| | 2017-4-6 18:35 | 只看该作者
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 6 $
* $Date: 15/09/02 11:55a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    NUC200 Series I2S Controller Sample Code
*
* @note
* Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "NUC230_240.h"
#include "NuEdu-Basic01.h"

extern unsigned int cap_buffer[256];
extern unsigned int cap_edge[256];
extern unsigned int cap_count;
unsigned int i,temp;


#define DATA_FLAHSH_OFFSET  0x0001F000

uint32_t SIM_EEPROM_READ(uint32_t address)
{
    uint32_t temp_data;
    temp_data=*((uint32_t*)(address+DATA_FLAHSH_OFFSET));
        return temp_data;
}

void SIM_EEPROM_WRITE(uint32_t address,uint32_t data)
{

           uint32_t i,j;
    uint32_t buffer[512];               
        if((SIM_EEPROM_READ(address)==0xffffffff)|((SIM_EEPROM_READ(address)&data)==data))
        {       
                FMC_Write(address+DATA_FLAHSH_OFFSET, data);
        }
        else
    {   
         //backup date
         j=0;         
        // printf("0x%x\n\r",DATA_FLAHSH_OFFSET+(address/512)+(512));
         for(i=DATA_FLAHSH_OFFSET+((address/512)*512);i<DATA_FLAHSH_OFFSET+((address/512)*512)+512;i=i+4)
         {
                //printf("0x%x\n\r",i);
                //printf("0x%x\n\r",FMC_Read(i));
             buffer[j]=FMC_Read(i);               
             j++;
         }                                 
        //erase page
        FMC_Erase(DATA_FLAHSH_OFFSET+((address/512)*512));              
        buffer[(address%512)/4]=data;
        j=0;
        for(i=DATA_FLAHSH_OFFSET+((address/512)*512);i<DATA_FLAHSH_OFFSET+((address/512)*512)+512;i=i+4)
        {
            FMC_Write(i,buffer[j]);
            j++;
        }
   }
}

/*---------------------------------------------------------------------------------------------------------*/
/*  MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
SYS_Init();
        Open_Seven_Segment();
            SYS_UnlockReg();
        FMC_Open();
while(1)
{
if(PC13==0)
{
        Show_Seven_Segment(1,1);
        //clear buffer
        cap_count=0;
        for(i=0;i<256;i++)
        {
        cap_buffer[i]=0;
        cap_edge[i]=1;
        }
        IrDA_NEC_Rx_Init();
  while(PB14==1);       
        Show_Seven_Segment(2,1);
        NVIC_DisableIRQ(PWMB_IRQn);
}
   
if(PE8==0)
{
         Show_Seven_Segment(3,1);
         IrDA_NEC_Tx_Init();
          for(i=0;i<256;i++)
          {
                 if(cap_buffer[i]==0)
                                goto END;
            if(cap_edge[i]==1)
                        {
                                CLK_SysTickDelay(cap_buffer[i]);                       
                        }
            else
                        {                       
                  PWM_EnableOutput(PWMB, 0X04);
                        CLK_SysTickDelay(cap_buffer[i]);
                        PWM_DisableOutput(PWMB, 0X04);
                        }

                }
END:               
Show_Seven_Segment(4,1);
        }
  
if(PC14==0)//write learn data data eeprom
{
         Show_Seven_Segment(5,1);
for(i=0;i<256;i++)
        {

                SIM_EEPROM_WRITE((i*4),cap_buffer[i]);
                SIM_EEPROM_WRITE((256*4)+(i*4),cap_edge[i]);
        }
        Show_Seven_Segment(6,1);
       
}

if(PC15==0)  //read learn data data eeprom
{
         Show_Seven_Segment(7,1);
//clear ram buffer
  cap_count=0;
        for(i=0;i<256;i++)
        {
        cap_buffer[i]=0;
        cap_edge[i]=1;
        }
        for(i=0;i<256;i++)
        {
        cap_buffer[i]=SIM_EEPROM_READ((i*4));
        cap_edge[i]=SIM_EEPROM_READ((256*4)+(i*4));
        }
        Show_Seven_Segment(8,1);
}
}
}

使用特权

评论回复
板凳
天灵灵地灵灵| | 2017-4-6 18:39 | 只看该作者
7段数码管很好用的。

使用特权

评论回复
地板
yiyigirl2014| | 2017-4-6 21:39 | 只看该作者
38Khz是需要单片机来生成还是那个红外直接就是38Khz

使用特权

评论回复
5
zhuomuniao110| | 2017-4-6 22:29 | 只看该作者
# 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();
        }
}

使用特权

评论回复
6
yiyigirl2014| | 2017-4-7 12:32 | 只看该作者
不知道跟那个单片机串口的Ir模式是不是一回事。

使用特权

评论回复
7
dongnanxibei| | 2017-4-8 12:13 | 只看该作者
好像有的单片机带一个红外专用的接口吧?

使用特权

评论回复
8
xixi2017| | 2017-4-9 15:32 | 只看该作者
红外发射接收原理
遥控器部分:
遥控器部分的工作原理较为简单,主要就是编码IC通过三极管进行放大调变,然后将此电信号(脉冲波)经有红外发射管(940nm波长)转变为光信号发射出去。
现在国产遥控器的电路主要有:455K晶振,编码IC,放大三极管,发射管等主要几个电子原件组成,2节3V电池驱动;但目前一些国际大厂所用的遥控器,其编码IC内已包括了晶振和放大三极管,电路设计更加方便,且只需要1节电池驱动,更加环保。
红外接收部分:
红外接收头内部结构如上图,其主要由光电二极管+红外接收IC组成,工作原理为:光电二极管(俗称接收管)其接收到红外发射管发射出的光信号后转换为电信号(为微安级的电流),此电信号输入到接收IC内部经过放大--增益--滤波--解调变--整形还原后,还原遥控器给出的原始编码,通过接收头信号输出脚输入到后面的代码识别电路

使用特权

评论回复
9
xixi2017| | 2017-4-9 15:54 | 只看该作者
至于为什么用38KHZ,是因为这样可以提高红外线的抗干扰能力,避免大气中的红外线干扰。原理如下
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的
455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9
kHz≈38kHz。

使用特权

评论回复
10
稳稳の幸福| | 2017-4-9 19:20 | 只看该作者
for(i=DATA_FLAHSH_OFFSET+((address/512)*512);i<DATA_FLAHSH_OFFSET+((address/512)*512)+512;i=i+4)
这个用的给力。

使用特权

评论回复
11
yiy| | 2017-4-10 23:51 | 只看该作者
38K 是由单片机产生的吗

使用特权

评论回复
12
xiaohhys8| | 2021-4-22 15:10 | 只看该作者
好好学习学习!

使用特权

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

本版积分规则

100

主题

295

帖子

6

粉丝