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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3444|回復: 9
打印 上一主題 下一主題
收起左側

單片機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;
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:378182 發表于 2019-2-20 19:19 | 只看該作者
<temp.h>的內容是什么?無法判別ds18b20readtemp()的定義是否正確。
回復

使用道具 舉報

板凳
ID:164602 發表于 2019-2-20 19:54 | 只看該作者
你的電機是直接接在VCC和IO口P10上的吧?!
51單片機的IO口電流是很小的,不足以帶動直流電機的。
要想直流電機轉動,都要用到電機驅動芯片,常用的有L298N等(這個我用得最多)。
回復

使用道具 舉報

地板
ID:473410 發表于 2019-2-21 10:14 | 只看該作者
HC6800-ES-V2.0 發表于 2019-2-20 19:54
你的電機是直接接在VCC和IO口P10上的吧?!
51單片機的IO口電流是很小的,不足以帶動直流電機的。
要想直 ...

可以帶動直流電機轉動,但是不能達到溫度達到臨界值就使電機停下的效果
回復

使用道具 舉報

5#
ID:164602 發表于 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度
回復

使用道具 舉報

6#
ID:473410 發表于 2019-2-21 14:56 | 只看該作者
HC6800-ES-V2.0 發表于 2019-2-21 14:13
找到你的問題了——可能
看看你的程序中的顯示部分
顯示的溫度是一個保留兩位小數且四舍五入的值,即tp ...

額,是我寫的,這個地方應該是算錯了,還好找到問題了
回復

使用道具 舉報

7#
ID:432823 發表于 2019-2-21 21:29 | 只看該作者
從程序看da18b20測出轉換好的溫度值是temp在數碼上顯示,而ds18b20readtemp()是直接讀出的補碼形式的,20度時并不等于2000.
回復

使用道具 舉報

8#
ID:495702 發表于 2019-5-19 23:03 | 只看該作者
  displaydata[0]=0x40;問一下這句啥意思
回復

使用道具 舉報

9#
ID:213173 發表于 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. }
復制代碼



回復

使用道具 舉報

10#
ID:511890 發表于 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)。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩日在线观看视频 | 欧美日韩一区在线 | 日韩中文一区二区三区 | 午夜a√| 三级成人在线观看 | 国产成人jvid在线播放 | 狠狠爱视频 | 91精品国产欧美一区二区成人 | 成人网址在线观看 | 91成人免费看 | 亚洲综合视频 | 免费在线看黄 | 毛片视频观看 | 色资源在线 | 国产精品日韩一区二区 | 91n成人 | 在线视频一区二区三区 | 久久蜜桃av一区二区天堂 | 成人黄色三级毛片 | 亚洲精品欧美一区二区三区 | 欧美激情国产日韩精品一区18 | 久久高清 | 国产精品区一区二区三区 | 亚洲国产成人精 | 亚洲永久 | 国产精品一区二区久久久久 | 99久久亚洲 | 成人精品视频免费 | 一区二区三区视频在线观看 | 91中文字幕在线观看 | 中文字幕日韩一区二区 | 蜜臀久久 | 精品久久久久久亚洲精品 | 欧美 日韩 视频 | 亚洲成人播放器 | 曰韩一二三区 | 欧美日产国产成人免费图片 | 一区中文字幕 | 久久婷婷国产麻豆91 | 欧美黄视频 | 欧美综合久久久 |