历史上的今天
返回首页

历史上的今天

今天是:2024年11月27日(星期三)

正在发生

2020年11月27日 | 单片机温控红外遥控风扇源程序 舵机对直流电机控制方向

2020-11-27 来源:51hei

通过DS18b20来测温度,在lcd1602上显示温度和时间,时间初始值设为18:30,当温度超过26度时,直流电机打开,蜂鸣器报警,低于26关闭。也可遥控打开或关闭电机,没有使用舵机,此时直流电机不能改变方向。

当遥控器按下时,lcd1602显示turn off,无法显示温度,定时器1初始化,舵机可以使用,利用舵机对直流电机来控制方向,只有0,45,90,135,180,五个角度可以选。


将ds18b20和舵机分开使用的原因,ds18b20对时序的要求很高,如果用舵机的话就会使温度无法正常显示,


遇到的问题:


刚开始是直接在main函数里面使用舵机和温度传感器,发现温度显示不了,然后我想的在main函数用舵机,然后再用一个定时器,每隔一定时间显示温度,这样用到两个定时器,需要考虑优先级,舵机用定时器1,温度用定时器0,这样才能每隔一定时间刷新温度,但是这样发现舵机和温度都不能正常工作,我认为,因为舵机要保持一个角度话,必须持续给他该角度下的脉冲,两个定时器可能冲突了,


然后我就将两个东西分开用,在两者之间来回切换,在用完舵机,准备用18b20的时候,就令TR1=0;可是这样做温度还是显示不了,而且在关定时器的同时,我还重新初始化18b20和lcd1602,还是没用,但是如果按下复位键的话,就可以显示,在网上找了很久也提问了没有结果,我试过用串口打印ds18b20i/o的值,发现如果没切换,可以打印温度,切换后就没有值打印出来,于是我就想能不能在按下遥控上的键就执行软件复位,但是有人说,51不能软件复位,我最后居然想的是,(我看开发板原理图,发现复位键按下时,RST管脚就为高电平,RST管脚默认为低电平),我用一根杜邦线,一端接在RST上,另一端就随便接在一个管脚上P1^1,通过改变P1^1的电平,来改变RST的电压,但是给P1^1高电平的时候,并没有复位,有人说,可能是电压不够。我分别测了一下,它的对地电压只有2.4v的样子。


复位按键下两端的电压大约4.8v左右,确实是电压不不够,我想升压,我想起来有些管脚它是本身开发板就给他加了上拉电阻,看了原理图,测了一下其中一个电压,果然有4.4v,我把它接到RST的时候,就复位了,但是我这样做发现,在程序中一但执行复位后,它会一直复位,比如P3^6=1;//复位delay(1000);P3^6=0;//P3^6管脚有上拉电阻。在它复位后,P1^1=0;根本没机会执行;而P3^6默认为高电平。这种方法就不行。


我最后就打算手动复位,我准备加上ds1302,让1302和温度同时显示,发现温度又用不了,我在网上看到有一些人也是同样的问题,但是在一个论坛里面,有人说在1302读温度的时候,在最后,让CE=1;就可以了,不过他也不知道原因,百度上显示ds1302有些是CE,有些是RST,RST是CE的旧称,我试了一下,发现可以,而且把之前切换后不能显示的问题也解决了,就是不知道原因。到这里我要做的就基本完成了。


待改进:

最需要改进两个地方

1.直流电机的速度没能实现调节

2.舵机的角度不能为任意角度转动



单片机源程序如下:

#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();

推荐阅读

史海拾趣

DIOO公司的发展小趣事

DIOO公司的创始人李奥(Leo)是一位热衷于电子技术的工程师。在20世纪80年代初,他看到了电子行业的巨大潜力,并决定创立DIOO公司,专注于开发和生产高端电子产品。凭借对技术的热爱和对市场的敏锐洞察,李奥带领DIOO公司推出了第一款自主研发的电子产品——高性能音频放大器,该产品凭借其卓越的性能和独特的设计在市场上引起了轰动。

GWP Group公司的发展小趣事

DIOO公司的创始人李奥(Leo)是一位热衷于电子技术的工程师。在20世纪80年代初,他看到了电子行业的巨大潜力,并决定创立DIOO公司,专注于开发和生产高端电子产品。凭借对技术的热爱和对市场的敏锐洞察,李奥带领DIOO公司推出了第一款自主研发的电子产品——高性能音频放大器,该产品凭借其卓越的性能和独特的设计在市场上引起了轰动。

Daco Semiconductor Co Ltd公司的发展小趣事

在快速发展的过程中,Daco始终注重产品品质和用户体验。公司建立了严格的质量管理体系,对每一批产品都进行严格的检测和测试,确保产品的性能和质量达到客户的要求。同时,Daco也积极倾听客户的反馈和建议,不断改进产品和服务。这种对品质和用户体验的执着追求,使得Daco在客户中树立了良好的口碑。

Advanced Microelectronic Products Inc公司的发展小趣事

Advanced Microelectronic Products Inc(以下简称AMP公司)在电子行业中崭露头角,源于其一次关键的技术突破。公司研发团队成功开发出一种新型高效能、低功耗的芯片,该芯片在智能手机市场具有广阔的应用前景。凭借这一技术优势,AMP公司迅速与多家手机制造商建立合作关系,实现了市场的大规模扩张。公司随后进一步加大研发投入,不断推出创新产品,巩固了其在行业内的领先地位。

ERA Transformers公司的发展小趣事

在电子行业中,ERA Transformers公司以其开创性的技术而闻名。该公司专注于研发和生产高效的电子变压器,以满足不断增长的电子设备需求。在一次研发过程中,公司工程师们面临了一个重大挑战:如何提高变压器的能效和稳定性。经过数月的深入研究与反复试验,他们终于开发出了一种新型的高效能变压器,该变压器采用了先进的材料和独特的设计,显著提高了能效和稳定性,这一创新技术的突破使得ERA Transformers公司在电子行业中崭露头角。

Deutronic Elektronik GmbH公司的发展小趣事

为了进一步提升竞争力,Deutronic Elektronik GmbH开始实施全球化战略。公司在美国和中国设立了子公司,并通过并购等方式加强了在欧洲和亚洲市场的布局。这些举措不仅增强了公司的市场影响力,还为公司带来了更多的资源和优势。通过全球化战略的实施,Deutronic Elektronik GmbH逐渐成为一家具有全球影响力的电子科技企业。

问答坊 | AI 解惑

ARE C

ARM  的C语言编程!…

查看全部问答>

谈谈单片机和你的梦想

我来这里学习是为了实现我参军的梦想,我要去的地方和单片机息息相关。我要穿上那白色的制服,实现自己的价值,为理想去战斗!所以单片机就是我现在的武器,为了我梦中的战斗生活开路!…

查看全部问答>

国产示波器的架构

输入的电压信号经耦合电路后送至前端放大器,前端放大器将信号放大,以提高示波器的灵敏度和动态范围。放大器输出的信号由取样/保持电路进行取样,并由A/D转换器数字化,经过A/D转换后,信号变成了数字形式存入内存中,微处理器对内存中的数字化信 ...…

查看全部问答>

红外遥控系统原理及单片机解码实例

本帖最后由 paulhyde 于 2014-9-15 03:23 编辑 红外解码,希望对大家有用。  …

查看全部问答>

三垦模块

系列功率模块资料…

查看全部问答>

我有个板子加了复位程序,搞不清楚在哪复位,帮忙分析下

EEWORLD合作qq群:49900581群主:wangkj 情况是这样的,我接上负载,他就会复位,不接负载,他就不复位,你们看,这是哪里复位呢? 我开始是怀疑电源引起的复位…

查看全部问答>

关于vhdl程序包1164的用法

问下各位:     在下面的代码中,为什么要用1164这个程序包?代码中并没有标准逻辑等数据类型啊? 谢谢.    LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;   ENTITY control_stmts IS PORT (a, b, c: IN BOOLEAN ...…

查看全部问答>

ARM片内RAM问题

我有块芯片是ARM9EJS的SOC,现在想问下,ARM9EJS是否有片内RAM,我怎么确认其是否可用?从NOR FLASH启动后在片内RAM中建立C环境,然后运行C代码方案是否可行,如果可行是否有什么需要注意的,比如同片外RAM运行C代码有什么不同?…

查看全部问答>

菜鸟问题:模组和解决方案有什么区别啊?

有朋友用EDGE的模组就可以做数据卡,我搞不清楚这和解决方案有什么区别。 请尽量说的详细一点。 多谢了。…

查看全部问答>

wince4.2與wince5.0與wince6.0的差異?

使用wince4.2的bsp如果要移植到wince5.0或6.0 是不是要大幅改寫driver或什麼的,之間的使用方式 是否通用 thx…

查看全部问答>