历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2020年11月09日 | 51单片机风扇和测温程序

2020-11-09 来源:51hei

使用的模块有:直流电机,舵机,蜂鸣器,红外,温度传感器,lcd1602, ,


舵机,这种舵机它的频率是50HZ,一个周期为20ms,是通过一个周期中高低电平的占比来控制角度的角度的,本程序舵机是来回摆动,不是停在五个角度(0,45,90,135,180)的某个角度,可通过红外遥控来实现停在某个角度,电扇的开关,也由红外来控制。


为了方便起见,将过温自动报警,和使用舵机的功能,分成两种模式,可通过红外遥控来切换,因为我之前遇到过,使用了舵机后(需要用到定时器),温度就不能正常显示,

通过DS18b20来测温度,在lcd1602上显示温度和时间,当温度超过26度时(可在代码中修改),直流电机打开,蜂鸣器报警,低于26关闭。也可遥控打开或关闭电机,没有使用舵机,此时直流电机不能改变方向。


当遥控器按下时,lcd1602显示turn off,无法显示温度,定时器1初始化,舵机可以使用,利用舵机对直流电机来控制方向,将ds18b20和舵机分开使用的原因,ds18b20对时序的要求很高,如果用舵机的话就会使温度无法正常显示。


红外遥控的优先级始终大于超过温度。


单片机源程序如下:

#include "reg52.h"                         

#include"temp.h"

#include"1302.h"       

sbit  IRIN=P3^2;  //红外

sbit  duoji=P3^5;


uchar IrValue[6];//温度数组

uchar zxc,count=0,flag1=1,flag2,k,m;

uchar Disp[16]="trun off        ";

uchar push_val_left=14,pwm_val_left;

uint timer=0,flex;


uchar DisplayData[14]={'t'-0x30,'e'-0x30,'m'-0x30,'p'-0x30,':'-0x30,' '-0x30};

uchar code smgduan[10]={0,1,2,3,4,5,6,7,8,9};

void pwm_Servomoto_angle(unsigned int angle,unsigned int Servo_time)

{

                  push_val_left=5+angle*20/180;          //舵机向左转90度

                 // timer=0;

                  while(timer<=Servo_time); //延时400MS让舵机转到其位置                 4000

                  delay(flex);

}

void pwm_Servomoto(void)

{  


    if(pwm_val_left<=push_val_left)

               duoji=1;

        else

               duoji=0;

        if(pwm_val_left>=200)

        pwm_val_left=0;


}


void datapros(int temp)          

{

           float tp; uint h=4000;

        if(temp< 0)                                //当温度值为负数

          {

                DisplayData[0] = 0x40;           //   -

                //因为读取的温度是实际温度的补码,所以减1,再取反求出原码

                temp=temp-1;

                temp=~temp;

                tp=temp;

                temp=tp*0.0625*100+0.5;       

               


          }

        else

          {                       

                DisplayData[6] = 0x00;

                tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量

                //如果温度是正的那么,那么正数的原码就是补码它本身

                temp=tp*0.0625*100+0.5;       

               

        }

        if(flag2==0)

        if(temp>2600)

           {dj=1;

           while(h)

           {beep=~beep;

           delay(10);

                  h--;

                }

           }

        else

           dj=0;

        DisplayData[7] = smgduan[temp / 10000];

        DisplayData[8] = smgduan[temp % 10000 / 1000];

        DisplayData[9] = smgduan[temp % 1000 / 100] ;

        DisplayData[10] = -2;

        DisplayData[11] = smgduan[temp % 100 / 10];

        DisplayData[12] = smgduan[temp % 10];

        DisplayData[13] =51;

       

}

void test_servo(void)

{

int pos;

        for(pos=0;pos<180;pos+=3)

        {

               


       

                pwm_Servomoto_angle(pos,100) ;

                delay(300);

        }

        for(pos = 180; pos>=0; pos-=3)     // goes from 180 degrees to 0 degrees

        {

       

          pwm_Servomoto_angle(pos,100) ;

          delay(300);

        }

}

                                                                  

