找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2935|回复: 5
收起左侧

FT61F022A单片机使用红外遥控控制LED灯的亮度

[复制链接]
ID:745717 发表于 2021-3-24 17:07 | 显示全部楼层 |阅读模式
/***************************************
*        文件名:0722-LED_Infrared.prj
*        IC:FT61F022A
*        功能:使用红外遥控控制LED灯的亮度
*        时间:2020-07-22
****************************************/
#include        "SYSCFG.h";
/***********************宏定义**************************/
#define  unchar     unsigned char
#define  unint      unsigned int
#define  unlong     unsigned long

#define  LED_S2                RA6   
#define  LED_S1                RC3
#define  IR_Input                RC1
/******************************************************/
void Ir_work(void);

volatile        bit        bit_bit;
volatile        bit        IR_Input_Old;
volatile        bit REC_DATA_OK;
volatile        bit        REC_BIT_OK;

volatile unsigned char                bit_count;
volatile unsigned char                byte_count;

volatile unsigned char                irdata[4];
volatile unsigned char                irtime;

/*-------------------------------------------------
*  函数名:POWER_INITIAL
*        功能:  上电系统初始化
*  输入:  无
*  输出:  无
--------------------------------------------------*/        
void POWER_INITIAL (void)
{
         
        OSCCON = 0B01110001;        //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
                                                         //Bit0=1,系统时钟为内部振荡器
                                                         //Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
        INTCON = 0;                          //暂禁止所有中断
        PORTA = 0B00000000;               
        TRISA = 0B10111111;                //PA输入输出 0-输出 1-输入
                                                        //PA6->输出                                                
        PORTC = 0B00000000;         
        TRISC = 0B11110111;                //PC输入输出 0-输出 1-输入  
        WPUA = 0B00000000;             //PA端口上拉控制 1-开上拉 0-关上拉
        WPUC = 0B00000010;             //PC端口上拉控制 1-开上拉 0-关上拉
        OPTION = 0B00001000;        //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
                                                        //Bit3 预分频器分配位 0-Timer0 1-WDT
                                                        //Bit7(PAPU)=0 ENABLED PULL UP PA
        MSCKCON = 0B00000000;        //Bit6->0,禁止PA4,PC5稳压输出
                                                          //Bit5->0,TIMER2时钟为Fosc
                                                          //But4->0,禁止LVR      
        CMCON0 = 0B00000111;         //关闭比较器,CxIN为数字IO口
        ANSEL=0X0B00000000;
}
/*-------------------------------------------------
* 函数名称:   TIMER1_INITIAL
* 功能:      初始化设置定时器1
* 相关寄存器: T1CON TMR1H TMR1L TMR1IE TMR1ON PEIE GIE
-------------------------------------------------*/
void TIMER1_INITIAL (void)
{
        //需要在中断里重新赋初始值
        T1CON = 0B00000000;         //B[5:4]=00,T2时钟分频 1:1
                                                         //B1=0,T1时钟源选择内部时钟
                                                         //T1SYNC=16M/2T=8M=0.125US
        TMR1L = 0XC0;                          //定时500US=>TMR1=8000*0.125US=1MS
                                            //初值=65536-8000=57,536=>0XE0C0
        TMR1H = 0XE0;                          //赋初值=>TMR1H=E0;TMR1L=0XC0
//        TMR1L = (65536 - 40000) % 256;
//        TMR1H = (65536 - 40000) / 256;
// TMR1L =0XA0;
// TMR1H =0XFF;
        TMR1IE = 1;                                //使能TMER1的中断
        TMR1ON = 1;                        //使能TMER1启动
        PEIE = 1;                                    //使能外设中断
        GIE = 1;                                   //使能全局中断
}
/**************中断处理**********************************/
void interrupt ISR(void)           //PIC_HI-TECH使用
{
        if(TMR1IF)
                {
                TMR1IF = 0;
                TMR1L = 0XE0;                          //定时500US=>TMR1=8000*0.125US=1MS
                                                                                        //初值=65536-8000=57,536=>0XE0C0
                TMR1H = 0XFC; //100US
                //LED_S1=1;
                if(IR_Input&&irtime<100)
                        {
            irtime++;   
                        }
        if(IR_Input==0)
                        {
            if(IR_Input_Old==1)
                                {
                                 if(irtime>1&&irtime<10)   
                                        {bit_bit=0;REC_BIT_OK=1;}
                                 else if(irtime>9&&irtime<21)  
                                        {bit_bit=1;REC_BIT_OK=1;}
                                 else if(irtime>40)
                                        {
                    REC_BIT_OK=0;   
                                        bit_count=0;
                                        byte_count=0;
                                        }
                                }
                        irtime=0;
                        }
        IR_Input_Old=IR_Input;

                if(REC_BIT_OK==1&&REC_DATA_OK==0)
                        {
            irdata[byte_count]<<=1;   

                        if(bit_bit)
                                irdata[byte_count]|=0x01;
            else
                                irdata[byte_count]&=0xfe;

                        bit_count++;
            if(bit_count>7)
                                {
                 byte_count++;
                 if(byte_count>3)
                                        REC_DATA_OK=1;
                 bit_count=0;   
                                }
                        REC_BIT_OK=0;
                        }
  //      LED_S1=0;   
                }
}

/*------------------------------------------------
                键码对应的按键
------------------------------------------------*/
void Ir_work(void)//红外键值散转程序
{
if(irdata[0]==0x80&&irdata[1]==0x75&&(irdata[2]=255-irdata[3]))
        {
    if(irdata[2] ==0x78)//off
                {
        if(LED_S1)
                        LED_S1=0;
                else
                        LED_S1=1;
                }
        if(irdata[2] ==0x00)//+
                {

                }
   if(irdata[2] ==0x00)//-
                {

                }
        }

}
/*****主函数********/
void main()
{
        POWER_INITIAL();
    TIMER1_INITIAL();
    while(1)
    {
        if(REC_DATA_OK)
        {
                Ir_work();
                REC_DATA_OK = 0;
        }
        }
}

回复

使用道具 举报

ID:328014 发表于 2021-3-24 21:18 | 显示全部楼层
好东东 能分享一下电路图和头文件吗?
回复

使用道具 举报

ID:745717 发表于 2021-3-26 15:49 | 显示全部楼层
51hei团团 发表于 2021-3-24 21:18
好东东 能分享一下电路图和头文件吗?

不好意思,这是自己简单搭建的电路,没有电路图
回复

使用道具 举报

ID:607312 发表于 2021-4-10 14:30 | 显示全部楼层
很好的学习资料,最近正在学习辉芒MCU的红外处理,能分享一下遥控器用的是拿种吗?
回复

使用道具 举报

ID:607312 发表于 2021-4-10 14:31 | 显示全部楼层
或者手画的原理图意可以啊
回复

使用道具 举报

ID:607312 发表于 2021-7-20 14:17 | 显示全部楼层
请问一下程序测试过吗?为什么我测试了不行呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表