最近几天,一直在用cvavr编写ds18b20的程序,用protues进行仿真,一直没成功过,很纠结。读出来的数据不是ffff,就是37.6,刚刚读出个-123.9出来了,调ds18b20 的温度lcd显示也不变,估计是没有读出数据来,求高手指点迷津,下面是程序,麻烦大侠指出问题所在,希望有好心人分享下杰作(最好是通过仿真的)如果是分模块做的希望把模块中的子程序也附上,本人刚上手,很多东西都不是很熟,有的话发我邮箱非常感谢!
我是用头文件的形式把ds要用的函数嵌进主函数的,我用的是lcd显示,lcd程序也是没有调用函数,是自己编的,是ok的,现在问题就是读不出数据来
要说明的几点就是我在<dspredef.h>中已经定义好了端口:
#ifndef _dspredef_h_
#define _dspredef_h_
#include <mega16.h>
#include <delay.h>
//#define nop() #asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")#asm ("nop")
#define uchar unsigned char
#define uint unsigned int
#define openlcd DDRC = 0xc0;DDRB = 0xff
#define lcden PORTC.6
#define lcdrs PORTC.7
#define outdsdq DDRA.7 = 1
#define indsdq DDRA.7 = 0
#define ds18dqw PORTA.7
#define ds18dqr PINA.7
#endif
上面的是定义文件
#ifndef _dsfun_h_
#define _dsfun_h_
#include <dspredef.h>
uchar numtable[] = "0123456789. -";
uchar tmpcode[6] = {0,0,0,0,0,0};
uchar dsreset()
{
uchar a;
outdsdq;
ds18dqw = 0;
#asm("cli")
delay_us(500);
#asm("sei")
ds18dqw = 1;
#asm("cli")
delay_us(100);
#asm("sei")
indsdq;
a = ds18dqr;
a = ds18dqr;
#asm("cli")
delay_us(500);
#asm("sei")
return (a);
}
uchar dsread()
{
uchar i,k = 0,buf;
i = 8;
while(i--)
{
outdsdq;
ds18dqw = 0;
#asm("cli")
delay_us(10);
#asm("sei")
ds18dqw = 1;
indsdq;
k >>= 1;
buf = ds18dqr;
buf = ds18dqr;
if(buf)k |= 0x80;
#asm("cli")
delay_us(50);
#asm("sei")
}
return (k);
}
void dswrite(uchar dat)
{
uint j;
outdsdq;
for(j = 1;j <= 8;j++)
{
ds18dqw = 0;
#asm("cli")
delay_us(10);
#asm("sei")
if(dat & 0x01)
{
ds18dqw =1;
// #asm("cli")
// delay_us(45);
// #asm("sei")
}
// else
// {
// ds18dqw = 0;
//
// #asm("cli")
// delay_us(45);
// #asm("sei")
//
// ds18dqw = 1;
//
// #asm("cli")
// delay_us(35);
// #asm("sei")
// }
#asm("cli")
delay_us(100);
#asm("sei")
ds18dqw = 1;
dat >>= 1;
}
}
void dschange()
{
dsreset();
dswrite(0xcc);
dswrite(0x44);
}
uint dstmp()
{
uchar tmpl,tmph;
uint tmp;
dsreset();
dswrite(0xcc);
dswrite(0xbe);
tmpl = dsread();
tmph = dsread();
tmp = tmpl;
tmp <<= 8;
tmp |= tmph;
return (tmp);
}
void tmpdispose(uint t)
{
if(t <= 0x07ff)
tmpcode[0] = numtable[11];
else
{
tmpcode[0] = numtable[12];
t = ~t +1;
}
t *= 0.625;
tmpcode[1] = numtable[t / 1000];
tmpcode[2] = numtable[(t % 1000) / 100];
tmpcode[3] = numtable[(t % 100) / 10];
tmpcode[4] = numtable[10];
tmpcode[5] = numtable[t % 10];
}
#endif
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |