|
51單片機DS18B20溫度上下限報警的仿真原理圖,用74ls245驅動數碼管顯示(proteus仿真工程文件可到本帖附件下載):
0.png (30.26 KB, 下載次數: 77)
下載附件
2017-4-5 04:00 上傳
51單片機DS18B20溫度上下限報警源代碼:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DIO=P1^7;
- uchar data dis_buf[6]; //顯示緩沖區
- 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( ) //延時1ms
- { data unsigned int d;
- for(d=0;d<120;d++);
- }
- void display( ) //顯示函數
- { 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)微妙延時
- { while(--y);
- }
- void delay() //延時1000ms
- { uchar i;
- for(i=0;i<140;i++)
- { display();
- }
- }
- void OneWireWByte(uchar x) //向總線寫一個字節x
- { uchar i;
- for(i=0;i<8;i++)
- { DIO=0; //拉低總線
- _nop_(); //要求大于1微妙,但不超過15微妙
- _nop_();
- if(0x01&x)
- { DIO=1; //如果最低位為1,則將總線拉高
- }
- delay_5us(30); //延時60--120微妙
- DIO=1; //釋放總線
- _nop_(); //要求大于1微妙
- x=x>>1; //移位,準備發送下一位
- }
- }
- uchar OneWireRByte(void) //從一總線上讀一個字節,返回讀到的內容
- { 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); //延時60--120微妙
- DIO=1; //釋放總線
- _nop_(); //要求大于1微妙
- }
- return j;
- }
- void DS18B20_int(void) //初始化DS18B20
- { DIO=0;
- delay_5us(255); // 延時480--960微妙
- DIO=1; //釋放總線
- delay_5us(30); //延時60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求釋放總線后480微妙內結束復位
- DIO=1; //釋放總線
- OneWireWByte(0xcc); //發送Skip ROM命令
- OneWireWByte(0x4e); //發送寫暫存RAM命令
- OneWireWByte(0x00); //溫度報警上限設為0
- OneWireWByte(0x00); //溫度報警下限設為0
- OneWireWByte(0x7f); //將DS18B20設為12位,精度為0.25
- DIO=0;
- delay_5us(255); // 延時480--960微妙
- DIO=1; //釋放總線
- delay_5us(240); //要求釋放總線后480微妙內結束復位
- DIO=1; //釋放總線
- }
- }
- uint DS18B20_readtemp() //讀DS18B20的溫度值
- { uint temp;
- uchar DS18B20_temp[2]; //溫度數據
- DIO=0;
- delay_5us(255); // 延時480--960微妙
- DIO=1; //釋放總線
- delay_5us(30); //延時60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求釋放總線后480微妙內結束復位
- DIO=1;
- OneWireWByte(0xcc); //發送Skip ROM命令
- OneWireWByte(0x44); //發送溫度轉換命令
- DIO=1;
- delay( ); //延時1000ms
- DIO=0;
- delay_5us(255); // 延時480--960微妙
- DIO=1;
- delay_5us(30); //延時60--120微妙
- if(DIO==0)
- { delay_5us(200); //要求釋放總線后480微妙內結束復位
- DIO=1;
- OneWireWByte(0xcc); //發送Skip ROM命令
- OneWireWByte(0xbe); //發送讀暫存RAM命令
- DS18B20_temp[0]=OneWireRByte(); //讀溫度的低字節
- DS18B20_temp[1]=OneWireRByte(); //讀溫度的高字節
- temp=256*DS18B20_temp[1]+DS18B20_temp[0];
- temp=temp/16;
- DIO=0;
- delay_5us(255); //// 延時480--960微妙
- DIO=1;
- delay_5us(240); //要求釋放總線后480微妙內結束復位
- DIO=1;
- }
- return temp;
- }
- }
-
- void main( ) //主函數
- { 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;
復制代碼
0.png (61.23 KB, 下載次數: 70)
下載附件
2017-4-5 03:59 上傳
該系列源碼包含有很多非常經典,代碼風格十分規范,而且注釋詳細的單片機例程,還帶仿真,對于MCU學習特別是初學者是很有幫助的,全部源碼下載(共幾十個項目):http://www.zg4o1577.cn/bbs/dpj-80575-1.html
本例程下載(含proteus仿真工程文件與源碼):
單片機DS18B20溫度上下限報警.rar
(54.79 KB, 下載次數: 63)
2017-4-5 04:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|