找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2305|回复: 13
收起左侧

DS18B20和步进电机为啥不会转呢?

[复制链接]
回帖奖励 200 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
ID:241873 发表于 2017-12-27 10:02 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uint        unsigned        int
#define        uchar        unsigned        char       
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}
sbit DSPORT=P3^7;
sbit A1=P1^0;
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
uchar Speed;
void Delay1ms(uint y);
void Delay1ms(uint y)
{
uint x;
for(y;y>0;y--)
   for(x=110;x>0;x--);
}



unsigned char Ds18b20Init()
{
        unsigned int i;
        DSPORT=0;                       
        i=70;        
        while(i--);
        DSPORT=1;                       
        i=0;
        while(DSPORT)      
        {
                i++;
                if(i>5000)
                        return 0;   
        }
        return 1;
}



void Ds18b20WriteByte(unsigned char dat)
{
        unsigned int i,j;
        for(j=0;j<8;j++)
        {
                DSPORT=0;                        
                i++;
                DSPORT=dat&0x01;
                i=6;
                while(i--);
                DSPORT=1;      
                dat>>=1;
        }
}



unsigned char Ds18b20ReadByte()
{
        unsigned char byte,bi;
        unsigned int i,j;        
        for(j=8;j>0;j--)
        {
                DSPORT=0;
                i++;
                DSPORT=1;
                i++;
                i++;
                bi=DSPORT;        

                byte=(byte>>1)|(bi<<7);                                                  
                i=4;               
                while(i--);
        }                                
        return byte;
}
void  Ds18b20ChangTemp()
{
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);                             
        Ds18b20WriteByte(0x44);         


}


void  Ds18b20ReadTempCom()
{        

        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);        
        Ds18b20WriteByte(0xbe);         
}

int Ds18b20ReadTemp()
{
        int temp=0;
        unsigned char tmh,tml;
        Ds18b20ChangTemp();                                 
        Ds18b20ReadTempCom();                        
        tml=Ds18b20ReadByte();               
        tmh=Ds18b20ReadByte();               
        temp=tmh;
        temp<<=8;
        temp|=tml;
        return temp;
}



void        main()
{
        unsigned int tp,j,i;
        tp=Ds18b20ReadTemp;
        Speed=2;
       
    while(1)
        {
                if(tp>=20)
                {      
         Coil_A1      
     Delay1ms(Speed);
     Coil_AB1               
     Delay1ms(Speed);         
         Coil_B1      
      Delay1ms(Speed);
     Coil_BC1
       Delay1ms(Speed);
         Coil_C1      
       Delay1ms(Speed);
     Coil_CD1
      Delay1ms(Speed);
         Coil_D1      
      Delay1ms(Speed);
     Coil_DA1
     Delay1ms(Speed);

                        Coil_OFF;
                        for(i=0;i<10;i++)        
                        {
                                for(j=0;j<60;j++)
                                {
                                        Delay1ms(1000);
                                }
                        }
                }        
        }
   }
}

回复

使用道具 举报

ID:78322 发表于 2017-12-27 15:01 | 显示全部楼层
从程序看,你是采样的温度值大于20,就会启动马达,而且,你的温度只采样一次,如果一开始的值小于20,步进电机就不会动。
回复

使用道具 举报

ID:84283 发表于 2017-12-27 15:27 | 显示全部楼层
ds18b20你没让它工作,导致tp接收不到。
回复

使用道具 举报

ID:117053 发表于 2017-12-27 16:45 | 显示全部楼层
从程序上分析的话,会不会是因为你的温度没有达到要求,所以导致DS18B20和步进电机不转动。
回复

使用道具 举报

ID:241873 发表于 2017-12-27 19:23 | 显示全部楼层
立里 发表于 2017-12-27 15:01
从程序看,你是采样的温度值大于20,就会启动马达,而且,你的温度只采样一次,如果一开始的值小于20,步进 ...

可以这样说 我想做的是温度大于这个就可以开始工作 不知道咋样修改 了 可以帮下忙吗
回复

使用道具 举报

ID:241873 发表于 2017-12-27 19:23 | 显示全部楼层
qq1105424012 发表于 2017-12-27 15:27
ds18b20你没让它工作,导致tp接收不到。

这个就尴尬了 有啥办法修改一下吗
回复

使用道具 举报

ID:84283 发表于 2017-12-27 19:47 | 显示全部楼层
湮灭GG 发表于 2017-12-27 19:23
这个就尴尬了 有啥办法修改一下吗

把18B20 采集温度的函数放在while中,让它一直执行从而改变得到tp的数值,20摄氏度以上就转。  
回复

使用道具 举报

ID:84283 发表于 2017-12-27 19:49 | 显示全部楼层
湮灭GG 发表于 2017-12-27 19:23
这个就尴尬了 有啥办法修改一下吗

也就是这个函数 Ds18b20ReadTemp()
回复

使用道具 举报

ID:241873 发表于 2017-12-28 10:10 | 显示全部楼层
qq1105424012 发表于 2017-12-27 19:49
也就是这个函数 Ds18b20ReadTemp()

尴尬了 我把这个放进去之后还是没反应。
回复

使用道具 举报

ID:267813 发表于 2017-12-28 11:33 | 显示全部楼层
void        main()
{
        unsigned int tp,j,i;
        tp=Ds18b20ReadTemp;
        Speed=2;
        
tp=Ds18b20ReadTemp();
这个地方有点语法错误哈,否则你是根本没有采集温度,温度为0,步进电机当然不动啦
回复

使用道具 举报

ID:267813 发表于 2017-12-28 11:35 | 显示全部楼层
改为:
        
        Speed=2;
    while(1)
        {
        tp=Ds18b20ReadTemp();
再试试
        
回复

使用道具 举报

ID:241873 发表于 2017-12-28 15:14 | 显示全部楼层
zzzxxxccc 发表于 2017-12-28 11:33
void        main()
{
        unsigned int tp,j,i;

这个需要咋样修改
回复

使用道具 举报

ID:268407 发表于 2017-12-28 16:29 | 显示全部楼层
温度多高啊 ,温度没有达到要求。
回复

使用道具 举报

ID:262845 发表于 2017-12-30 12:05 | 显示全部楼层
采集温度和驱动要控时序,交差驱动,不能同时控制。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表