欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機、ds18b20溫度計設(shè)計源代碼
[打印本頁]
作者:
sscsscssc
時間:
2017-4-22 10:16
標題:
基于51單片機、ds18b20溫度計設(shè)計源代碼
功能:1.顯示溫度;
2.顯示溫度上下限;
3.上下限可調(diào);
4.顯示溫度傳感器序列碼;
5.溫度異常,分階段報警。
0.png
(55.74 KB, 下載次數(shù): 61)
下載附件
2017-4-22 15:16 上傳
源程序:
//////////////////////////////////////////////////////////////////// /////////////////////////////////////////
/*
按鍵控制LCD顯示內(nèi)容,(id號與當前溫度/上下限以及)
按鍵可調(diào)溫度的上下限。
*/
#include<reg52.h>
#include<intrins.h> //nop
#define uchar unsigned char
#define uint unsigned int
sbit ds = P2^2; //DS18b20-->DS
sbit beep = P2^3; //buzz
sbit wela = P2^7; //
sbit dula = P2^6; //
sbit LCDEN = P3^4; // EN
sbit rs = P3^5; //數(shù)據(jù) 命令選擇端
sbit rw = P3^6; //讀寫選擇端
uchar datstr[] = "Temperature:";
uchar str[4]; //uchartostr函數(shù)轉(zhuǎn)換的字符串 同時可以把16進制轉(zhuǎn)成10進制 存高低溫上下限
uchar str1[5]; //uchartostr1函數(shù)轉(zhuǎn)換的字符串 同時可以把16進制轉(zhuǎn)成10進制 存溫度
//sbit IDcheck=P2^5;
//sbit IDready=P3^1;
int flip=0; // 用來讀flip1 用于反轉(zhuǎn)
int flip1=1; //=1 開單鍵&用于雙鍵反轉(zhuǎn)
bit flag;//ds初始化成功標志
uchar ds_rom[16]; //存序列碼 存入的是字節(jié)
uchar H=40,L=10,Key_value; //初始上下限溫度,
uchar code table[]={'0','1','2','3','4',
'5','6','7','8','9',
'A','B','C','D','E','F' //序列碼字節(jié)轉(zhuǎn)ASCII專用數(shù)組
};
void delay(uint z); //延時函數(shù) 1602專用
void write_com(uchar com); //寫命令
void write_data(uchar date); //寫數(shù)據(jù)
void init_1602(); //初始化1602
uchar *uchartostr(uchar num); //將一個字節(jié)的數(shù)據(jù)轉(zhuǎn)換為字符串 或10進制 返回數(shù)組 上下限顯示用
uchar *uchartostr1(uint num); //將一個字節(jié)的數(shù)據(jù)轉(zhuǎn)換為字符串 或10進制 返回數(shù)組 溫度顯示用
void lcd_dis(uchar X,uchar Y,uchar *dis); //顯示數(shù)據(jù)數(shù)組
void lcd_distostr(uchar X,uchar Y);//顯示字符串temperature 數(shù)組
void TempDelay(uchar us) //delay
{
while(us--); //6.51us
}
void ds_reset() //ds18b20 init
{
ds=1;
_nop_(); //1us
ds=0;
TempDelay(80); //延時略長些
ds=1;
TempDelay(6);
if(ds==0)
flag=0; //記錄應(yīng)答電平
else
flag=1; //失敗
TempDelay(20); //延時
ds=1; //置1結(jié)束
}
bit ds_read_bit() //(||)read a bit
{
bit dat;
ds=0; //DQ已經(jīng)是1了
_nop_(); //1us delay
_nop_();
ds=1;
_nop_();
dat=ds; //讀一位
TempDelay(12); //延時稍長
return dat;
}
uchar ds_read_byte() //read a byte
{
uchar i,j,value;
for(i=0;i<8;i++)
{
j=ds_read_bit(); //1 bit上一個函數(shù) @先讀到的位為最低位
value=(j<<7)|(value>>1); //新bit左移7位,舊狀態(tài)右移一位空出最高位,組合
}
return value;
}
void ds_write_byte(uchar dat) //寫一字節(jié)
{
uchar i,onebit;
for(i=0;i<8;i++) //8bit
{
onebit=dat&0x01; //取最低位
if(onebit) //最低位為1 寫1
{
ds=0;
TempDelay(1);
ds=1;
_nop_();
}
else //寫0
{
ds=0;
TempDelay(11); //delay 長一些 因為省去ds=0
ds=1;
_nop_();
}
dat>>=1; //右移一位
}
}
void ds_change() //jump rom &start temp convert
{
ds_reset() ;
while(flag!=0); // //檢測到設(shè)備 成功返回0
ds_write_byte(0xcc); //jump ROM
ds_write_byte(0x44); //TEMP convert
}
void Read_ROM() //序列碼讀入數(shù)組 ds_rom[i]
{
int i;
uchar a; //序列碼緩沖
ds_reset();
while(flag!=0);
ds_write_byte(0x33); //read rom序列碼
for(i=15;i>0;i--)
{
a=ds_read_byte();
ds_rom[i--]=(0x0f&a); //取低四位 15
ds_rom[i]=((0xf0&a)>>4); //取高四位 14
}
// ds_rom[16]='\0';
}
uint get_temperature() // 溫度采集
{
uint temp;
float ftemp;
uchar a,b;
ds_reset();
while(flag!=0);
ds_write_byte(0xcc); //jump ROM
ds_write_byte(0xbe); //read 標簽存儲器
a=ds_read_byte(); //read low8
b=ds_read_byte(); //read high8
temp=b;
temp<<=8;
temp|=a; //高低8位結(jié)合
ftemp=temp*0.0625; //12bit-->0.0625*10 (除以16,2^4,右移4位)
ftemp=ftemp*10+0.5; //取1位小數(shù)后四舍五入
temp=ftemp; //現(xiàn)在為10倍temp的整數(shù) 便于顯示
return temp;
}
void IDshow(); //顯示序列碼
void WarningShow(); //溫度上下限顯示
void key() // 有問題 按鍵掃描
{
Key_value = P3;
Key_value = Key_value & 0x0f;
if ( Key_value != 0x0f )
{
delay(5);
if ( Key_value != 0x0f ) //qu dou
{
if( Key_value == 0x0c ) //s2s3同時按下
{
delay(5);
if( Key_value == 0x0c ) //
{
flip=flip1; //狀態(tài)反轉(zhuǎn) 讀上一次狀態(tài) 每同時按一次 反轉(zhuǎn)一次
if(flip==1)
{
IDshow();
flip1=0; //flip1==1 關(guān)閉單鍵調(diào)節(jié)功能
}
else if(flip==0)
{
WarningShow(); //顯示上下限
flip1=1; //flip1==1 時才能監(jiān)測其他按鍵來調(diào)上下限
}
}
}
if( (Key_value == 0x0e)&(flip1==1) )
{ //*
H++;
if (H==100)
H=40;
}
if( (Key_value == 0x0d)&(flip1==1) )
{
H--;
if (H==0)
H=99;
if (H==L)
H=H+1;
}
if( (Key_value == 0x0b)&(flip1==1) )
{
L++;
if (L==H)
L=0;
}
if( (Key_value == 0x07)&(flip1==1) )
{
L--;
if (L==0)
if(H>10)
L=10;
else
L=H-1;
}
}
}
}
void IDshow()
{
uint i;
Read_ROM();
write_com( 0x80 + 0 + 0 );
for(i=0;i<16;i++)
{
write_data(table[ds_rom[i]]); //
}
}
void WarningShow()
{
write_com( 0x80 + 0 + 0);
write_data( ' ' );
write_data( ' ' );
write_data( ' ' );
write_com( 0x80 + 0 + 3);
write_data( 'H' );
write_data( ':' );
write_com( 0x80 + 0 + 7);
write_data( ' ' );
write_com( 0x80 + 0 + 8);
write_data( 'L' );
write_data( ':' );
write_com( 0x80 + 0 + 12);
write_data( ' ' );
write_data( ' ' );
write_data( ' ' );
write_data( ' ' );
lcd_dis( 0,5,uchartostr( H ) );
lcd_dis( 0,10,uchartostr( L ) );
}
/****************************************************MAIN*************************************************************/
/****************************************************MAIN*************************************************************/
/****************************************************MAIN*************************************************************/
void main()
{
uint i;
// rd = 0;
init_1602(); //
WarningShow();
// H = 40;
// L = 10;
lcd_dis( 0,5,uchartostr( H ) );
lcd_dis( 0,10,uchartostr( L ) );
lcd_distostr(1,0); //TEMPERATURE
//init warn
ds_change();
delay(800); ////85C
while(1)
{
ds_change();
i = get_temperature(); //采溫度
lcd_dis( 1,12,uchartostr1( i ) ); //str1 顯示溫度
if(flip1==0);
else if(flip1==1) //啟動單鍵時
{
lcd_dis( 0,5,uchartostr( H ) ); //上下限-->str
lcd_dis( 0,10,uchartostr( L ) );
}
//報警
if ( i >=(10*H) )
{
P1 = 0x33;
}
else if (i<=(10*L))
{
P1 = 0xcc;
}
else
{
P1 = 0xff;
}
key();
}
}
//1602輔助小函數(shù)
void delay(uint z) //延時函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void write_com(uchar com) //寫命令
{
P0=com;
rs=0; //寫命令
LCDEN=0;
delay(10);
LCDEN=1;
delay(10);
LCDEN=0;
}
void write_data(uchar date) //寫數(shù)據(jù)
{
P0=date;
rs=1; //寫數(shù)據(jù)
LCDEN=0;
delay(10);
LCDEN=1;
delay(10);
LCDEN=0;
}
void init_1602() //初始化1602
{
rw=0;
dula=0;
wela=0; //防止數(shù)碼管亂閃
write_com(0x38); //顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口
delay(20);
write_com(0x0c); //顯示模式設(shè)置:開顯示 不顯示光標 也不閃爍
delay(20);
write_com(0x06); //顯示模式設(shè)置:光標右移,字符不移,不移動屏幕
delay(20);
write_com(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除
delay(20);
}
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////x數(shù)組 準備顯示//////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
uchar *uchartostr(uchar num) //將一個字節(jié)的數(shù)據(jù)轉(zhuǎn)換為字符串 或10進制 返回數(shù)組首地址 (上下限)
{
uchar x1,x0,i;
x1=num%100/10;
x0=num%100%10;
i=0; //數(shù)組第一元素
str[i]=x1+48; //變ASCII碼
i++;
str[i]=x0+48;
i++;
str[i]='\0'; //結(jié)束符
return str;
}
uchar *uchartostr1(uint num) //將一個字節(jié)的數(shù)據(jù)轉(zhuǎn)換為字符串 或10進制 返回數(shù)組(溫度專用)
{
uchar x2,x1,x0,i;
x2=num/100;
x1=num%100/10;
x0=num%10;
i=0; //數(shù)組第一元素
if(x2!=0)
{
str1[i]=x2+48; //變ASCII碼 十位
i++;
}
if(1)
{
str1[i]=x1+48; //個位
i++;
str1[i]=46; // "." 小數(shù)點
i++;
}
str1[i]=x0+48; //十分位
i++;
str1[i]='\0'; //結(jié)束符
return str1;
}
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////x顯示////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void lcd_dis(uchar X,uchar Y,uchar *dis) //顯示數(shù)據(jù)數(shù)組
{
uchar pos; //位置
switch(X)
{
case 0:X=0x00; // line1
break;
case 1:X=0x40; //line2
break;
break;
default:break;
}
pos =0x80+X+Y; //
write_com(pos); //寫入顯示地址設(shè)置
while(*dis!='\0') //
{
write_data(*dis++);
}
}
void lcd_distostr(uchar X,uchar Y)//顯示字符串temperature 數(shù)組
{
uchar pos,i;
i=0; //設(shè)定從數(shù)組中的第幾個字符串開始顯示
switch(X)
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
下載:
ds18b20_oo.zip
(60.74 KB, 下載次數(shù): 36)
2017-4-22 10:14 上傳
點擊文件名下載附件
溫度計源代碼
下載積分: 黑幣 -5
作者:
ideachen
時間:
2017-12-25 00:56
請問按鍵是矩陣是按鍵嗎?
作者:
lsc_nj
時間:
2017-12-25 08:11
感謝無私奉獻。一起學(xué)習(xí)一起前進。
作者:
LIUBAOBAO
時間:
2017-12-25 12:05
按鍵改溫度怎么按鍵?
作者:
c51ds18b20
時間:
2017-12-27 12:39
太好了這設(shè)計
作者:
luo1429181965
時間:
2017-12-28 19:28
我做的數(shù)碼管不顯示十位后的溫度,很煩,自己也不知道哪里錯了。
作者:
zzqaqq
時間:
2018-1-4 14:57
謝謝樓主了,我正在學(xué)習(xí),看一下
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1