基于18b20顯示2位溫度并顯示上下限,超限報警,溫度上下限均可調整,附帶閃爍燈
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit ds=P2^2;
- sbit key1=P3^4;
- sbit key2=P3^5;
- sbit key3=P3^6;
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit beep=P2^3;
- bit key=0;
- sbit led=P1^2;
- uint get_temp();
- void send(uchar);
- uint temp,num,p,cycle,high,low,zd,xs,TL;
- uint l=19; //定義溫度下限
- uint h=25; //定義溫度上限
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0xbf,0x86,
- 0xdb,0xcf,0xe6,0xed,
- 0xfd,0x87,0xff,0xef};
- void delay(uint z) //延時函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delay1(uint ms)
- {
- uchar j;
- while(ms--)
- for(j=110;j>0;j--);
- }
- /////中斷/////////////////////
- void init()
- {
- TMOD|=0X10;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- //按鍵掃描程序******************************************************
- void keyscan()
- {
- if(key3==0)
- delay1(5);
- if(key3==0)
- { while(!key3);
- key=!key;
- while(key3==0);
- }
- if(key==0)
- {
- if(key1==0)
- {
- delay1(5);
- if(key1==0)
- {
- //while(!key1) ;
- l++;
- delay(50);
- if(l==99)
- l=0;
- }
- }
- if(key2==0)
- {
- delay1(5);
- if(key2==0)
- {// while(!key2);
- if(l!=0)
- l--;
- delay(50);
- }
- }
- }
- if(key==1)
- {
- if(key1==0)
- {
- delay1(5);
- if(key1==0)
- {// while(!key1) ;
- h++;
- delay(50);
- if(h==99)
- h=0;
- }
- }
- if(key2==0)
- {
- delay1(5);
- if(key2==0)
- {//while(!key2);
- if(h!=0)
- h--;
- delay(50);
- }
- }
- }
- }
- //溫度傳感器********************************************************
- void dsreset()//ds18b20復位 初始化函數
- {
- uint i;
- ds=0;
- i=80;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit()
- {
- uint i;
- bit dat;
- ds=0;i++; //i++起延時作用
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return(dat);
- }
- uchar tempread()
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1); //讀出數據最低位在最前面,這樣剛好一個字節在dat里
- }
- return(dat);
- }
- void tempwritebyte(uchar dat) //向ds18b20寫一個字節數據函數
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb)//寫一
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;
- while(i>0)i--;
- }
- else
- {
- ds=0;//寫0
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- void tempchange() //DS18B20開始獲取溫度并轉換
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc); //寫跳過讀ROM指令
- tempwritebyte(0x44); //寫溫度轉換指令
- }
- uint get_temp()
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread(); //讀低八位
- b=tempread(); //讀高八位
- temp=b;
- temp<<=8;//兩個字節組合為一個字
- temp=temp|a;
- temp=temp*0.0625; //溫度在寄存器中為12位,分辨率位0.0625 度
- SBUF=temp;
- return temp;//temp是整型
- }
- //數碼管顯示**********************************************************************
- void display(uchar num,uchar dat)//數據顯示程序
- { //num是第幾個數碼管,dat是要顯示的數字
- uchar i;
- P0=0xff;
- wela=1; //消影
- wela=0;
- P0=table[dat];//編碼賦給P0口
- dula=1;
- dula=0;
- wela=0;
- i=0xFF;
- i=i&(~((0x01)<<(num))) ;
- P0=i;
- wela=1;
- wela=0;
- delay(1);
- }
- //顯示溫度和閾值*************************************************
- void dis_temp() //顯示溫度數值函數t傳遞的是整型溫度值
-
- {
- // tempchange();//溫度轉換函數
- switch(xs)
- {
- case 1:
- display(0,get_temp()%100/10);
- break;
- case 2:
- display(1,get_temp()%10);
- break;
- case 3:
- display(2,l%100/10);
- break;
- case 4:
- display(3,l%10);
- break;
- case 5:
- display(4,h%100/10);
- break;
- case 6:
- display(5,h%10);
- break;
-
- }
- xs++;
- if(xs>6)
- {
- xs=1;
- }
- }
- //報警**********************************************************
- void beep0()
- {
- if(temp<l)
- beep=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
18b20.rar
(1.9 KB, 下載次數: 72)
2017-12-7 18:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|