久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

DS18B20和串口通信的那點事兒 ? 笨笨剝殼

 guitarhua 2014-12-01

DS18B20是美國DALLAS公司生產(chǎn)的單總線數(shù)字式傳感器,,能夠?qū)囟任锢砹哭D化為數(shù)字信號,而且每個器件具有唯一的序號,,因此能夠?qū)崿F(xiàn)多點測量。它的測量范圍為-55°C~+125°C,,其中在-10°C~+85°C的范圍內(nèi)的測量精度可以達到±0.5°C,。

它只有三個引腳,GND、DQ,、VDD,,可以直接由數(shù)據(jù)線本身寄生供電,也可以采用外部供電,,使用起來很方便,,當然這種方便也是要付出一定代價的,DS18B20的時序要求相當嚴格,,系統(tǒng)對DS18B20的各種操作必須按協(xié)議進行,,操作的協(xié)議為:初始化DS18B20;發(fā)ROM功能命令,;發(fā)存儲器操作命令,;處理數(shù)據(jù)。如果程序中有較多的中斷,,抑或是硬件連接時連線過長,,都會造成時序波形的畸變,從而造成測量結果混亂,,因此這種情況也使得該芯片的使用受到了一定的限制,。

這個圖是Proteus仿真時示波器觀察到的DQ引腳的初始化時序情況:

主機在初始時刻發(fā)送一復位脈沖(最短為480us的低電平信號),接著釋放總線并進入接收狀態(tài),,DS18B20在檢測到總線的上升沿之后,,等待15~60us,接著若初始化成功,,DS18B20會發(fā)出存在脈沖(低電平,,持續(xù)60~240us)。

下邊是之前做過的一個溫度測量程序的硬件原理圖,,采集到的溫度以16進制分別以高8位和低8位的形式通過RS232串口發(fā)送到上位機,,后續(xù)的處理就交由上位機編程控制了,。

這里值得注意的是DS18B20的DQ口需要接一個上拉電阻,這是因為一般的IO引腳驅(qū)動能力是20mA以內(nèi),,而上拉電阻的意義就是為了增加驅(qū)動能力,。不過要想使DS18B20進行精確的溫度轉換,I/O線必須保證在溫度轉換期間提供足夠的能量,,由于每個DS18B20在溫度轉換期間工作電流達到1mA,,當幾個溫度傳感器掛在同一根I/O線上進行多點測溫時,只靠4.7K上拉電阻就無法提供足夠的能量,,會造成無法轉換溫度或溫度誤差極大,。

下邊是Keil C51的程序代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <regx51.h>
#include "intrins.h" //_nop_();延時函數(shù)用
 
#define XTAL 11059200 // CUP	晶振頻率
#define baudrate 9600 // 通信波特率
 
#define uchar unsigned char
#define uint unsigned int
 
sbit DQ=P3^3; // 定義DS18B20端口DQ 
sbit BEEP=P3^7;
 
unsigned char presence;
unsigned char data  temp_data[2] = {0x00,0x00};
void beep();
bit flash=0; // 顯示開關標記
 
void Delay(unsigned int num) { // 延時函數(shù)
  	while(--num);
}
 
uchar Init_DS18B20(void) { // 初始化ds1820
 
     DQ=1; // DQ復位
     Delay(8); // 稍做延時
 
     DQ=0; // 單片機將DQ拉低
     Delay(90); // 精確延時 大于 480us
 
     DQ=1; // 拉高總線
     Delay(8);
 
     presence=DQ; // 如果=0則初始化成功 =1則初始化失敗
     Delay(100);
     DQ=1; 
 
     return(presence); // 返回信號,0=presence,1= no presence
}
 
uchar ReadOneChar(void) { // 讀一個字節(jié)
	uchar i;
	uchar value=0;
	for(i=8;i>0;i--) {
		DQ=1;_nop_();_nop_();
		value>>=1;
		DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
		DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
		if(DQ) value|=0x80;
		Delay(6); //66 us
	}
	DQ=1;
	return(value);
}
 
void WriteOneChar(unsigned char dat) { // 寫一個字節(jié)
  	unsigned char i=0;
 
  	for(i=8;i>0;i--) {
    	DQ=0;
    	DQ=dat&0x01;
    	Delay(5);
 
    	DQ=1;
    	dat>>=1;
  	}
}
 
void Read_Temperature(void) { // 讀取溫度
  	Init_DS18B20();
 
  	if(presence==1) { 
		beep();
		flash=1;
	} // DS18B20不正常,,蜂鳴器報警
   	else {
     	flash=0;
     	WriteOneChar(0xCC); // 跳過讀序號列號的操作
     	WriteOneChar(0x44); // 啟動溫度轉換
 
     	Init_DS18B20();
     	WriteOneChar(0xCC); // 跳過讀序號列號的操作
	    WriteOneChar(0xBE); // 讀取溫度寄存器
 
     	temp_data[0]=ReadOneChar(); // 溫度低8位
     	temp_data[1]=ReadOneChar(); // 溫度高8位 
   	}
}
 
void beep(void) {
    unsigned char i;
    for(i=0;i<100;i++) {
      	Delay(60);
      	BEEP=!BEEP; // BEEP取反
    } 
    BEEP=1; // 關閉蜂鳴器
}
 
void init(void) {
	EA=1; // "中斷總允許"
 
	TMOD=0x20; // 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率
 
	TH1=(unsigned char)(256-(XTAL/(32L*12L*baudrate)));
	TL1=(unsigned char)(256-(XTAL/(32L*12L*baudrate))); // 定時器0賦初值
 
	SCON=0x50; // 設定串行口工作方式
	PCON&=0x00; // 波特率不倍增
 
	TR1=1; // 啟動定時器1
	IE=0x00; // 禁止任何中斷
}
 
// 傳送十六位的溫度數(shù)據(jù),,低位在前
void send_char(void) {
	unsigned i=0;
 
	while(i < 2) {
		SBUF=temp_data[i];
		while(!TI);// 等特數(shù)據(jù)傳送
		TI=0;// 清除數(shù)據(jù)傳送標志
		i++;
	}
}
 
void main(void) {
	uchar receive;
  	init();
 
  	while(1) {
		Read_Temperature(); // 讀取溫度
 
		if(flash==0) {
			// 顯示溫度
		} else {
			// DS18B20不正常
		}
 
		Delay(4000); //延時防止總線忙
 
		if(RI) { // 是否有數(shù)據(jù)到來
			RI=0;
			receive=SBUF;
 
			if(receive=='s') { // 是否開始采集溫度
				send_char(); // 傳送采集的溫度
			}
		}
	}
}

如果接下來用串口調(diào)試助手調(diào)試,就會發(fā)現(xiàn)一旦上位機發(fā)送握手信號”s”,,就會接收到硬件電路發(fā)送回來的16進制信號,,比如溫度為+85°C,就會收到50H 05H,,下邊的事情就是程序員通過軟件語言對接收到的數(shù)據(jù)的處理并顯示了,。

下圖是我當時做系統(tǒng)時候用VB6寫的上位機界面:

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多