|
51單片機(jī)DS18B20溫度上下限報(bào)警的仿真原理圖,用74ls245驅(qū)動(dòng)數(shù)碼管顯示(proteus仿真工程文件可到本帖附件下載):
0.png (30.26 KB, 下載次數(shù): 77)
下載附件
2017-4-5 04:00 上傳
51單片機(jī)DS18B20溫度上下限報(bào)警源代碼:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DIO=P1^7;
- uchar data dis_buf[6]; //顯示緩沖區(qū)
- uchar code table[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //顯示的代碼表
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};
- void dl_1ms( ) //延時(shí)1ms
- { data unsigned int d;
- for(d=0;d<120;d++);
- }
- void display( ) //顯示函數(shù)
- { data uchar bitcode, i;
- bitcode=0xfe;
- for(i=0;i<6;i++)
- { P2=table[dis_buf[i]];
- P3=bitcode;
- dl_1ms( );
- P3=0xff;
- bitcode=bitcode<<1;
- bitcode=bitcode|0x01;
- }
- }
- void delay_5us(uchar y) //(2.17*y+5)微妙延時(shí)
- { while(--y);
- }
- void delay() //延時(shí)1000ms
- { uchar i;
- for(i=0;i<140;i++)
- { display();
- }
- }
- void OneWireWByte(uchar x) //向總線寫一個(gè)字節(jié)x
- { uchar i;
- for(i=0;i<8;i++)
- { DIO=0; //拉低總線
- _nop_(); //要求大于1微妙,但不超過15微妙
- _nop_();
- if(0x01&x)
- { DIO=1; //如果最低位為1,則將總線拉高
- }
- delay_5us(30); //延時(shí)60--120微妙
- DIO=1; //釋放總線
- _nop_(); //要求大于1微妙
- x=x>>1; //移位,準(zhǔn)備發(fā)送下一位
- }
- }
- uchar OneWireRByte(void) //從一總線上讀一個(gè)字節(jié),返回讀到的內(nèi)容
- { uchar i,j;
- j=0;
- for(i=0;i<8;i++)
- { j=j>>1;
- DIO=0; //拉低總線
- _nop_(); //要求大于1微妙,但不超過15微妙
- _nop_();
- DIO=1; //釋放總線
- _nop_();
- _nop_();
- if(DIO==1) //如果搞電平
- { j=j|0X80;
- }
- delay_5us(30); //延時(shí)60--120微妙
- DIO=1; //釋放總線
- _nop_(); //要求大于1微妙
- }
- return j;
- }
- void DS18B20_int(void) //初始化DS18B20
- { DIO=0;
- delay_5us(255); // 延時(shí)480--960微妙
- DIO=1; //釋放總線
- delay_5us(30); //延時(shí)60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
- DIO=1; //釋放總線
- OneWireWByte(0xcc); //發(fā)送Skip ROM命令
- OneWireWByte(0x4e); //發(fā)送寫暫存RAM命令
- OneWireWByte(0x00); //溫度報(bào)警上限設(shè)為0
- OneWireWByte(0x00); //溫度報(bào)警下限設(shè)為0
- OneWireWByte(0x7f); //將DS18B20設(shè)為12位,精度為0.25
- DIO=0;
- delay_5us(255); // 延時(shí)480--960微妙
- DIO=1; //釋放總線
- delay_5us(240); //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
- DIO=1; //釋放總線
- }
- }
- uint DS18B20_readtemp() //讀DS18B20的溫度值
- { uint temp;
- uchar DS18B20_temp[2]; //溫度數(shù)據(jù)
- DIO=0;
- delay_5us(255); // 延時(shí)480--960微妙
- DIO=1; //釋放總線
- delay_5us(30); //延時(shí)60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
- DIO=1;
- OneWireWByte(0xcc); //發(fā)送Skip ROM命令
- OneWireWByte(0x44); //發(fā)送溫度轉(zhuǎn)換命令
- DIO=1;
- delay( ); //延時(shí)1000ms
- DIO=0;
- delay_5us(255); // 延時(shí)480--960微妙
- DIO=1;
- delay_5us(30); //延時(shí)60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
- DIO=1;
- OneWireWByte(0xcc); //發(fā)送Skip ROM命令
- OneWireWByte(0xbe); //發(fā)送讀暫存RAM命令
- DS18B20_temp[0]=OneWireRByte(); //讀溫度的低字節(jié)
- DS18B20_temp[1]=OneWireRByte(); //讀溫度的高字節(jié)
- temp=256*DS18B20_temp[1]+DS18B20_temp[0];
- temp=temp/16;
- DIO=0;
- delay_5us(255); //// 延時(shí)480--960微妙
- DIO=1;
- delay_5us(240); //要求釋放總線后480微妙內(nèi)結(jié)束復(fù)位
- DIO=1;
- }
- return temp;
- }
- }
-
- void main( ) //主函數(shù)
- { uint temp;
- DS18B20_int();
- dis_buf[0]=16; dis_buf[1]=16;
- dis_buf[2]=0; dis_buf[3]=0;
- dis_buf[4]=0; dis_buf[5]=0;
- display( );
- while(1)
- { temp=DS18B20_readtemp();
- dis_buf[2]=temp/1000;
- dis_buf[3]=(temp%1000)/100;
復(fù)制代碼
0.png (61.23 KB, 下載次數(shù): 70)
下載附件
2017-4-5 03:59 上傳
該系列源碼包含有很多非常經(jīng)典,代碼風(fēng)格十分規(guī)范,而且注釋詳細(xì)的單片機(jī)例程,還帶仿真,對于MCU學(xué)習(xí)特別是初學(xué)者是很有幫助的,全部源碼下載(共幾十個(gè)項(xiàng)目):http://www.torrancerestoration.com/bbs/dpj-80575-1.html
本例程下載(含proteus仿真工程文件與源碼):
單片機(jī)DS18B20溫度上下限報(bào)警.rar
(54.79 KB, 下載次數(shù): 63)
2017-4-5 04:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|