找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3903|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

用單片機(jī)最小系統(tǒng)做18B20溫度測(cè)量試驗(yàn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:73477 發(fā)表于 2015-2-10 20:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
       由電子樂(lè)屋介紹的用單片機(jī)最小系統(tǒng)做18B20溫度測(cè)量試驗(yàn)的這個(gè)單片機(jī)實(shí)驗(yàn)項(xiàng)目,所用到的試驗(yàn)器材,單片機(jī)最小系統(tǒng)系統(tǒng)板、發(fā)光二極管制作的四位7段數(shù)碼管,DS18B20溫度傳感器。試驗(yàn)過(guò)程及碰到的問(wèn)題大家可一同進(jìn)行討論。試驗(yàn)前,將數(shù)碼管的A-H各段引線與單片機(jī)的P0.0-0.7口對(duì)應(yīng)用導(dǎo)線連接,將數(shù)碼管的位驅(qū)動(dòng)的℃位、小數(shù)位、個(gè)位十位與與單片機(jī)的P2.0、P2.1、P2.2、P2.3口連接。溫度傳感器DS18B20的1腳與GND連接、2腳與單片機(jī)的P1.0口連接、3腳與VCC連接。連接好的硬件下圖。將編譯好的HEX文件寫入單片機(jī)中,就可工作。單片機(jī)使用的是STC89C52RC單片機(jī),這種單片機(jī)可用板上的232口下載程序,只需要一條串口線,不需要額外的設(shè)備。源程序附后。這個(gè)程序測(cè)溫范圍為0-99.9℃。下面是試驗(yàn)板工作的照片。





        

用單片機(jī)最小系統(tǒng)做18B20溫度測(cè)量試驗(yàn)完整源程序

#include<reg52.h>

#include <intrins.h>
#define  uchar  unsigned  char
#define  uint   unsigned  int
sbit  DATA = P1^1; //DS18B20接入口
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共陽(yáng)字型碼


int temp;  //溫度值
int ss;  //中間的一個(gè)變量
int j;
uchar data buf[4];//字型顯示中間變量


sbit  LED1=P2^3;
sbit  LED2=P2^2;
sbit  LED3=P2^1;
sbit  LED4=P2^0;


int n;


void delay(uint);
//函數(shù)的定義區(qū)
/*延時(shí)子函數(shù)*/
void delay(uint num)
{
while(num--) ;
}


//DS18b20溫度傳感器所需函數(shù),分為初始化,讀寫字節(jié),讀取溫度4個(gè)函數(shù)
Init_DS18B20(void)     //傳感器初始化
{
  uchar x=0;
  DATA = 1;    //DQ復(fù)位
  delay(10);  //稍做延時(shí)
  DATA = 0;    //單片機(jī)將DQ拉低
  delay(80); //精確延時(shí) 大于 480us    //450
  DATA = 1;    //拉高總線
  delay(20);
  x=DATA;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  delay(30);
}
ReadOneChar(void)  //讀一個(gè)字節(jié)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
  {
    DATA = 0; // 給脈沖信號(hào)
    dat>>=1;
    DATA = 1; // 給脈沖信號(hào)
    if(DATA)
     dat|=0x80;
    delay(8);
  }
  return(dat);
}
WriteOneChar(unsigned char dat) //寫一個(gè)字節(jié)
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
    DATA = 0;
    DATA = dat&0x01;
   delay(10);
   DATA = 1;
   dat>>=1;
  }
delay(8);
}
int ReadTemperature(void) //讀取溫度
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
Init_DS18B20();
WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}


//顯示正值子函數(shù)
void  display()
{  
buf[1]=temp/1000;//顯示百位
buf[2]=temp/100%10;//顯示十位
buf[3]=temp%100/10;//顯示個(gè)位
buf[0]=temp%10; //小數(shù)
for(j=0;j<3;j++)
{
     P0=table[buf[2]];
  LED1=0;
  delay(70);
  LED1=1;
  delay(20);
  P0=table[buf[3]];
  LED2=0;
  delay(70);
  LED2=1;
  delay(20);
  P0=0x7F;
  LED2=0;
  delay(70);
  LED2=1;
  delay(20);
     P0=table[buf[0]];
  LED3=0;
  delay(70);
  LED3=1;
  delay(20);
  P0=0xC6;
  LED4=0;
  delay(70);
  LED4=1;
  delay(20);
}
}




void  main()
{
    TCON=0x01;
    TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
while(1)
{
  ss=ReadTemperature();
  display();
}  
}
void time0(void) interrupt 1 using 1  //每隔10ms執(zhí)行一次此子程序
{
TH0=0X56;
TL0=0XDC;
temp=ss;
}      






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:79034 發(fā)表于 2015-9-21 13:19 | 只看該作者
頂一個(gè)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表