![]() |
發布時間: 2017-9-11 12:03
正文摘要:本帖最后由 素還真 于 2017-9-11 12:06 編輯 #include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit DS=P1^6; uint temp; unsigned char code ta ... |
DS18B20采集溫度的時候不能有中斷程序 |
你好,這個應該是程序出了問題,看數碼管的代碼有沒問題 |
本帖最后由 zl2168 于 2017-9-11 21:33 編輯 給你介紹一個18b20的案例,自己對照查錯吧! 先Proteus仿真一下,確認有效。 ![]() ![]() 以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil C和Proteus》清華大學出版社ISBN 978-7-302-41682-1,內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。 |
另外代碼要寫在return前,不過這個仿真其實沒有用到中斷,所以沒什么影響。謝謝大家的幫助。 |
我下午仔細研究了一下,主要是兩個問題。 void DSrun(void) { bit ask; EA=0; drst(); delay(1); if(ask==0) { write(0xcc); write(0x44); } EA=1; } 進行溫度轉換之后還要讀取RAM中存儲的數據。就是在write(0x04)后再進行一次初始化,然后用0xbe指令讀取數據。 P0=table[A1]; P2=0x01; delayms(1); P0=table[A2]; P2=0x02; delayms(1); 這個數碼管顯示程序中P2口位選使能寫錯了,因為不熟練犯得低級錯誤。 |
如果還是不行,你可以先把數碼管程序搞定,再調試18b20.仿真和硬件在時間上還是有很大差別的 |
#include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit DS=P1^6; uint temp; unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; void delay(uint count) { uint i; while(count) { i=200; while(i>0) i--; count--; } } void delayms(uchar x) { uint i,j; for(i=x;i>0;i--) for(j=120;j>0;j--); } void delay10us(uchar t) { do { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } while(--t); } void Init_Com(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; } bit drst(void) { bit ask; EA=0; DS=0; delay10us(65); DS=1; delay10us(6); ask=DS; while(!DS); return ask; EA=1; } bit readbit(void) { bit dat; EA=0; DS=0;_nop_(); DS=1;_nop_();_nop_(); dat=DS; delay10us(6); return (dat); EA=1; } uchar read(void) { uchar i,j,dat; dat=0; EA=0; for(i=1;i<=8;i++) { j=readbit(); dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里 } return(dat); EA=1; } void write(uchar dat) { uchar j; bit testb; EA=0; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) { DS=0; _nop_();_nop_(); DS=1; delay10us(6); } else { DS=0; //write 0 delay10us(6); DS=1; _nop_();_nop_(); } }EA=1; } void DSrun(void) { bit ask; EA=0; drst(); delay(1); if(ask==0) { write(0xcc); write(0x44); } EA=1; } uint tmp() { float tt; uchar a,b; EA=0; DSrun(); a=read(); b=read(); temp=b; temp<<=8; temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; EA=1; } void display(uint temp) { uchar A1,A2,A3,A4,A2s,A3s,ser; ser=temp/10; ser=SBUF; A1=temp/1000; //這里是為了顯示正負,目前沒有實現。 A2s=temp%1000; A2=A2s/100; A3s=A2s%100; A3=A3s/10; A4=A3s%10; P0=table[A1]; P2=0x01; delayms(1); P0=table[A2]; P2=0x02; delayms(1); P0=table1[A3]; P2=0x04; delayms(1); P0=table[A4]; P2=0x08; delayms(1); } void main() { Init_Com(); while(1) { display(tmp()); } } |