久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
自己做的基于單片機的溫度檢測系統(tǒng)
[打印本頁]
作者:
xiaojuan
時間:
2014-10-13 14:57
標題:
自己做的基于單片機的溫度檢測系統(tǒng)
該溫度檢測系統(tǒng)可直接測溫,測溫范圍為-125-+125度,還可以時時對不同時刻的溫度進行手動采樣,待采樣完成后,可以將采樣溫度一一讀出,也可進行定時采樣,例如間隔1秒采樣溫度一次,采樣開始有指示燈亮,采樣結(jié)束指示燈滅,停止采樣,一一讀出數(shù)據(jù)。
源程序
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P1^1;
sbit lcdrw=P1^2;
sbit lcden=P1^3;
sbit DQ = P3^7;
sbit JL=P3^0;
sbit DT=P3^1;
sbit DS=P3^2;
sbit LED=P3^3;
uchar code table0[]=" RUI LOVE YING";
uchar unm,temp,temp1,temp2,temp3,kk=0,s,tt=0;
uchar temp00,temp01,temp02,temp03,temp04,temp05,temp06,temp07,temp08,temp09;
uchar xs00,xs01,xs02,xs03,xs04,xs05,xs06,xs07,xs08,xs09;
/*************精確延時函數(shù)*****************/
void delay(unsigned char i)
{
while(--i);
}
/******************************************
此延時函數(shù)針對的是12Mhz的晶振
delay(0):延時518us 誤差:518-2*256=6
delay(1):延時7us (原帖寫"5us"是錯的)
delay(10):延時25us 誤差:25-20=5
delay(20):延時45us 誤差:45-40=5
delay(100):延時205us 誤差:205-200=5
delay(200):延時405us 誤差:405-400=5
*******************************************/
/*****************DS18B20******************/
void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command
{
DQ = 1; //DQ復位,不要也可行。
delay(1); //稍做延時
DQ = 0; //單片機拉低總線
delay(250); //精確延時,維持至少480us
DQ = 1; //釋放總線,即拉高了總線
delay(100); //此處延時有足夠,確保能讓DS18B20發(fā)出存在脈沖。
}
uchar Read_One_Byte() //讀取一個字節(jié)的數(shù)據(jù)read a byte date
//讀數(shù)據(jù)時,數(shù)據(jù)以字節(jié)的最低有效位先從總線移出
{
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //將總線拉低,要在1us之后釋放總線
//單片機要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。
_nop_(); //至少維持了1us,表示讀時序開始
dat >>= 1; //讓從總線上讀到的位數(shù)據(jù),依次從高位移動到低位。
DQ = 1; //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩上
delay(1); //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內(nèi)的最后部分
if(DQ) //控制器進行采樣
{
dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
}
delay(10); //此延時不能少,確保讀時序的長度60us。
}
return (dat);
}
void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //拉低總線
_nop_(); //至少維持了1us,表示寫時序(包括寫0時序或?qū)?時序)開始
DQ = dat&0x01; //從字節(jié)的最低位開始傳輸
//指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),
//因為15us后DS18B20會對總線采樣。
delay(10); //必須讓寫時序持續(xù)至少60us
DQ = 1; //寫完后,必須釋放總線,
dat >>= 1;
delay(1);
}
}
uint Get_Tmp() //獲取溫度get the temperature
{
uchar a,b;
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0x44); //溫度轉(zhuǎn)換指令
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0xbe); //讀暫存器指令
a = Read_One_Byte(); //讀取到的第一個字節(jié)為溫度LSB
b = Read_One_Byte(); //讀取到的第一個字節(jié)為溫度MSB
temp1 = b<<4;
temp3=(a&0xf0)>>4;
temp=temp1+temp3;
temp2=(a&0x0f)*0.0625*100;
return temp;
}
void delay1(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ;
}
void writen_com(uchar com)
{
lcdrs=0;
P2=com;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void writen_date(uchar date)
{
lcdrs=1;
P2=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void writen_sfm(uchar add,uchar date)
{
uchar bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10;
writen_com(0x80+0x40+add);
writen_date(0x30+bai);
writen_date(0x30+shi);
writen_date(0x30+ge);
}
void writen_sfm1(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
writen_com(0x80+0x40+add);
writen_date(0x30+shi);
writen_date(0x30+ge);
}
void main();
void xianshi_temp()
{
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('0');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs00);
writen_sfm(2,temp00);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('1');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs01);
writen_sfm(2,temp01);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('2');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs02);
writen_sfm(2,temp02);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('3');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs03);
writen_sfm(2,temp03);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('4');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs04);
writen_sfm(2,temp04);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('5');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs05);
writen_sfm(2,temp05);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('6');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs06);
writen_sfm(2,temp06);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('7');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs07);
writen_sfm(2,temp07);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('8');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs08);
writen_sfm(2,temp08);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
writen_com(0x01);
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
writen_date('9');
writen_com(0x80+0x40+0x05);
writen_date('.');
while(DT)
{
writen_sfm1(6,xs09);
writen_sfm(2,temp09);
}
if(DT ==0)
{
delay(5);
if(DT==0)
{
while(!DT);
s=0;
main();
}}}}}}}}}}}}}}}}}}}}}}
}
void record_temp()
{
if(JL == 0)
{
delay(5);
if(JL == 0)
{
while(!JL);
switch(s)
{
case 0:temp00=Get_Tmp(),xs00=temp2;break;
case 1:temp01=Get_Tmp(),xs01=temp2;break;
case 2:temp02=Get_Tmp(),xs02=temp2;break;
case 3:temp03=Get_Tmp(),xs03=temp2;break;
case 4:temp04=Get_Tmp(),xs04=temp2;break;
case 5:temp05=Get_Tmp(),xs05=temp2;break;
case 6:temp06=Get_Tmp(),xs06=temp2;break;
case 7:temp07=Get_Tmp(),xs07=temp2;break;
case 8:temp08=Get_Tmp(),xs08=temp2;break;
case 9:temp09=Get_Tmp(),xs09=temp2;break;
}
s++;
if(s==10)
s=0;
}
}
}
void init()
{
temp00=temp01=temp02=temp03=temp04=temp05=temp06=temp07=temp08=temp09=0;
xs00=xs01=xs02=xs03=xs04=xs05=xs06=xs07=xs08=xs09=0;
s=0;
LED=1;
lcden=0;
lcdrw=0;
writen_com(0x38);
writen_com(0x0c);
writen_com(0x06);
writen_com(0x80);
for(unm=0;unm<14;unm++)
{
writen_date(table0[unm]);
}
writen_com(0x80+0x40+0x05);
writen_date('.');
}
void main()
{TMOD=0X01; //定時器工作方式設定
TH0=(65536-50000)/256; //設定定時初值50MS
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1;
init();
while(1)
{
xianshi_temp();
record_temp();
writen_sfm1(6,temp2);
writen_sfm(2,Get_Tmp());
}
}
void time0() interrupt 1 //定時器0
{
if(DS==0)
{
delay(5);
if(DS==0)
{
LED=0;
if(tt==4)
{
tt=0;
switch(s)
{
case 0:temp00=Get_Tmp(),xs00=temp2;break;
case 1:temp01=Get_Tmp(),xs01=temp2;break;
case 2:temp02=Get_Tmp(),xs02=temp2;break;
case 3:temp03=Get_Tmp(),xs03=temp2;break;
case 4:temp04=Get_Tmp(),xs04=temp2;break;
case 5:temp05=Get_Tmp(),xs05=temp2;break;
case 6:temp06=Get_Tmp(),xs06=temp2;break;
case 7:temp07=Get_Tmp(),xs07=temp2;break;
case 8:temp08=Get_Tmp(),xs08=temp2;break;
case 9:temp09=Get_Tmp(),xs09=temp2;break;
}
s++;
if(s==10)
{s=0;
LED=1;
while(!DS);
}}}}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
Get_Tmp();
tt++;
}
復制代碼
作者:
bjk3388
時間:
2015-5-3 22:34
原理圖???
作者:
leichyi
時間:
2015-5-16 16:52
無圖無真相
作者:
13838851042
時間:
2015-5-16 18:26
學習學習,謝謝分享。
作者:
龍之骨
時間:
2015-5-17 00:49
原理圖呢
作者:
眾生作廢
時間:
2015-5-17 09:40
該溫度檢測系統(tǒng)可直接測溫,測溫范圍為-125-+125度,還可以時時對不同時刻的溫度進行手動采樣,待采樣完成后,可以將采樣溫度一一讀出,也可進行定時采樣,例如間隔1秒采樣溫度一次,采樣開始有指示燈亮,采樣結(jié)束指示燈滅,停止采樣,一一讀出數(shù)據(jù)。
作者:
around
時間:
2015-5-18 23:57
無圖無真相
作者:
hebut332678
時間:
2016-5-6 11:46
我試試行不行
作者:
洛克人
時間:
2019-10-4 22:17
怎么不附上實物圖啊??
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品久久久亚洲
|
久久久久国产一区二区三区
|
中文字幕第一页在线
|
精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频
|
日韩综合在线视频
|
91精品国产综合久久精品
|
香蕉视频久久久
|
国产精品久久久久久久久久妞妞
|
国产伦精品一区二区三区照片91
|
爱爱综合网
|
国产欧美在线视频
|
久久精品国产免费看久久精品
|
91久久精品日日躁夜夜躁国产
|
奇米影视首页
|
av永久免费
|
国产精品免费在线
|
欧美成人a∨高清免费观看 91伊人
|
精品一二区
|
天天爽天天干
|
中文欧美日韩
|
欧美激情精品久久久久久免费
|
久久综合av
|
亚洲欧美日韩在线一区二区
|
在线视频 亚洲
|
午夜天堂精品久久久久
|
成人免费精品视频
|
日韩视频免费看
|
国产在线拍偷自揄拍视频
|
国家一级黄色片
|
日韩在线观看网站
|
久久久久久成人
|
久久在线
|
国产成人自拍一区
|
在线免费黄色小视频
|
国产自产21区
|
亚洲天堂精品一区
|
精品国产一区二区三区久久影院
|
视频在线观看一区
|
欧美一级片免费看
|
香蕉久久久
|
免费能直接在线观看黄的视频
|