void LcdDisplay()

{

        lcdwrc(0x80+0X40);

        lcdwrd('t');

        lcdwrd('i');

        lcdwrd('m');

        lcdwrd('e');

        lcdwrd(':');

        lcdwrd(' ');

        lcdwrd('0'+hsp[2]/16);                                //时

        lcdwrd('0'+(hsp[2]&0x0f));                                 

        lcdwrd('-');

        lcdwrd('0'+hsp[1]/16);                                //分

        lcdwrd('0'+(hsp[1]&0x0f));       

        lcdwrd('-');

    lcdwrd('0'+hsp[0]/16);                                //秒

        lcdwrd('0'+(hsp[0]&0x0f));

}                                                                                          


                                                                //外部中断0初始化

void IrInit()          

{

        IT0=1;//下降沿触发

        EX0=1;//打开中断0允许

        EA=1;        //打开总中断


        IRIN=1;//初始化端口

}

                                //定时器1初始化

void timeinit()

{TMOD=0X10;

        TH1=(65536-100)/256;          //100US定时

        TL1=(65536-100)%256;

        TR1= 1;

        ET1= 1;

        EA = 1;

}               


                                //main函数

void main()

{uchar i,n=0;

IrInit(); //红外初始化

lcdinit();

Ds1302Init();


  dj=0;

while(1)

  {

    if(flag1==1)         //关闭定时器,实现功能为超过设定温度打开电机

       {  

             Ds1302ReadTime();

             datapros(Ds18b20ReadTemp());         //数据处理函数

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

              {               

               lcdwrd(DisplayData[i]+0x30);

              }

               LcdDisplay();

              lcdwrc(0x80);

           }

    else        //打开定时器,(电机舵机)关闭温度传感器,和lcd1602

            {  if(m==0)

                    { timeinit();

                      m=1;

                          dj=0;

                    }

                        test_servo();

                 for(n=0;n<16;n++)

               {

                    lcdwrd(Disp[n]);       

                }

                   lcdwrc(0x80+0x40);

                  for(n=0;n<16;n++)

                    { lcdwrd(' ');

推荐阅读

史海拾趣

ELESTA GmbH公司的发展小趣事

ELESTA一直注重生产效率和产品质量的提升。公司积极引入精益生产理念,通过优化生产流程、提高生产效率、降低生产成本等方式,不断提升产品竞争力和市场占有率。这一举措不仅为公司带来了显著的经济效益,也为整个电子行业树立了标杆。

Cermetek Microelectronics公司的发展小趣事

随着产品的推出,Cermetek Microelectronics公司开始注重品质管理。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到最终的产品测试,都经过严格的把控。这种对品质的执着追求,使得公司的产品在市场上获得了良好的口碑。同时,公司还积极拓展市场,与多家知名企业建立了合作关系,进一步提升了品牌影响力。

科通(COMTEK)公司的发展小趣事

在多年的努力下,科通技术逐渐成长为一家具有影响力的电子企业。为了进一步提升公司的竞争力和市场地位,科通技术积极筹备IPO上市。虽然公司在上市过程中遇到了一些波折和挑战,但最终成功实现了上市目标。未来,科通技术将继续坚持创新驱动、市场导向的发展战略,不断提升自身的核心竞争力,为客户提供更加优质的产品和服务。

请注意,由于篇幅限制,上述故事仅为简要概括,并未涵盖所有细节。同时,由于信息来源的不确定性,部分故事可能无法完全还原真实情况。

Freqtech Ohg公司的发展小趣事

随着业务的不断增长,Freqtech Ohg公司开始实施全球化战略。公司首先在欧洲建立了研发中心,随后在亚洲市场设立了生产基地和销售网络。通过整合全球资源,Freqtech不仅降低了生产成本,还更快速地响应了不同地区客户的需求。同时,公司积极参与国际展会和技术交流,不断提升品牌知名度和影响力,为公司的全球化发展奠定了坚实基础。

Ampire Co Ltd公司的发展小趣事

面对电子行业快速迭代的市场环境,Freqtech Ohg公司敏锐地察觉到传统业务面临的挑战。公司果断决定进行业务转型升级,从单一的高频电子元件生产向系统解决方案提供商转变。通过整合上下游产业链资源,Freqtech成功开发出了一系列针对特定应用场景的高频电子系统解决方案,如5G通信基站、卫星导航系统等。这一转型不仅为公司带来了新的增长点,还进一步巩固了其在行业内的领先地位。

Anytek Technology Corporation Ltd公司的发展小趣事

Anytek Technology Corporation Ltd自创立之初,便敏锐地捕捉到了车载电子产品的市场潜力。2003年,公司果断进军车载及行车记录仪领域,凭借前瞻性的市场洞察力和技术积累,迅速在行业内崭露头角。当时,随着汽车保有量的不断增加,行车记录仪作为保障行车安全、记录行车过程的重要设备,市场需求日益旺盛。Anytek凭借高品质的产品和专业的服务,赢得了广大消费者的信任和好评。

问答坊 | AI 解惑

关于PC电源——写在最后

补充一些内容 (仅针对工包,行货不管这些)一:输出滤波元件   (看不懂的可以不管这一部分)功率稍微大点(250W)的电源,输出的滤波线圈就是2个.再大点(400W以上)的一般都是3个.输出滤波电感通常位于电源的那一大堆出线附近. ...…

查看全部问答>

硬件工程师在硬件开发中要注意的事项

硬件工程师在硬件开发中要注意的事项 [ 2010-7-5 2:47:00 | By: szdiscuz ]   1 启动一个硬件开发项目       原始的推动力会来自于很多方面,比如市场的需要,基于整个系统架构的 ...…

查看全部问答>

WINCE下怎么诊断一个驱动有没存在资源锁死的问题?就是多个线程对同一个资源的访问同步互斥没做好。

WINCE下怎么诊断一个驱动有没存在资源锁死的问题?就是多个线程对同一个资源的访问同步互斥没做好。…

查看全部问答>

======WINCE6.0下这些异常怎么定位解决---Exception 'Undefined Instruction'++++Exception 'Pref

======WINCE6.0下这些异常怎么定位解决---Exception \'Undefined Instruction\'++++Exception \'Prefetch Abort\' ======…

查看全部问答>

Xilinx Spartan-6 FPGA SP605 Embedded Development Kit 试用报告 v1.0

Spartan-6 FPGA 嵌入式套件已试用完成,现已传递给下一位使用者,现在上报告!O(∩_∩)O~Xilinx Spartan-6 FPGA SP605 Embedded Development Kit试用报告 v1.0,目录如下: 报告前三节已基本完成,后三节将在v1.1中更新,谢谢!下载报告,请右击 ...…

查看全部问答>

LED照明与功率因数之间的关系

交流电流过负载时,加在该负载上的交流电压与通过该负载的交流电流产生相位差,人们便从中引出功率因数这一概念。人们生产、生活用电来自电网,电网提供频率为50Hz或60Hz的交流电。作为交流电的负载有电阻、电感、电容三种类型: 1、当交流电通过 ...…

查看全部问答>

引脚速度有何作用

                                 一直搞不明白,引脚速度有何作用呀,我想绝大部分作用有2M就足够了,还是有其它的意义,…

查看全部问答>

关于430F5438和电脑进行网口通信的若干问题

请问各位,怎么实现5438和电脑进行网口通信?我用的开发板是BW-DK5438的,上边的网口芯片是ENC28J60,怎么进行连接呢?用网络调试助手还是其他手段呢?在连接的时候,430的端口号和IP地址如何设定呢?谢谢了…

查看全部问答>

求助嵌入式系统题目

一.  填空题 1. 串行通信方式包括:                     和           & ...…

查看全部问答>