找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1050|回复: 2
收起左侧

我有一个4路18b20的程序,但是始终只有P口第一个口例如P2.0有温度显示,求大神帮忙

[复制链接]
ID:272852 发表于 2019-3-25 09:38 | 显示全部楼层 |阅读模式
/********************************************************
* 文件名  :main.c
* 描述    :stc15系列采集ds18b20温度数据,并从串口输出,采用的是11.0592M晶振,用P2口      
* 实验平台:IAP15w4k58S4
* 库版本  :
* 连接方式: 见连接图
* 注意    : 芯片上电后所有与PWM相关的IO口均为高阻态
             需将这些口设置为准双向口或强推挽模式方可正常使用
             相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
             P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
             另外还有P1.0/P1.4两个口在上电时为强推挽输出,程序
             初始化时也需将这两个口设置为弱上拉准双向口模式
* 作者    :12345678
**********************************************************************************/

#include "config.h"
#include "delay.h"
#include "uart.h"
#include "18B20.h"
/************* 功能说明 **************
******************************************/
/************* 本地常量声明 **************/

/************* 本地变量声明 **************/
u16 a=0;//测试用
/************* 本地函数声明 **************/

/*************  外部函数和变量声明 *****************/

/******************** IO配置函数 **************************/
void GPIO_config(void)
{
P5M0 = 0;   //设置准双向口
P5M1 = 0;
P2M0 = 0;  //P2口全部设置为准双向
P2M1 = 0;
}
/******************** 主函数 **************************/
void main(void)
{
u8 i = 0;
GPIO_config();
UartInit();

while(1)
{
  SendString("4路18B20温度 串口1测试!\r\n");
   for(i=0;i<4;i++)
  {
//  if(Ds18b20Init(i)){
     
                 a=Ds18b20ReadTemp(i);
  SendString("第 ");
  SendData(i+'1');
  SendString(" 路温度 : ");
  if(a/10000 == 1)
  {                             //如果万位为1,则表示温度为负
                  SendData('-');    //输出负号
  }                                
                 SendData(a%10000/1000+'0');               //十位
                 SendData(a%1000/100+'0');                 //个位
                 SendData('.');           //小数点
                 SendData(a%100/10+'0');                   //小数点后第一位
                 SendData(a%10+'0');                       //小数点后第二位
                 SendString("℃\r\n");
//  }else{         //想要不显示直接去除else这部分
//  SendString("第 ");
//  SendData(i+'1');
//  SendString("路温度  初始化失败请检测\r\n");
//    }
    }
  P55 = 0;
  delay_ms(250);
  delay_ms(250);
  delay_ms(250);
  delay_ms(250);
//  P55 = 1;
//  delay_ms(100);
//  P55 = 0;
//  delay_ms(100);
  P55 = 1;
  delay_ms(250);
  delay_ms(250);
  delay_ms(250);
  delay_ms(250);
  }
}
/**************************18B20*******************************/
#include "18B20.h"
#include<intrins.h>
#include "delay.h"
#define DS P2
#define set1(x) (0x01<<(x))
bit Ds18b20Init(u8 m)
{
    bit flag=1;
DS = 0;      
Delay600us();        
DS|=set1(m);      
Delay100us();        
flag=DS;
Delay600us();      
DS|=set1(m);
return (~flag);
}
void Ds18b20WriteByte(u8 dat,m)
{
u8 j;
    bit testb ;
for(j=0; j<8; j++)
{
  testb = dat&0x01;//取最低位   
  dat=dat>>1;   
  if(testb)     //置高 1   
  {   
   DS =0;        
   Delay1us();
   Delay1us();
   DS|=set1(m);
   Delay100us();   //>60us
  }
  else
  {
  DS =0;
  Delay100us(); //大于 60us 小于 120us
  DS|=set1(m);
  Delay1us();
  Delay1us();
  }
   }
}
u8 Ds18b20ReadByte(u8 m)
{
u8 byte, bi;
    u8 j;
for(j=8; j>0; j--)
{
  DS =0X00;
  Delay1us();
  DS|=set1(m);
  Delay6us();
  bi = DS;  
  byte = (byte >> 1) | (bi << 7);        
  Delay48us();   
}   
return byte;
}
void  Ds18b20ChangTemp(u8 m)
{
Ds18b20Init(m);
Delay1ms();
Ds18b20WriteByte(0xcc,m);     
Ds18b20WriteByte(0x44,m);     
Delay1ms();                     
   
}
void  Ds18b20ReadTempCom(u8 m)
{
Ds18b20Init(m);
Delay1ms();
Ds18b20WriteByte(0xcc,m);  
Ds18b20WriteByte(0xbe,m);  
}
int Ds18b20ReadTemp(u8 m)
{
int temp = 0;
u8 tmh, tml;
Ds18b20ChangTemp(m);   
Ds18b20ReadTempCom(m);   
tml = Ds18b20ReadByte(m);
tmh = Ds18b20ReadByte(m);  
if(tmh>0x7f)
    {
        tml=~tml;                    //补码转换,取反加一
        tmh=~tmh+1;  
        temp=100;
    }
    temp=temp+tmh*16+tml/16;
    temp=temp*100;
    temp=temp+((tml&0x0f)*10/16)*10;
    temp=temp+(tml&0x0f)*100/16%10;
    return (u16)(temp);
}



回复

使用道具 举报

ID:466164 发表于 2019-3-26 22:16 | 显示全部楼层
串4个要注意寻址,指器件地址,读也要器件地址。看看坛子里的。
单片机多路DS18B20测温报警proteus仿真及程序  

435
主题       
458
帖子       
1万
黑币
管理员
Rank: 9Rank: 9Rank: 9
收听TA 发消息       
电梯直达
跳转到指定楼层 楼主
51黑ff 发表于 2016-9-25 13:53 | 只看该作者 |只看大图 回帖奖励
单片机多路DS18B20测温报警proteus仿真及程序
http://www.51hei.com/bbs/dpj-56017-1.html
(出处: 单片机论坛)

回复

使用道具 举报

ID:272852 发表于 2019-3-29 12:41 | 显示全部楼层
7358655 发表于 2019-3-26 22:16
串4个要注意寻址,指器件地址,读也要器件地址。看看坛子里的。
单片机多路DS18B20测温报警proteus仿真及 ...

实在太感谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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