一、驅動程序介紹
驅動程序一般指的是設備驅動程序(Device Driver),是一種可以使計算機和設備通信的特殊程序。相當于硬件的接口,操作系統只有通過這個接口,才能控制硬件設備的工作,假如某設備的驅動程序未能正確安裝,便不能正常工作。因此,驅動程序被比作“ 硬件的靈魂”、“硬件的主宰”、和“硬件和系統之間的橋梁”等。
驅動程序(Device Driver)全稱為“設備驅動程序”,是一種可以使計算機和設備通信的特殊程序,可以說相當于硬件的接口,操作系統只能通過這個接口,才能控制硬件設備的工作,假如某設備的驅動程序未能正確安裝,便不能正常工作。正因為這個原因,驅動程序在系統中的所占的地位十分重要,一般當操作系統安裝完畢后,首要的便是安裝硬件設備的驅動程序。不過,大多數情況下,我們并不需要安裝所有硬件設備的驅動程序,例如硬盤、顯示器、光驅等就不需要安裝驅動程序,而顯卡、聲卡、掃描儀、攝像頭、Modem等就需要安裝驅動程序。另外,不同版本的操作系統對硬件設備的支持也是不同的,一般情況下版本越高所支持的硬件設備也越多,例如筆者使用了Windows XP,裝好系統后一個驅動程序也不用安裝。
驅動程序的作用:
隨著電子技術的飛速發展,電腦硬件的性能越來越強大。驅動程序是直接工作在各種硬件設備上的軟件,其“驅動”這個名稱也十分形象的指明了它的功能。正是通過驅動程序,各種硬件設備才能正常運行,達到既定的工作效果。
硬件如果缺少了驅動程序的“驅動”,那么本來性能非常強大的硬件就無法根據軟件發出的指令進行工作,硬件就是空有一身本領都無從發揮,毫無用武之地。這時候,電腦就正如古人所說的“萬事俱備,只欠東風”,這“東風”的角色就落在了驅動程序身上。如此看來,驅動程序在電腦使用上還真起著舉足輕重的作用。
從理論上講,所有的硬件設備都需要安裝相應的驅動程序才能正常工作。但像CPU、內存、主板、軟驅、鍵盤、顯示器等設備卻并不需要安裝驅動程序也可以正常工作,而顯卡、聲卡、網卡等卻一定要安裝驅動程序,否則便無法正常工作。這是為什么呢?
這主要是由于這些硬件對于一臺個人電腦來說是必需的,所以早期的設計人員將這些硬件列為BIOS能直接支持的硬件。換句話說,上述硬件安裝后就可以被BIOS和操作系統直接支持,不再需要安裝驅動程序。從這個角度來說,BIOS也是一種驅動程序。但是對于其他的硬件,例如:網卡,聲卡,顯卡等等 卻必須要安裝驅動程序,不然這些硬件就無法正常工作。
當然,也并非所有驅動程序都是對實際的硬件進行操作的,有的驅動程序只是輔助系統的運行,如android中的有些驅動程序提供輔助操作系統的功能,這些驅動不是linux系統的標準驅動,如ashmen,binder等。
二、DHT11溫濕度傳感器介紹
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器,它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,使其成為該類應用中,在苛刻應用場合的最佳選擇。產品為4針單排引腳封裝,連接方便。
DHT11電氣特性:
DHT11引腳說明:
DHT11封裝詳情:
三、溫濕度傳感器DHT11的驅動程序
#include “typedef.h”
#include 《msp430g2553.h》
#include “TemDHT11.h”
#ifndef _DHT11_TYPE
#define _DHT11_TYPE
//連接端口
#define DHT11_Dir P2DIR
#define DHT11_In P2IN
#define DHT11_Out P2OUT
#define DHT11_Bit BIT4
#endif
//8bit濕度+8bit濕度小數點
//8bit溫度+8bit溫度小數點
//數據位為0是高電平26~28us | 1高電平70us
u8 DHT11_Data[5] = {0}; //從DHT11中讀到的數據
void read_DHT11(u8 *Data)
{
u8 re,m,n,Time_out;
DHT11_Dir &= (~DHT11_Bit); //引腳為輸入
for(n = 0; n 《 5; n++)
{
for(m = 0; m 《 8; m++)
{
while( !(DHT11_In & DHT11_Bit) ); //每1bit以50us低電平時限開始,直到高電平到來
delay_us(30);
re = 0;
if((DHT11_In & DHT11_Bit)) //30us后還是高電平說明是1
{
re = 1;
}
Time_out = 2;
while((DHT11_In & DHT11_Bit) && (Time_out++ ));
if(Time_out == 1) //超時處理
{
break;
}
*Data 《《= 1;
if(re)
{
*Data |= 0x01;
}
}
Data++;
}
}
//DHT11的握手協議模擬和數據的讀取
u8 DHT11_GetData(void)
{
u8 o,sum;
DHT11_Dir |= DHT11_Bit;
DHT11_Out &= ~DHT11_Bit; //拉低,發出開始信號
delay_ms(18); //拉低18ms
DHT11_Out |= DHT11_Bit; //拉高20us等待
delay_us(20);
DHT11_Dir &= (~DHT11_Bit);
if( !(DHT11_In & DHT11_Bit) ) //DHT11響應
{
while( !(DHT11_In & DHT11_Bit) ); //80us低電平,等待DHT11的響應信號
while( (DHT11_In & DHT11_Bit) ); //DHT11準備發送數據
read_DHT11(DHT11_Data); //主機接收數據
sum = 0;
for(o = 0; o 《 4; o++) //數據校驗
{
sum += DHT11_Data[o];
}
if(sum != DHT11_Data[4])
{
return 0;
}
else
{
return 1;
}
}
return 0;
}
//對溫度濕度進行格式化(如果獲取溫度成功)
void DHT11_format(char *Des_str)
{
Des_str[0] = DHT11_Data[0]/10 + 0x30;
Des_str[1] = DHT11_Data[0] + 0x30;
Des_str[2] = ‘。’;
Des_str[3] = DHT11_Data[1]/10 + 0x30;
Des_str[4] = DHT11_Data[1] + 0x30;
Des_str[5] = ‘%’;
Des_str[6] = ‘ ’;
Des_str[7] = DHT11_Data[2]/10 + 0x30;
Des_str[8] = DHT11_Data[2] + 0x30;
Des_str[9] = ‘。’;
Des_str[10] = DHT11_Data[3]/10 + 0x30;
Des_str[11] = DHT11_Data[3] + 0x30;
Des_str[12] = ‘C’;
Des_str[13] = 0;
}
評論
查看更多