历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2020年08月26日 | 基于51单片机的红外智能风扇程序

发布者:云淡风轻2014 来源: 51hei关键字:51单片机  红外智能风扇  定时器 手机看文章 扫描二维码
随时随地手机看文章

实用STC12C5A60S2型号的单片机,实现三档风速,利用单片机内部定时器智能定时,可切换自然风和正常风,使用市场上常见的小遥控器

电路原理图如下:

制作出来的实物图如下:

单片机源程序如下:

#include //头文件

#include   

/*====================================

自定义类型名

====================================*/

typedef unsigned char INT8U;

typedef unsigned char uchar;


typedef unsigned int INT16U;

typedef unsigned int uint;


sbit PWM_1                =        P1^4;       //PWM1_Boost/Buck   

sbit enlarge        =        P3^0;    //增大

sbit reduce                =        P3^1;       //减小




/*====================================

硬件接口位声明

====================================*/

sbit IR  = P3^2;     //定义红外脉冲数据接口        外部中断O输入口

sbit beep = P2^3;                //蜂鸣器的位置

sbit NPN1 = P1^1;      //电机 低档

sbit NPN2 = P1^2;      //电机 中档

sbit NPN3 = P1^3;      //电机 高档


sbit NPNhuxi = P1^5;      //电机 呼吸风


/**************************************

1602液晶

**************************************/

sbit RS = P2^5;                 

sbit RW =  P2^6;

sbit E  =  P2^4;


uchar IRtime;                 //检测红外高电平持续时间(脉宽)

uchar IRcord[4];    //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)

uchar IRdata[33];   //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)

bit IRpro_ok, IRok;  //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕



void delay4(uchar t)

