最近几天,一直在用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 |