欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)DS18B20導(dǎo)入溫度來控制電機(jī)程序,哪里出錯了 [打印本頁]

作者: 放眼天下    時(shí)間: 2019-2-20 18:35
標(biāo)題: 單片機(jī)DS18B20導(dǎo)入溫度來控制電機(jī)程序,哪里出錯了
我想在主程序中設(shè)置一個溫度臨界值(20度),通過DS18B20傳感器來獲取溫度并顯示在數(shù)碼管上,達(dá)到臨界值之后,使電機(jī)轉(zhuǎn)動,但是實(shí)際情況是達(dá)到了20度也不能讓電機(jī)停止轉(zhuǎn)動,這是為什么?初學(xué)51,請多指教!
以下為主程序:
#include<reg52.h>
#include<temp.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit PWM=P1^0;

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 num=0,displaydata[8];


void delay(u16 i)
{
        while(i--);
}

void datapros(int temp)
{
        float tp;
        if(temp<0)
        {
                displaydata[0]=0x40;
                temp-=1;
                temp=~temp;
                tp=temp;
                temp=tp*0.0625*100+0.5;                        
        }
        else
        {
                displaydata[0]=0x00;
                tp=temp;
                temp=tp*0.0625*100+0.5;                        
        }

        displaydata[1]=smgduan[temp/10000];
        displaydata[2]=smgduan[temp%10000/1000];
        displaydata[3]=smgduan[temp%10000%1000/100]|0x80;
        displaydata[4]=smgduan[temp%100/10];
        displaydata[5]=smgduan[temp%100%10];
}

void digdisplay()
{
        u8 i;
        for(i=0;i<6;i++)
        {
                switch(i)
                {
                        case(0):LSA=0;LSB=0;LSC=0;break;
                        case(1):LSA=1;LSB=0;LSC=0;break;
                        case(2):LSA=0;LSB=1;LSC=0;break;
                        case(3):LSA=1;LSB=1;LSC=0;break;
                        case(4):LSA=0;LSB=0;LSC=1;break;
                        case(5):LSA=1;LSB=0;LSC=1;break;
                }
                P0=displaydata[5-i];
                delay(50);
                P0=0x00;
        }
}

void main()
{
        while(1)
        {
                datapros(ds18b20readtemp());
                digdisplay();
                if(ds18b20readtemp()>=2000)         //20度
                        PWM=0;
                else
                        PWM=1;
        }
}



作者: znz43a    時(shí)間: 2019-2-20 19:19
<temp.h>的內(nèi)容是什么?無法判別ds18b20readtemp()的定義是否正確。

作者: HC6800-ES-V2.0    時(shí)間: 2019-2-20 19:54
你的電機(jī)是直接接在VCC和IO口P10上的吧?!
51單片機(jī)的IO口電流是很小的,不足以帶動直流電機(jī)的。
要想直流電機(jī)轉(zhuǎn)動,都要用到電機(jī)驅(qū)動芯片,常用的有L298N等(這個我用得最多)。
作者: 放眼天下    時(shí)間: 2019-2-21 10:14
HC6800-ES-V2.0 發(fā)表于 2019-2-20 19:54
你的電機(jī)是直接接在VCC和IO口P10上的吧?!
51單片機(jī)的IO口電流是很小的,不足以帶動直流電機(jī)的。
要想直 ...

可以帶動直流電機(jī)轉(zhuǎn)動,但是不能達(dá)到溫度達(dá)到臨界值就使電機(jī)停下的效果
作者: HC6800-ES-V2.0    時(shí)間: 2019-2-21 14:13
放眼天下 發(fā)表于 2019-2-21 10:14
可以帶動直流電機(jī)轉(zhuǎn)動,但是不能達(dá)到溫度達(dá)到臨界值就使電機(jī)停下的效果

