用s3c2410和ds18b20写的温度程序

mzdxn123 2015-07-06 02:29:26
刚开始学习arm,写的程序有问题,不知错在哪,希望大神能帮我看看哪出错了,我用的GPB2口和温度传感器DQ口相连;代码如下:

#include "2410addr.h"
#define U32 unsigned int
unsigned int x;
unsigned int flag;
/*******************延时函数1us***********************/
void delay1us(U32 time) //精确延时时间1us
{
U32 i;
for(;time>0;time--)
for(i=0;i<39;i++);
}

/*******************初始化DS18B20**********************/
void Init_DS18B20(void)
{
x=0;
rGPBCON=0x155559; //GPBCON配置成允许GPB2输出
rGPBDAT=rGPBDAT|0x004; //拉高GPB2
delay1us(10);
rGPBDAT=rGPBDAT&0x7fb; //DQ=0,总线主机发送一复位脉冲(>480us低电平)
delay1us(700); //延时大于480us
rGPBDAT=rGPBDAT|0x004; //拉高GPB2
delay1us(55); //DS18B20等待15~60us并发送(60~240us的低电平信号)
rGPBCON=0x155549; //允许GPB2输入
x=rGPBDAT&0x001; //判断是否有低电平信号输入
if(x==1)
uart_printf("DS18B20初始化失败!\n");
delay1us(300);
//rGPBCON=0x155559;//GPDCON配置成允许GPB2输出
//rGPBDAT=rGPBDAT|0x0004; //拉高GPB2

//delay1us(300);
}

/*****************读16位温度数字量其中的8位********************/
unsigned char ReadOneChar(void)
{
unsigned char dat=0;
unsigned int i;
rGPBCON=0x155559; //GPBCON配置成允许GPB2输出
for(i=8;i>0;i--)
{ dat>>=1;

// rGPBDAT=rGPBDAT|0x004;//DQ=1
// delay1us(2);
rGPBDAT=rGPBDAT&0x7fb; //DQ=0置低电平
delay1us(1); //数据线要保持1us以上的低电平
rGPBDAT=rGPBDAT|0x004;//DQ=1 读时间片结束给脉冲信号
delay1us(5);
rGPBCON=0x155549; //允许GPD2输入
if((rGPBDAT&&0x001)==1) //用于检测所读的字节中哪些位为1.
dat=dat|0x80; //从字节的低位读起
else
dat=dat&0x7f;
delay1us(60);

}
return (dat);
}
/************************************向DS18B20发送指令**************************/
void WriteOneChar(unsigned char dat)
{
unsigned char rDC;
unsigned int i;
rGPBCON=0x155559; //允许GPB2输出
for (i=8;i>0;i--)
{

rGPBDAT=rGPBDAT&0x7fb;//DQ=0置低电平,I/O线由高电平变低电平在15us~60us对I/O进行采集,高电平写1,低电平写0
delay1us(12);
rDC=dat&0x01;
dat=dat>>1;
if(rDC==1)
rGPBDAT=rGPBDAT|0x004; //DQ=1给脉冲信号
else
rGPBDAT=rGPBDAT&0x7fb;
delay1us(60);
rGPBDAT=rGPBDAT|0x004; //DQ=1 给脉冲信号
}

}

/*********************读取温度*********************************/
unsigned int ReadTemperature(void)
{

unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
unsigned int s1=0;
unsigned int s2=0;
Init_DS18B20();
if(x==0)
{


Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay1us(7500000); //750ms延时等待温度转换

Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0x5f); //温度设定11位

Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0xbe); //读取温度寄存器

a=ReadOneChar(); //读寄存器低八位
b=ReadOneChar(); //读寄存器高八位
t=b;
t=t<<8;
t=t|a;
if(t>0x3ff) //最高有效位为符号位,实际数据位为10位
{
t=~t+1;
flag=1;
}
t=t*0.125; //温度整数部分;
s1=(a&0x07)*10/8; //小数第一位;
s2=(a&0x07)*100/8%10;//小数第二位;
}
return t ;

}


...全文
257 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mzdxn123 2015-07-06
  • 打赏
  • 举报
回复
就是在主函数里调用一下,通过串口想显示温度,可是输出的都是0,不知哪有错误,是不是时序有问题?
91program 2015-07-06
  • 打赏
  • 举报
回复
这是没有 WinCE 系统的?裸机运行的?

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