當前位置:編程學習大全網 - 源碼下載 - 51單片機測溫度,速度通過串口發送求方法

51單片機測溫度,速度通過串口發送求方法

壹下程序是51單片機的程序。P0口是八段數碼管,wela、dula分別是數碼管位選和段選。 DS18S20接在P2^2口。

//安裝目錄下的EXE文件打開後可在電腦上顯示當前溫度值

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P2^2; //define interface of DS18B20

sbit dula=P2^6;

sbit wela=P2^7;

uint pre_temp=0; //儲存當前溫度值,以減少串口工作頻率

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef};

void delay(uint count) //delay

{

uint i;

while(count)

{

i=200;

while(i>0)

i--;

count--;

}

}

///////功能:串口初始化,波特率9600,方式1///////

void Init_Com(void)

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd;

TL1 = 0xFd;

TR1 = 1;

}

void dsreset(void) //send reset and initialization command 18B20復位,初始化函數

{

uint i;

DS=0;

i=103;

while(i>0)i--;

DS=1;

i=4;

while(i>0)i--;

}

bit tmpreadbit(void) //read a bit 讀1位數據函數

{

uint i;

bit dat;

DS=0;i++; //i++ for delay

DS=1;i++;i++;

dat=DS;

i=8;while(i>0)i--;

return (dat);

}

uchar tmpread(void) //read a byte date 讀1字節函數

{

uchar i,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tmpreadbit();

dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好壹個字節在DAT裏

}

return(dat);

}

void tmpwritebyte(uchar dat) //write a byte to ds18b20 向1820寫壹個字節數據函數

{

uint i;

uchar j;

bit testb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb) //write 1

{

DS=0;

i++;i++;

DS=1;

i=8;while(i>0)i--;

}

else

{

DS=0; //write 0

i=8;while(i>0)i--;

DS=1;

i++;i++;

}

}

}

void tmpchange(void) //DS18B20 begin change 開始獲取數據並轉換

{

dsreset();

delay(1);

tmpwritebyte(0xcc); // address all drivers on bus 寫跳過讀ROM指令

tmpwritebyte(0x44); // initiates a single temperature conversion 寫溫度轉換指令

}

uint tmp() //get the temperature 讀取寄存器中存儲的溫度數據

{

float tt;

uchar a,b;

uint temp; // variable of temperature

dsreset();

delay(1);

tmpwritebyte(0xcc);

tmpwritebyte(0xbe);

a=tmpread(); //讀低8位

b=tmpread(); //讀高8位

temp=b;

temp<<=8; //two byte compose a int variable 兩個字節組合為1個字

temp=temp|a;

tt=temp*0.0625; //溫度在寄存器中是12位,分辨率是0.0625

temp=tt*10+0.5; //乘10表示小數點後只取1位,加0.5是四折五入

return temp;

}

// 讀 DS18B20 的rom,本程序沒有調用該函數,保留以保證程序的完整性

// void readrom() //read the serial

// {

// uchar sn1,sn2;

// dsreset();

// delay(1);

// tmpwritebyte(0x33);

// sn1=tmpread();

// sn2=tmpread();

// }

void display(uint temp) //顯示程序

{

uchar A1,A2,A2t,A3,ser;

uchar serial_flag = 0; //每當產生新溫度時通過串口進行更新,此為標誌位

if ( temp != pre_temp )

{

serial_flag = 1;

pre_temp = temp;

}

A1=temp/100;

A2t=temp%100;

A2=A2t/10;

A3=A2t%10;

dula=0;

P0=table[A1]; //顯示百位

if ( serial_flag )

{

ser = temp/256; //發送串口數據高位

SBUF = ser;

}

dula=1;

dula=0;

wela=0;

P0=0x7e;

wela=1;

wela=0;

delay(1);

dula=0;

P0=table1[A2]; //顯示十位

if ( serial_flag )

{

ser = temp%256; //發送串口數據低位

SBUF = ser;

}

dula=1;

dula=0;

wela=0;

P0=0x7d;

wela=1;

wela=0;

delay(1);

P0=table[A3]; //顯示個位

if ( serial_flag )

{

ser = 0xff; //發送串口同步標誌信號,後跟著的高位信號不可能達到此值,除非是在孫悟空在八卦爐裏

SBUF = ser;

}

dula=1;

dula=0;

P0=0x7b;

wela=1;

wela=0;

delay(1);

}

void main()

{

uchar a;

Init_Com();

do

{

tmpchange();

// delay(200);

for(a=10;a>0;a--)

{

display(tmp());

}

}while(1);

}

  • 上一篇:ZBarSDK怎麽可以快速讀取和解碼
  • 下一篇:經典的8歲少兒謎語集錦
  • copyright 2024編程學習大全網