久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于51單片機、ds18b20溫度計設計源代碼
[打印本頁]
作者:
sscsscssc
時間:
2017-4-22 10:16
標題:
基于51單片機、ds18b20溫度計設計源代碼
功能:1.顯示溫度;
2.顯示溫度上下限;
3.上下限可調;
4.顯示溫度傳感器序列碼;
5.溫度異常,分階段報警。
0.png
(55.74 KB, 下載次數: 61)
下載附件
2017-4-22 15:16 上傳
源程序:
//////////////////////////////////////////////////////////////////// /////////////////////////////////////////
/*
按鍵控制LCD顯示內容,(id號與當前溫度/上下限以及)
按鍵可調溫度的上下限。
*/
#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; //數據 命令選擇端
sbit rw = P3^6; //讀寫選擇端
uchar datstr[] = "Temperature:";
uchar str[4]; //uchartostr函數轉換的字符串 同時可以把16進制轉成10進制 存高低溫上下限
uchar str1[5]; //uchartostr1函數轉換的字符串 同時可以把16進制轉成10進制 存溫度
//sbit IDcheck=P2^5;
//sbit IDready=P3^1;
int flip=0; // 用來讀flip1 用于反轉
int flip1=1; //=1 開單鍵&用于雙鍵反轉
bit flag;//ds初始化成功標志
uchar ds_rom[16]; //存序列碼 存入的是字節
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' //序列碼字節轉ASCII專用數組
};
void delay(uint z); //延時函數 1602專用
void write_com(uchar com); //寫命令
void write_data(uchar date); //寫數據
void init_1602(); //初始化1602
uchar *uchartostr(uchar num); //將一個字節的數據轉換為字符串 或10進制 返回數組 上下限顯示用
uchar *uchartostr1(uint num); //將一個字節的數據轉換為字符串 或10進制 返回數組 溫度顯示用
void lcd_dis(uchar X,uchar Y,uchar *dis); //顯示數據數組
void lcd_distostr(uchar X,uchar Y);//顯示字符串temperature 數組
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; //記錄應答電平
else
flag=1; //失敗
TempDelay(20); //延時
ds=1; //置1結束
}
bit ds_read_bit() //(||)read a bit
{
bit dat;
ds=0; //DQ已經是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上一個函數 @先讀到的位為最低位
value=(j<<7)|(value>>1); //新bit左移7位,舊狀態右移一位空出最高位,組合
}
return value;
}
void ds_write_byte(uchar dat) //寫一字節
{
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); // //檢測到設備 成功返回0
ds_write_byte(0xcc); //jump ROM
ds_write_byte(0x44); //TEMP convert
}
void Read_ROM() //序列碼讀入數組 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位結合
ftemp=temp*0.0625; //12bit-->0.0625*10 (除以16,2^4,右移4位)
ftemp=ftemp*10+0.5; //取1位小數后四舍五入
temp=ftemp; //現在為10倍temp的整數 便于顯示
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; //狀態反轉 讀上一次狀態 每同時按一次 反轉一次
if(flip==1)
{
IDshow();
flip1=0; //flip1==1 關閉單鍵調節功能
}
else if(flip==0)
{
WarningShow(); //顯示上下限
flip1=1; //flip1==1 時才能監測其他按鍵來調上下限
}
}
}
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輔助小函數
void delay(uint z) //延時函數
{
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) //寫數據
{
P0=date;
rs=1; //寫數據
LCDEN=0;
delay(10);
LCDEN=1;
delay(10);
LCDEN=0;
}
void init_1602() //初始化1602
{
rw=0;
dula=0;
wela=0; //防止數碼管亂閃
write_com(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
delay(20);
write_com(0x0c); //顯示模式設置:開顯示 不顯示光標 也不閃爍
delay(20);
write_com(0x06); //顯示模式設置:光標右移,字符不移,不移動屏幕
delay(20);
write_com(0x01); //清屏幕指令,將以前的顯示內容清除
delay(20);
}
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////x數組 準備顯示//////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
uchar *uchartostr(uchar num) //將一個字節的數據轉換為字符串 或10進制 返回數組首地址 (上下限)
{
uchar x1,x0,i;
x1=num%100/10;
x0=num%100%10;
i=0; //數組第一元素
str[i]=x1+48; //變ASCII碼
i++;
str[i]=x0+48;
i++;
str[i]='\0'; //結束符
return str;
}
uchar *uchartostr1(uint num) //將一個字節的數據轉換為字符串 或10進制 返回數組(溫度專用)
{
uchar x2,x1,x0,i;
x2=num/100;
x1=num%100/10;
x0=num%10;
i=0; //數組第一元素
if(x2!=0)
{
str1[i]=x2+48; //變ASCII碼 十位
i++;
}
if(1)
{
str1[i]=x1+48; //個位
i++;
str1[i]=46; // "." 小數點
i++;
}
str1[i]=x0+48; //十分位
i++;
str1[i]='\0'; //結束符
return str1;
}
/////////////////////////////////////////////////////////////////////////////////
////////////////////////////x顯示////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void lcd_dis(uchar X,uchar Y,uchar *dis) //顯示數據數組
{
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); //寫入顯示地址設置
while(*dis!='\0') //
{
write_data(*dis++);
}
}
void lcd_distostr(uchar X,uchar Y)//顯示字符串temperature 數組
{
uchar pos,i;
i=0; //設定從數組中的第幾個字符串開始顯示
switch(X)
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
下載:
ds18b20_oo.zip
(60.74 KB, 下載次數: 36)
2017-4-22 10:14 上傳
點擊文件名下載附件
溫度計源代碼
下載積分: 黑幣 -5
作者:
ideachen
時間:
2017-12-25 00:56
請問按鍵是矩陣是按鍵嗎?
作者:
lsc_nj
時間:
2017-12-25 08:11
感謝無私奉獻。一起學習一起前進。
作者:
LIUBAOBAO
時間:
2017-12-25 12:05
按鍵改溫度怎么按鍵?
作者:
c51ds18b20
時間:
2017-12-27 12:39
太好了這設計
作者:
luo1429181965
時間:
2017-12-28 19:28
我做的數碼管不顯示十位后的溫度,很煩,自己也不知道哪里錯了。
作者:
zzqaqq
時間:
2018-1-4 14:57
謝謝樓主了,我正在學習,看一下
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲图片一区二区三区
|
国产精品成人一区二区三区
|
国产精品中文字幕在线观看
|
午夜一区二区三区在线观看
|
国产视频1区2区
|
新疆少妇videos高潮
|
国产精品一区二区免费
|
99久久精品免费
|
亚洲欧美精品
|
欧美一级片在线观看
|
欧美精品一区三区
|
蜜桃免费一区二区三区
|
一区二区久久
|
aaa在线
|
91精品国产一二三
|
亚洲免费视频播放
|
天天影视亚洲综合网
|
欧美精品久久久久
|
国产精品亚洲欧美日韩一区在线
|
一区二区精品电影
|
在线中文字幕日韩
|
麻豆久久久久久久
|
久久久精品一区二区
|
久久久成人免费视频
|
91精品国产麻豆
|
日韩欧美在线视频播放
|
国产精品免费一区二区三区四区
|
欧日韩不卡在线视频
|
麻豆精品国产91久久久久久
|
国产一区二区三区
|
狠狠色狠狠色综合日日92
|
国产精品日韩在线观看
|
狠狠躁天天躁夜夜躁婷婷老牛影视
|
日本午夜精品
|
亚洲高清视频一区二区
|
中文字幕一区在线观看视频
|
国产一级特黄真人毛片
|
高清不卡毛片
|
欧美国产视频
|
成人午夜电影在线观看
|
久久专区
|