這個是LABVIEW界面,DS18B20的傳感器接收溫度,給單片機,單片機顯示并通過串口發(fā)送給LABVIEW,labview生成TXT文件,并保存歷史數(shù)據(jù)。壓縮包里的單片機程序。如果問題加群QQ:721277962(備注來自51黑)互相學習。單片機采用是51的單片機,數(shù)碼管顯示。使用的時候一定要連接串口。
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- sbit PS0=P2^4;//數(shù)碼管小數(shù)點后第1位
- sbit PS1=P2^5;//數(shù)碼管個位
- sbit PS2=P2^6;//數(shù)碼管十位
- sbit PS3=P2^7;//數(shù)碼管百位
- sfr P_data=0x80;//P0口為顯示數(shù)據(jù)輸出口
- sbit DQ=P3^6;//DS18B20數(shù)據(jù)接口
- void delay(unsigned int);//延時函數(shù)
- void DS18B20_init(void); //DS18B20初始化
- unsigned int get_temper(void); //讀取溫度程序
- void DS18B20_write(unsigned char in_data); //DS18B20寫數(shù)據(jù)函數(shù)
- unsigned char DS18B20_read(void);////讀取數(shù)據(jù)程序
- unsigned int htd(unsigned int a); //進制轉(zhuǎn)換函數(shù)
- void display(unsigned int a);//顯示函數(shù)
- float temp;//溫度寄存器
- bit DS18B20; // 18B20存在標志,1---存在 0---不存在
-
- unsigned char tab[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字段轉(zhuǎn)換表
-
- 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); //將溫度發(fā)送給PC
- while(TI!=1);
- TI=0;
- SBUF=(unsigned char)temp;
- while(TI!=1);
- TI=0;
- }
- }
- /****************************DS18B20讀取溫度函數(shù)**************************/
- /*函數(shù)原型:void get_temper(void)
- /*函數(shù)功能:DS18B20讀取溫度
- /*輸入?yún)?shù):無
- /*輸出參數(shù):無
- /*調(diào)用模塊:
- /**********************************************************************/
- 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); //發(fā)出溫度轉(zhuǎn)換命令
- DS18B20_init(); //DS18B20初始化
- if(DS18B20) //判斷DS1820是否存在?若DS18B20不存在則返回
- {
- DS18B20_write(0xcc);//跳過ROM匹配
- DS18B20_write(0xbe);//發(fā)出讀溫度命令
- T_L=DS18B20_read();//數(shù)據(jù)讀出
- T_H=DS18B20_read();
- k=T_H&0xf8;
- if(k==0xf8)
- T_sign=1; //溫度是負數(shù)
- else
- T_sign=0; //溫度是正數(shù)
- T_H=T_H&0x07;
- temp=(T_H*256+T_L)*10*0.0625; //溫度轉(zhuǎn)換常數(shù) 乘以10 是因為要保留1位小數(shù)
- return (temp);
- }
- }
-
- }
- /****************************DS18B20寫數(shù)據(jù)函數(shù)**************************/
- /*函數(shù)原型:void DS18B20_write(uchar in_data)
- /*函數(shù)功能:DS18B20寫數(shù)據(jù)
- /*輸入?yún)?shù):要發(fā)送寫入的數(shù)據(jù)
- /*輸出參數(shù):無
- /*調(diào)用模塊:_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++) //串行發(fā)送數(shù)據(jù)
- {
- DQ=0;
- DQ=1;
- _nop_();
- _nop_();
- k=out_data&0x01;
- if(k==0x01) //判斷數(shù)據(jù) 寫1
- {
- DQ=1;
- }
- else //寫0
- {
- DQ=0;
- }
- delay(4); //延時62us
- DQ=1;
- out_data=_cror_(out_data,1); //循環(huán)左移1位
- }
- }
- /**************************DS18B20讀函數(shù)**************************/
- /*函數(shù)原型:void DS18B20_read()
- /*函數(shù)功能:DS18B20讀數(shù)據(jù)
- /*輸入?yún)?shù):無
- /*輸出參數(shù):讀到的一字節(jié)內(nèi)容
- /*調(diào)用模塊:delay()
- /******************************************************************/
- unsigned char DS18B20_read()
- {
- unsigned char i,in_data,k;
- in_data=0;
- for(i=1;i<9;i++) //串行發(fā)送數(shù)據(jù)
- {
- DQ=0;
- DQ=1;
- _nop_();
- _nop_();
- k=DQ; //讀DQ端
- if(k==1) //讀到的數(shù)據(jù)是1
- {
- in_data=in_data|0x01;
- }
- else
- {
- in_data=in_data|0x00;
- }
- delay(3); //延時51us
- DQ=1;
- in_data=_cror_(in_data,1); //循環(huán)右移1位
- }
- return(in_data);
- }
-
- /**************************DS18B20初始化函數(shù)**************************/
- /*函數(shù)原型:void DS18B20_init(void)
- /*函數(shù)功能:DS18B20初始化
- /*輸入?yún)?shù):無
- /*輸出參數(shù):無
- /*調(diào)用模塊:delay()
- /******************************************************************/
- void DS18B20_init(void)
- {
- unsigned char a;
- DQ=1;//主機發(fā)出復位低脈沖
- 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
- }
- }
-
-
- /**************************數(shù)碼管顯示函數(shù)**************************/
- /*函數(shù)原型:void display(void)
- /*函數(shù)功能:數(shù)碼管顯示
- /*輸入?yún)?shù):無
- /*輸出參數(shù):無
- /*調(diào)用模塊:delay()
- /******************************************************************/
- void display(unsigned int a)
- {
- P_data=tab[a&0x0f];//顯示小數(shù)點后第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;//恢復數(shù)據(jù)口
- }
-
- /**************************十六進制轉(zhuǎn)十進制函數(shù)**************************/
- /*函數(shù)原型:uint htd(uint a)
- /*函數(shù)功能:十六進制轉(zhuǎn)十進制
- /*輸入?yún)?shù):要轉(zhuǎn)換的數(shù)據(jù)
- /*輸出參數(shù):轉(zhuǎn)換后的數(shù)據(jù)
- /*調(diào)用模塊:無
- /******************************************************************/
- 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;
- }
- /*******************************延時函數(shù)*********************************/
- /*函數(shù)原型:delay(unsigned int delay_time)
- /*函數(shù)功能:延時函數(shù)
- /*輸入?yún)?shù):delay_time (輸入要延時的時間)
- /*輸出參數(shù):無
- /*調(diào)用模塊:無
- /**********************************************************************/
- void delay(unsigned int delay_time) //延時子程序
- {for(;delay_time>0;delay_time--)
- {}
- }
復制代碼 |