由電子樂屋介紹的用單片機最小系統做18B20溫度測量試驗的這個單片機實驗項目,所用到的試驗器材,單片機最小系統系統板、發光二極管制作的四位7段數碼管,DS18B20溫度傳感器。試驗過程及碰到的問題大家可一同進行討論。試驗前,將數碼管的A-H各段引線與單片機的P0.0-0.7口對應用導線連接,將數碼管的位驅動的℃位、小數位、個位十位與與單片機的P2.0、P2.1、P2.2、P2.3口連接。溫度傳感器DS18B20的1腳與GND連接、2腳與單片機的P1.0口連接、3腳與VCC連接。連接好的硬件下圖。將編譯好的HEX文件寫入單片機中,就可工作。單片機使用的是STC89C52RC單片機,這種單片機可用板上的232口下載程序,只需要一條串口線,不需要額外的設備。源程序附后。這個程序測溫范圍為0-99.9℃。下面是試驗板工作的照片。
用單片機最小系統做18B20溫度測量試驗完整源程序
#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};//共陽字型碼
int temp; //溫度值
int ss; //中間的一個變量
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);
//函數的定義區
/*延時子函數*/
void delay(uint num)
{
while(num--) ;
}
//DS18b20溫度傳感器所需函數,分為初始化,讀寫字節,讀取溫度4個函數
Init_DS18B20(void) //傳感器初始化
{
uchar x=0;
DATA = 1; //DQ復位
delay(10); //稍做延時
DATA = 0; //單片機將DQ拉低
delay(80); //精確延時 大于 480us //450
DATA = 1; //拉高總線
delay(20);
x=DATA; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(30);
}
ReadOneChar(void) //讀一個字節
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DATA = 0; // 給脈沖信號
dat>>=1;
DATA = 1; // 給脈沖信號
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
WriteOneChar(unsigned char dat) //寫一個字節
{
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); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
//顯示正值子函數
void display()
{
buf[1]=temp/1000;//顯示百位
buf[2]=temp/100%10;//顯示十位
buf[3]=temp%100/10;//顯示個位
buf[0]=temp%10; //小數
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執行一次此子程序
{
TH0=0X56;
TL0=0XDC;
temp=ss;
}
|