ok2440的18b20程序代码
ok2440提供的18b20的源代码不能测量温度,本人用MDK调试出了正确的代码,希望对大家有帮助。另外,强烈推荐大家使用MDK,我用j_link和ADS1.2调试时老是卡死,用MDK没有死机现象,MDK调试功能好像比ADS1.2强大的多 lz调试的哪里有问题?测试代码中的温度测试怎会不能用? 硬件测试程序(就是12个一起测的那个)可以,但是单独做温度测试的程序就不对了,虽然我看了,里边的延时都一样,但是好像时钟频率不一样吧(个人猜测),出不来结果 我用光盘wince里面的程序是可以的,以前拿个做过项目,实现一个简单的应用。18b20还是比较简单的 总是卡死,可以试试更新一下jlink的驱动下载一个新的版本试试。
18B20的测试程序并未发现异常,可能你的程序没有仿真起来。 仿真不知道是不是j_link的问题 j_link是我自己买的 不是从飞凌买的 但是我不仿真 把bin文件烧进去还是不行 结果显示是00'00C 测试不准确 看不到附件吗?代码改动后如下:
void dmsec (unsigned int t) //精确延时函数100约为1.317us
{
unsigned int i;
unsigned int j;
j=1*t;
for(i = 0; i < j; i++);
}
void tmreset (void) //18b20初始化
{
unsigned int i;
GPGCON&=0xfffffffc; //设置寄存器对18b20进行写操作
GPGCON|=0x01;
GPGDAT&=0xfffe;
dmsec(45600);
GPGCON&=0xfffffffc;
while((GPGDAT&0x01)==0x00);
dmsec(3000);
while((GPGDAT&0x01)==0x01);
//GPFDAT=0xef;
while((GPGDAT&0x01)==0x00);
//GPFDAT=0xdf;
}
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;
dmsec(400);
GPGDAT|=0X01;
GPGCON&=0xfffffffc; //设为输入口
j=GPGDAT;
if(j&0x01)u |= 0x80;
dmsec(12731);
GPGCON|=0x01;
GPGDAT|=0x01;
dmsec(200);
}
return (u);
}
void tmwbyte (unsigned char dat) //写一个字节函数
{
unsigned char j;
GPGCON&=0xfffffffc;
GPGCON|=0x01;
for (j=1;j<=8;j++)
{
GPGCON&=0xfffffffc;
GPGCON|=0x01;
GPGDAT&=0xfffe;
GPGDAT|= (dat & 0x01);
dmsec(1000);
dmsec(3714);
dat = dat >> 1;
dmsec(100);
}
}
void tmstart (void) //发送ds1820 开始转换
{
tmreset(); //复位
dmsec(120); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发转换命令 44H,
}
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; //小数两位
}
和飞凌提供的延时差别很大
页:
[1]