最近幾天,一直在用cvavr編寫ds18b20的程序,用protues進(jìn)行仿真,一直沒成功過,很糾結(jié)。讀出來的數(shù)據(jù)不是ffff,就是37.6,剛剛讀出個(gè)-123.9出來了,調(diào)ds18b20 的溫度lcd顯示也不變,估計(jì)是沒有讀出數(shù)據(jù)來,求高手指點(diǎn)迷津,下面是程序,麻煩大俠指出問題所在,希望有好心人分享下杰作(最好是通過仿真的)如果是分模塊做的希望把模塊中的子程序也附上,本人剛上手,很多東西都不是很熟,有的話發(fā)我郵箱非常感謝! 我是用頭文件的形式把ds要用的函數(shù)嵌進(jìn)主函數(shù)的,我用的是lcd顯示,lcd程序也是沒有調(diào)用函數(shù),是自己編的,是ok的,現(xiàn)在問題就是讀不出數(shù)據(jù)來 要說明的幾點(diǎn)就是我在<dspredef.h>中已經(jīng)定義好了端口: #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 |