找到你的問題了——可能
看看你的程序中的顯示部分
顯示的溫度是一個保留兩位小數(shù)且四舍五入的值,即tp*0.0625*100+0.5
再看看你的電機(jī)停轉(zhuǎn)判斷 if(ds18b20readtemp()>=2000)         //20度
知道了吧,你的判斷語句中的溫度,是2000*0.625=125度,不是20度——呵呵,不是你的程序吧,所以不知道這個。
20度應(yīng)該是 if(ds18b20readtemp()>=320)         //20度
作者: 放眼天下    時(shí)間: 2019-2-21 14:56
HC6800-ES-V2.0 發(fā)表于 2019-2-21 14:13
找到你的問題了——可能
看看你的程序中的顯示部分
顯示的溫度是一個保留兩位小數(shù)且四舍五入的值,即tp ...

額,是我寫的,這個地方應(yīng)該是算錯了,還好找到問題了
作者: yaoji123    時(shí)間: 2019-2-21 21:29
從程序看da18b20測出轉(zhuǎn)換好的溫度值是temp在數(shù)碼上顯示,而ds18b20readtemp()是直接讀出的補(bǔ)碼形式的,20度時(shí)并不等于2000.
作者: 風(fēng)華少年    時(shí)間: 2019-5-19 23:03
  displaydata[0]=0x40;問一下這句啥意思
作者: wulin    時(shí)間: 2019-5-20 13:45


  1. #include <AT89X52.H>
  2. #include<temp.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. sbit PWM=P1^0;

  9. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  10. u8 displaydata[8];
  11. u16 num=0;
  12. /*
  13. void delay(u16 i)
  14. {
  15.         while(i--);
  16. }*/

  17. void datapros(int temp)
  18. {
  19.         float tp;
  20.         if(temp<0)
  21.         {
  22.                 displaydata[0]=0x40;
  23.                 temp-=1;
  24.                 temp=~temp;
  25.                 tp=temp;
  26.                 temp=tp*0.0625*100+0.5;
  27.         }
  28.         else
  29.         {
  30.                 displaydata[0]=0x00;
  31.                 tp=temp;
  32.                 temp=tp*0.0625*100+0.5;
  33.         }
  34.         num=temp;//暫存
  35.         displaydata[1]=smgduan[temp/10000%10];
  36.         displaydata[2]=smgduan[temp/1000%10];
  37.         displaydata[3]=smgduan[temp/100%10]|0x80;
  38.         displaydata[4]=smgduan[temp/10%10];
  39.         displaydata[5]=smgduan[temp%10];
  40. }

  41. void digdisplay()
  42. {
  43.         static u8 i=0;
  44.         P0=0x00;
  45.         switch(i)
  46.         {
  47.                 case(0):LSA=0;LSB=0;LSC=0;break;
  48.                 case(1):LSA=1;LSB=0;LSC=0;break;
  49.                 case(2):LSA=0;LSB=1;LSC=0;break;
  50.                 case(3):LSA=1;LSB=1;LSC=0;break;
  51.                 case(4):LSA=0;LSB=0;LSC=1;break;
  52.                 case(5):LSA=1;LSB=0;LSC=1;break;
  53.         }
  54.         P0=displaydata[i];
  55.         i++;
  56.         i%=6;
  57. }

  58. void main()
  59. {
  60.         u8 j;
  61.         while(1)
  62.         {
  63.                 if(++j>=250)//計(jì)數(shù)延時(shí)
  64.                 {
  65.                         j=0;
  66.                         datapros(ds18b20readtemp());
  67.                 }
  68.                 digdisplay();
  69.                 if(num>=2000)         //20度
  70.                         PWM=0;
  71.                 else
  72.                         PWM=1;
  73.         }
  74. }
復(fù)制代碼




作者: 幻劍心    時(shí)間: 2019-5-20 14:46
if(ds18b20readtemp()>=2000)這一句錯了。我把2000代入temp=tp*0.0625*100+0.5; 得到12500.5。這個應(yīng)該是125°。把2000改成312應(yīng)該就沒問題了。不過最好的解決辦法是在sbit PWM=P1^0;后面加一個變量int int temp1;在datapros里面最后面加:temp1 = temp/100;
最后把 if(ds18b20readtemp()>=2000)改為 if(temp1>=20)。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1