標題:
51單片機18b20溫度及按鍵可調(diào)上下限報警源程序
[打印本頁]
作者:
小黑屋zzz
時間:
2017-12-7 18:09
標題:
51單片機18b20溫度及按鍵可調(diào)上下限報警源程序
基于18b20顯示2位溫度并顯示上下限,超限報警,溫度上下限均可調(diào)整,附帶閃爍燈
單片機源程序如下:
#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) //延時函數(shù)
{
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復(fù)位 初始化函數(shù)
{
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); //讀出數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在dat里
}
return(dat);
}
void tempwritebyte(uchar dat) //向ds18b20寫一個字節(jié)數(shù)據(jù)函數(shù)
{
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開始獲取溫度并轉(zhuǎn)換
{
dsreset();
delay(1);
tempwritebyte(0xcc); //寫跳過讀ROM指令
tempwritebyte(0x44); //寫溫度轉(zhuǎn)換指令
}
uint get_temp()
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //讀低八位
b=tempread(); //讀高八位
temp=b;
temp<<=8;//兩個字節(jié)組合為一個字
temp=temp|a;
temp=temp*0.0625; //溫度在寄存器中為12位,分辨率位0.0625 度
SBUF=temp;
return temp;//temp是整型
}
//數(shù)碼管顯示**********************************************************************
void display(uchar num,uchar dat)//數(shù)據(jù)顯示程序
{ //num是第幾個數(shù)碼管,dat是要顯示的數(shù)字
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() //顯示溫度數(shù)值函數(shù)t傳遞的是整型溫度值
{
// tempchange();//溫度轉(zhuǎn)換函數(shù)
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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
18b20.rar
(1.9 KB, 下載次數(shù): 72)
2017-12-7 18:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
涅槃寶寶
時間:
2019-10-11 19:23
你好,請問這個是按鍵按下溫度加一或減一么?
作者:
人人學會單片機
時間:
2019-10-12 11:42
這代碼好垃圾啊!DS18B20 復(fù)位居然死等延遲?
作者:
chickji
時間:
2019-10-12 12:37
我是來學習的。。@
作者:
create1318
時間:
2020-2-14 18:31
很有用,感謝。
作者:
conquer-
時間:
2021-12-30 13:18
屏幕顯示不出來
作者:
liuyiyi
時間:
2022-1-4 11:46
屏幕顯示不出,你是用的仿真么
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1