{

        uint j;

        uchar i;

        for(i=0;i                for(j=0;j<1000;j++);

}

//毫秒级延时

void delay(unsigned int z)

{

        unsigned int x,y;

        for(x = z; x > 0; x--)

                for(y = 114; y > 0 ; y--);

}


void time0() interrupt 1   //定义定时器0

{

        IRtime++;                            //检测脉宽,1次为278us

}

void int0() interrupt 0                          //定义外部中断0

{

        static uchar i;                                 //        声明静态变量(在跳出函数后在回来执行的时候不会丢失数值)i用于把33次高电平的持续时间存入IRdata

        static bit startflag;                //开始储存脉宽标志位

        if(startflag)                                 //开始接收脉宽检测

        {

                if( (IRtime < 53) && (IRtime >= 32) ) /*判断是否是引导码,底电平9000us+高4500us        

                这个自己可以算我以11.0592来算了NEC协议的引导码低8000-10000+高4000-5000

                如果已经接收了引导码那么i不会被置0就会开始依次存入脉宽*/

                        i = 0;                                 //如果是引导码那么执行i=0把他存到IRdata的第一个位

                IRdata[i] = IRtime;                   //以T0的溢出次数来计算脉宽,把这个时间存到数组里面到后面判断

                IRtime = 0;                                 //计数清零,下一个下降沿的时候在存入脉宽

                i++;                                          //计数脉宽存入的次数

                if(i == 33)                                  //如果存入34次 数组的下标是从0开始i等于33表示执行了34次

                {

                         IRok = 1;                                 //那么表示脉宽检测完毕

                        i = 0;                                  //把脉宽计数清零准备下次存入

                }

        }

        else                  

        {

                IRtime = 0;                                  //引导码开始进入把脉宽计数清零开始计数

                startflag = 1;                         //开始处理标志位置1

        }

}

void IRcordpro()                                    //提取它的33次脉宽进行数据解码

{

        uchar i, j, k, cord, value;        /*i用于处理4个字节,j用于处理一个字节中每一位,k用于33次脉宽中的哪一位

        cord用于取出脉宽的时间判断是否符合1的脉宽时间*/

        k = 1;                                                 //从第一位脉宽开始取,丢弃引导码脉宽

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

        {

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

                {

                        cord = IRdata[k];            //把脉宽存入cord

                        if(cord > 5)                         //如果脉宽大于我11.0592的t0溢出率为约278us*5=1390那么判断为1

                        value = value | 0x80;        /*接收的时候是先接收最低位,

                        把最低位先放到value的最高位在和0x08按位或一下

                        这样不会改变valua的其他位的数值只会让他最高位为1*/

                        if(j < 7)

                        {

                                value = value >> 1;        //value位左移依次接收8位数据。

                        }

                        k++;                                //每执行一次脉宽位加1

                }

                IRcord[i] = value;           //每处理完一个字节把它放入IRcord数组中。

                value = 0;                            //清零value方便下次在存入数据

        }

        IRpro_ok = 1;                                   //接收完4个字节后IRpro ok置1表示红外解码完成        

}




void init_pwm()

{

  CCON = 0;

        CL = 0;

        CH = 0;

        CMOD = 0X08; //0X08:43KHZ // 0X02,22KHZ // 0X0A,10KHZ //

        CCAPM1        =0x42;//8位PWM输出,无中断

        CCAP1H=255;//占空比控制

        CCAP1L=255;

        CR=1;

}

//呼吸风


/**************************************

短延时

**************************************/

void delay5ms()   

{

    uchar i,v,k;

    for(i=1;i>0;i--)

        for(v=168;v>0;v--)

            for(k=22;k>0;k--);

}

/**************************************

写指令

**************************************/

void lcd_Write_com(uchar com)         

{

        RS=0;                        //定义指令寄存器

        RW=0;                                  //写允许

        P0=com;                                          //写指令

        delay5ms();        E=1;                //片选端上拉

        delay5ms();        E=0;                //下降沿锁存

}

/**************************************

写数据

**************************************/

[1] [2] [3] [4] [5]
关键字:51单片机  红外智能风扇  定时器 引用地址:基于51单片机的红外智能风扇程序

上一篇:51单片机霍尔传感器电机测速设计
下一篇:单片机数码管时钟电路图

推荐阅读

一般的寄存器访问需要通过读-改-写三步曲 和 位运算的清0置1来实现,但在stm32的编程中,通过利用它的一些优秀的特性如端口位设置/复位寄存BSRR、位绑定等,我们可以大大提升寄存器的访问速度和简化寄存器的操作。//一般寄存器操作:GPIOx->ODR |= 0x10; //Pin4置1GPIOx->ODR &= ~0x10; //Pin4清0BSRR/BRR寄存器 GPIOx->BSRR //对BSRR的低16位写...
全球领先的测试和测量设备管理公司Electro Rent (益莱储) 宣布,继续增加5G测试设备的投资3000万美元,以过去一年3倍的投资扩充其整个5G测试设备库存,以满足设备制造商和移动网络运营商不断增长的需求。 5G新标准相对于其前身的三个关键优势:更快的速率、更低的时延、更广的连接。这些特点都在扩大5G的适用性,从而为制造商打开新的市场机会。例如汽...
8月26日消息 今日起,苹果 Apple Pay 正式支持厦门 e 通卡,用户可以使用 Apple Pay 快捷交通模式便捷出行,在厦门乘坐公交、地铁和 BRT。通过 Apple Pay 快捷交通卡,通勤者不用再单独拿出实体卡,只需将 iPhone 的顶部或 Apple Watch 的显示屏靠近检票口扫描器中心处附近,即可通过 iPhone 或 Apple Watch 享受快速进站体验。整个...
随着“工业4.0”在全球范围内引发了新一轮工业转型竞赛,许多国家都在工业自动化领域逐步发力,拥抱智能化时代。作为该领域应用广泛且最重要的控制元件之一,继电器被赋予了更为艰巨的“使命”,既要尽可能小型化,又得保持高性能和高可靠性。 深耕工控领域多年的技术型分销商Excelpoint世健的产品经理Wilson Wang表示,有别于传统的工业用继电器,工业自...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved