历史上的今天
返回首页

历史上的今天

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

正在发生

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

2020-08-26 来源:51hei

实用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;                //下降沿锁存

}

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

写数据

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

推荐阅读

史海拾趣

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

Alpha (Taiwan)公司的发展小趣事

随着全球电子市场的不断扩大,Alpha (Taiwan)公司积极寻求国际合作,拓宽市场渠道。公司与多家国际知名电子企业建立了战略合作关系,共同研发新产品,开拓新市场。此外,公司还积极参加国际电子展会,展示公司的最新技术和产品,吸引更多的潜在客户。这些国际合作的开展,不仅提升了公司的国际影响力,也为公司的长远发展注入了新的动力。

屹晶微(EG)公司的发展小趣事

屹晶微的创始人黄米龙,原本在发电厂从事电气运营工作长达八年。这段经历让他对电子领域有了深入的了解和浓厚的兴趣。然而,他并没有满足于现状,而是看到了中国芯片产业的巨大潜力和发展空间。于是,在2007年,他毅然决定从发电厂辞职,利用自己的积蓄和借来的资金,在台州创立了屹晶微电子有限公司。

在创立初期,屹晶微面临着资金短缺、技术落后和市场竞争激烈的困境。但黄米龙凭借对电子行业的深刻理解和坚定的信念,带领团队克服了种种困难。他们不断引进先进技术和设备,加强研发力量,提升产品质量。经过几年的努力,屹晶微逐渐在芯片设计领域崭露头角,并成功推出了多款具有自主知识产权的芯片产品。

Dionics Inc公司的发展小趣事

近年来,随着全球贸易环境的变化和市场竞争的加剧,Dionics Inc也面临着前所未有的挑战。然而,在公司管理层的坚强领导下,全体员工团结一心、共克时艰。公司不仅成功应对了各种挑战和困难,还通过一系列创新举措实现了业务的稳步增长。展望未来,Dionics Inc将继续坚持创新驱动的发展战略,努力成为电子行业的领军企业之一。

Component General Inc公司的发展小趣事

随着市场的不断发展和竞争的加剧,Component General Inc公司意识到只有不断创新才能在行业中立足。因此,公司加大了对研发的投入,积极引进先进的技术和设备。经过多年的努力,公司成功地推出了一系列具有创新性的产品,如衰减器、同轴端子等,这些产品不仅提高了公司的市场竞争力,也为客户提供了更优质的解决方案。

Artesyn Embedded Technologies公司的发展小趣事

随着5G技术的商用化,电子行业迎来了新的发展机遇。Artesyn Embedded Technologies敏锐地把握住了这一机遇,积极研发适应5G时代需求的电源和嵌入式计算解决方案。公司推出的新产品不仅满足了5G设备对高效、稳定电源的需求,也为公司在5G时代的发展奠定了坚实的基础。

问答坊 | AI 解惑

ucosii ver2.76源代码

ucosii ver2.76源代码…

查看全部问答>

大家来做个超小型直升飞机吧

重量要轻,在办公室玩一下也好…

查看全部问答>

2440WINCE下做用中断做了个按键驱动,却不知道在哪里加延时去抖.

2440WINCE下做用中断做了个按键驱动,却不知道在哪里加延时去抖. 在流驱动里开了一个线程 DWORD UserKeyProcessThread(void) {                 while(1)         {   &n ...…

查看全部问答>

有关8253工作模式的问题

8253处于方式5硬件触发选通方式下,对于Gate而言是要每次上升沿到来才会计数?还是说Gate从低电平调到高电平后,只要维持在高电平就会计数? 请高人指点一下,谢谢!…

查看全部问答>

摄相头驱动不了!!!

我有一宏基笔记本, 摄相头是本上原装的, 换了系统之后就不能用了?? 下载官方的驱动软件也驱动不了, 提示“该硬件无法驱动”。 郁闷几个星期了! 在网上搜索相关资料没一个合适的。 请有经验的师傅帮忙解决一下。…

查看全部问答>

如果获取Pin码的剩余的输入次数?

我在试着在PPC做一个改变PIN2码的东东 可是pin2码的输入次数是有限制的,我应该可以通过API获得我所剩余的输入次数.请问这个API是哪个,我需要怎么做才能获得这个次数呢?? PS: 我截获了SIMCAPS这个结构体的值,好像没多大用 3Q …

查看全部问答>

如何成为驱动程序开发高手?

小弟想学习驱动程序开发,但不知道如何入手?做人要踏实,做事也要踏实,小弟我想循序渐进的学习驱动开发,不求取巧,但求步步为营。那位高手给小弟指一条循序渐进学习驱动开发的明路,或者推荐一些教材,小弟不胜感激………

查看全部问答>

自已做的ULink一链就通了,非常开心与大家共享一下

                                 买了个壳装上,看着也像那么回事…

查看全部问答>

need you help!仿真器高手请进!

文字我用的是XDS510PP 仿真器,用SDConfig进行reset的时候 出现如下提示ERROR >> Invalid EEPROM byte count ERROR >> Invalid EEPROM checksum **Emulator is reset 用SDConfig进行test时提示: $$ EmuProductName=XDS510PP $ ...…

查看全部问答>