久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機DS18B20導入溫度來控制電機程序,哪里出錯了 [打印本頁]

作者: 放眼天下    時間: 2019-2-20 18:35
標題: 單片機DS18B20導入溫度來控制電機程序,哪里出錯了
我想在主程序中設置一個溫度臨界值(20度),通過DS18B20傳感器來獲取溫度并顯示在數碼管上,達到臨界值之后,使電機轉動,但是實際情況是達到了20度也不能讓電機停止轉動,這是為什么?初學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    時間: 2019-2-20 19:19
<temp.h>的內容是什么?無法判別ds18b20readtemp()的定義是否正確。

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

可以帶動直流電機轉動,但是不能達到溫度達到臨界值就使電機停下的效果
作者: HC6800-ES-V2.0    時間: 2019-2-21 14:13
放眼天下 發表于 2019-2-21 10:14
可以帶動直流電機轉動,但是不能達到溫度達到臨界值就使電機停下的效果

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

額,是我寫的,這個地方應該是算錯了,還好找到問題了
作者: yaoji123    時間: 2019-2-21 21:29
從程序看da18b20測出轉換好的溫度值是temp在數碼上顯示,而ds18b20readtemp()是直接讀出的補碼形式的,20度時并不等于2000.
作者: 風華少年    時間: 2019-5-19 23:03
  displaydata[0]=0x40;問一下這句啥意思
作者: wulin    時間: 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)//計數延時
  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. }
復制代碼




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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 自拍视频网站 | www.色综合| 日日夜夜精品 | a爱视频| 91精品国产91久久久久久最新 | 国产真实精品久久二三区 | 99久久国产精 | 亚洲香蕉在线视频 | 亚洲一区在线日韩在线深爱 | 亚洲在线中文字幕 | 99精品免费视频 | av在线一区二区三区 | 成人免费视频网站在线看 | 亚洲有码转帖 | 欧美一二三四成人免费视频 | 欧美激情视频一区二区三区免费 | 国产91av视频 | 欧美综合自拍 | 国产一级免费视频 | 日韩精品久久一区二区三区 | 亚洲精品久久久蜜桃 | 亚洲一区在线播放 | 久久久久午夜 | 国产精品日女人 | 成人一区二区三区在线观看 | 国产片侵犯亲女视频播放 | 免费黄色大片 | 精品欧美一区二区三区精品久久 | 欧美在线观看一区 | 国产精品日韩欧美一区二区 | 亚洲国产精品成人久久久 | 麻豆亚洲 | 亚洲精品av在线 | 欧美成人a | 久久夜视频 | 天天干天天操天天射 | 国产精品夜夜夜一区二区三区尤 | 午夜电影日韩 | 特a毛片| 蜜月aⅴ国产精品 | 伦理二区 |