DS18B20 的温度问题
FL2440的板子 ,读取ds18b20的温度完全不正常,全部为0,自带的光盘资料里面的ADS实验代码下载进去,读出来的温度也是乱码,但是Test的二进制文件下载进去是可以读出来的,有人遇见这种情况吗?怎么解决的 不会吧楼主,您可以吧源码贴出来吗? /**********************实验*********************************/// 公司名称 :保定飞凌嵌入式技术有限公司
// 描 述 :温度传感器试验,由串口打印采集数据
// 版 权 :保定飞凌嵌入式技术有限公司
// 网 址 :www.witech.com.cn
/***************************************************************/
/*-------------------------地址声明----------------------------*/
#define GPGCON (*(volatile unsigned *)0x56000060) //18b20寄存器设置
#define GPGDAT (*(volatile unsigned *)0x56000064)
#define GPGUP (*(volatile unsigned *)0x56000068)
#define UFCON0 (*(volatile unsigned *)0x50000008) //串口寄存器设置
#define UMCON0 (*(volatile unsigned *)0x5000000c)
#define ULCON0 (*(volatile unsigned *)0x50000000)
#define UCON0 (*(volatile unsigned *)0x50000004)
#define UBRDIV0 (*(volatile unsigned *)0x50000028)
#define UTRSTAT0 (*(volatile unsigned *)0x50000010)
#define UTXH0 (*(volatile unsigned*)0x50000020)
#define URXH0 (*(volatile unsigned*)0x50000024)
/*-------------------------变量定义----------------------------*/
unsigned char wd;
unsigned int sdata; //测量到的温度的整数部分
unsigned char xiaoshu1; //小数第一位
unsigned char xiaoshu2; //小数第二位
unsigned char xiaoshu; //两位小数
/*-------------------------函数声明----------------------------*/
void zh(void);
void Delay(unsigned int x) ;
void uart(void);
void DS18B20PRO(void);
void dmsec (unsigned int t);
void tmreset (void);
unsigned char tmrbit (void);
unsigned char tmrbyte (void) ;
void tmwbyte (unsigned char dat);
void tmstart (void) ;
void tmrtemp (void) ;
/*-------------------------------------------------------------/
函数名称: Main
功能描述: 入口函数
不停循环检测温度值,并转换为asc||码,通过串口传出来
传 参: 无
返 回 值: int
--------------------------------------------------------------*/
int Main(void)
{
while(1)
{
DS18B20PRO();
zh();
uart();
Delay(30);
}
return(0);
}
/*-------------------------------------------------------------/
函数名称: dmsec
功能描述: 精确延时函数
传 参: unsigned int t
返 回 值: 无
--------------------------------------------------------------*/
void dmsec(unsigned int t) //精确延时函数
{
unsigned int i;
unsigned int j;
j = 1 * t;
for(i=0; i<j; i++);
}
/*-------------------------------------------------------------/
函数名称: tmreset
功能描述: 18b20初始化
传 参: 无
返 回 值: 无
--------------------------------------------------------------*/
void tmreset(void)
{
unsigned int i;
GPGCON &= 0xfffffffc; //设置寄存器对18b20进行写操作
GPGCON |= 0x01;
GPGDAT |= 0x01;
dmsec(100);
GPGDAT &= 0xfffe;
dmsec(600);
GPGDAT |= 0x01;
dmsec(100);
GPGCON &= 0xfffffffc; //设置寄存器对18b20进行读操作
i = GPGDAT;
}
/*-------------------------------------------------------------/
函数名称: Delay
功能描述: 延时函数
传 参: int x
返 回 值: 无
--------------------------------------------------------------*/
unsigned char tmrbyte (void) //读一个字节函数
{
unsigned int j;
unsigned char i, u=0;
for (i=1; i<=8; i++)
{
GPGCON &= 0xfffffffc;
GPGCON |= 0x01; //GPG0设为输出
GPGDAT &= 0xfffe;
u >>= 1;
GPGCON &= 0xfffffffc; //设为输入口
j = GPGDAT;
if (j & 0x01)
u |= 0x80;
dmsec(46);
GPGDAT |= 0x01;
}
return (u);
}
/*-------------------------------------------------------------/
函数名称: tmwbyte
功能描述: 写一个字节函数
传 参: unsigned char dat
返 回 值: 无
--------------------------------------------------------------*/
void tmwbyte (unsigned char dat) //写一个字节函数
{
unsigned char j;
GPGCON &= 0xfffffffc;
GPGCON |= 0x01;
for (j=1; j<=8; j++)
{
GPGDAT &= 0xfffe;
dmsec(1);
GPGDAT |= (dat & 0x01);
dmsec(47);
GPGDAT |= 0x01;
dat = dat >> 1;
}
}
/*-------------------------------------------------------------/
函数名称: tmstart
功能描述: 发送ds1820 开始转换
传 参: 无
返 回 值: 无
--------------------------------------------------------------*/
void tmstart (void)
{
tmreset(); //复位
dmsec(120); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发转换命令 44H,
}
/*-------------------------------------------------------------/
函数名称: tmrtemp
功能描述: 读取温度
传 参: 无
返 回 值: 无
--------------------------------------------------------------*/
void tmrtemp (void)
{
unsigned char a,b;
tmreset(); //复位
dmsec(2000); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0xbe); //发送读取命令
a = tmrbyte(); //读取低位温度
b = tmrbyte(); //读取高位温度
sdata = a / 16 + b * 16; //整数部分
xiaoshu1 = (a&0x0f) * 10 / 16; //小数第一位
xiaoshu2 = (a&0x0f) * 100 / 16 %10;//小数第二位
xiaoshu = xiaoshu1*10 + xiaoshu2; //小数两位
}
/*-------------------------------------------------------------/
函数名称: zh
功能描述:
传 参: 无
返 回 值: 无
--------------------------------------------------------------*/
void zh(void)
{
unsigned int wdata;
wdata = sdata;
wd = wdata / 10 + 0x30;
wd = wdata % 10 + 0x30;
wd = xiaoshu / 10 + 0x30;
wd = xiaoshu % 10 + 0x30;
}
/*-------------------------------------------------------------/
函数名称: DS18B20PRO
功能描述:
传 参: 无
返 回 值: 无
--------------------------------------------------------------*/
void DS18B20PRO(void)
{
tmstart(); //uart(10);
dmsec(5); //如果是不断地读取的话可以不延时
tmrtemp(); //读取温度,执行完毕温度将存于TMP
}
/*-------------------------------------------------------------/
函数名称: uart
功能描述: 串口函数用于发送温度值
传 参: 无
返 回 值: 无
--------------------------------------------------------------*/
void uart(void)
{
UFCON0 = 0x0;
UMCON0 = 0x0;
ULCON0 = 0x3;
UCON0= 0x245;
UBRDIV0=( (int)(50000000/16/115200+0.5) -1 );
while(!(UTRSTAT0 & 0x2));
UTXH0='\n';
while(!(UTRSTAT0 & 0x2));
UTXH0='\r';
while(!(UTRSTAT0 & 0x2));
UTXH0=wd;
while(!(UTRSTAT0 & 0x2));
UTXH0=wd;
while(!(UTRSTAT0 & 0x2));
UTXH0=46;
while(!(UTRSTAT0 & 0x2));
UTXH0=wd;
while(!(UTRSTAT0 & 0x2));
UTXH0=wd;
while(!(UTRSTAT0 & 0x2));
UTXH0=39;
while(!(UTRSTAT0 & 0x2));
UTXH0=67;
}
/*-------------------------------------------------------------/
函数名称: Delay
功能描述: 延时函数
传 参: int x
返 回 值: 无
--------------------------------------------------------------*/
void Delay(unsigned int x)
{
unsigned int i, j, k;
for(i=0; i<=x; i++)
for(j=0; j<0xff; j++)
for(k=0; k<0xff; k++);
}
飞凌-路飞 发表于 2013-10-9 13:58 static/image/common/back.gif
不会吧楼主,您可以吧源码贴出来吗?
源码已贴;详细情况是这样的,Test.bin下载到分区运行,温度完全正常,而将实验源码中的温度程序编译成bin文件下载分区运行,就出现问题了,温度显示全部为0,好像18b20通讯不上
页:
[1]