欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
LABVIEW基于單片機串口的溫度顯示DS8B20并用文本保存
[打印本頁]
作者:
lyh一點點
時間:
2020-4-28 11:00
標題:
LABVIEW基于單片機串口的溫度顯示DS8B20并用文本保存
這個是LABVIEW界面,DS18B20的傳感器接收溫度,給單片機,單片機顯示并通過串口發送給LABVIEW,labview生成TXT文件,并保存歷史數據。壓縮包里的單片機程序。如果問題加群QQ:721277962(備注來自51黑)互相學習。單片機采用是51的單片機,數碼管顯示。使用的時候一定要連接串口。
11.png
(181.5 KB, 下載次數: 97)
下載附件
2020-4-28 10:54 上傳
單片機源程序如下:
#include<reg51.h>
#include<intrins.h>
sbit PS0=P2^4;//數碼管小數點后第1位
sbit PS1=P2^5;//數碼管個位
sbit PS2=P2^6;//數碼管十位
sbit PS3=P2^7;//數碼管百位
sfr P_data=0x80;//P0口為顯示數據輸出口
sbit DQ=P3^6;//DS18B20數據接口
void delay(unsigned int);//延時函數
void DS18B20_init(void); //DS18B20初始化
unsigned int get_temper(void); //讀取溫度程序
void DS18B20_write(unsigned char in_data); //DS18B20寫數據函數
unsigned char DS18B20_read(void);////讀取數據程序
unsigned int htd(unsigned int a); //進制轉換函數
void display(unsigned int a);//顯示函數
float temp;//溫度寄存器
bit DS18B20; // 18B20存在標志,1---存在 0---不存在
unsigned char tab[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字段轉換表
void main(void)
{
unsigned int a,temp;
TMOD=0x20; //定時器1--方式2
//PCON=0x80; //電源控制 19200
TL1=0xfd;
TH1=0xfd; //11.0592MHZ晶振,波特率為9600
SCON=0x50; //方式1
TR1=1; //啟動定時
temp=get_temper();//這段程序用于避開剛上電時顯示85的問題
for(a=0;a<200;a++)
delay(500);
while(1)
{
temp=get_temper();//測量溫度
for(a=0;a<100;a++)//顯示,兼有延時的作用
display(htd(temp));
SBUF=(unsigned char)(temp>>8); //將溫度發送給PC
while(TI!=1);
TI=0;
SBUF=(unsigned char)temp;
while(TI!=1);
TI=0;
}
}
/****************************DS18B20讀取溫度函數**************************/
/*函數原型:void get_temper(void)
/*函數功能:DS18B20讀取溫度
/*輸入參數:無
/*輸出參數:無
/*調用模塊:
/**********************************************************************/
unsigned int get_temper(void)
{
unsigned char k,T_sign,T_L,T_H;
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判斷DS1820是否存在?若DS18B20不存在則返回
{
DS18B20_write(0xcc); // 跳過ROM匹配
DS18B20_write(0x44); //發出溫度轉換命令
DS18B20_init(); //DS18B20初始化
if(DS18B20) //判斷DS1820是否存在?若DS18B20不存在則返回
{
DS18B20_write(0xcc);//跳過ROM匹配
DS18B20_write(0xbe);//發出讀溫度命令
T_L=DS18B20_read();//數據讀出
T_H=DS18B20_read();
k=T_H&0xf8;
if(k==0xf8)
T_sign=1; //溫度是負數
else
T_sign=0; //溫度是正數
T_H=T_H&0x07;
temp=(T_H*256+T_L)*10*0.0625; //溫度轉換常數 乘以10 是因為要保留1位小數
return (temp);
}
}
}
/****************************DS18B20寫數據函數**************************/
/*函數原型:void DS18B20_write(uchar in_data)
/*函數功能:DS18B20寫數據
/*輸入參數:要發送寫入的數據
/*輸出參數:無
/*調用模塊:_cror_()
/**********************************************************************/
void DS18B20_write(unsigned char in_data) //寫DS18B20的子程序(有具體的時序要求)
{
unsigned char i,out_data,k;
out_data=in_data;
for(i=1;i<9;i++) //串行發送數據
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=out_data&0x01;
if(k==0x01) //判斷數據 寫1
{
DQ=1;
}
else //寫0
{
DQ=0;
}
delay(4); //延時62us
DQ=1;
out_data=_cror_(out_data,1); //循環左移1位
}
}
/**************************DS18B20讀函數**************************/
/*函數原型:void DS18B20_read()
/*函數功能:DS18B20讀數據
/*輸入參數:無
/*輸出參數:讀到的一字節內容
/*調用模塊:delay()
/******************************************************************/
unsigned char DS18B20_read()
{
unsigned char i,in_data,k;
in_data=0;
for(i=1;i<9;i++) //串行發送數據
{
DQ=0;
DQ=1;
_nop_();
_nop_();
k=DQ; //讀DQ端
if(k==1) //讀到的數據是1
{
in_data=in_data|0x01;
}
else
{
in_data=in_data|0x00;
}
delay(3); //延時51us
DQ=1;
in_data=_cror_(in_data,1); //循環右移1位
}
return(in_data);
}
/**************************DS18B20初始化函數**************************/
/*函數原型:void DS18B20_init(void)
/*函數功能:DS18B20初始化
/*輸入參數:無
/*輸出參數:無
/*調用模塊:delay()
/******************************************************************/
void DS18B20_init(void)
{
unsigned char a;
DQ=1;//主機發出復位低脈沖
DQ=0;
delay(44); //延時540US
DQ=1;
for(a=0;a<0x36&&DQ==1;a++)
{
a++;
a--; //等待DS18B20回應
}
if(DQ)
DS18B20=0; //18B20不存在
else
{
DS18B20=1; // 18B20存在
delay(120); //復位成功!延時240US
}
}
/**************************數碼管顯示函數**************************/
/*函數原型:void display(void)
/*函數功能:數碼管顯示
/*輸入參數:無
/*輸出參數:無
/*調用模塊:delay()
/******************************************************************/
void display(unsigned int a)
{
P_data=tab[a&0x0f];//顯示小數點后第1位
PS0=0;
PS1=1;
PS2=1;
PS3=1;
delay(200);
P_data=tab[(a>>4)&0x0f]|0x01; //顯示個位
PS0=1;
PS1=0;
delay(200);
P_data=tab[(a>>8)&0x0f];//顯示十位
PS1=1;
PS2=0;
delay(200);
P_data=tab[(a>>12)&0x0f];//顯示百位
PS2=1;
PS3=0;
delay(200);
PS3=1;
P_data=0xff;//恢復數據口
}
/**************************十六進制轉十進制函數**************************/
/*函數原型:uint htd(uint a)
/*函數功能:十六進制轉十進制
/*輸入參數:要轉換的數據
/*輸出參數:轉換后的數據
/*調用模塊:無
/******************************************************************/
unsigned int htd(unsigned int a)
{
unsigned int b,c;
b=a%10;
c=b;
a=a/10;
b=a%10;
c=c+(b<<4);
a=a/10;
b=a%10;
c=c+(b<<8);
a=a/10;
b=a%10;
c=c+(b<<12);
return c;
}
/*******************************延時函數*********************************/
/*函數原型:delay(unsigned int delay_time)
/*函數功能:延時函數
/*輸入參數:delay_time (輸入要延時的時間)
/*輸出參數:無
/*調用模塊:無
/**********************************************************************/
void delay(unsigned int delay_time) //延時子程序
{for(;delay_time>0;delay_time--)
{}
}
復制代碼
作者:
13118302007
時間:
2020-9-12 23:36
可惜沒有附件?
作者:
jerryzuohuang
時間:
2020-9-18 20:47
沒有看到附件,也想學習
作者:
qhp777
時間:
2020-10-29 10:59
對新手來說,有參考意義
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1