一、驱动程序介绍
驱动程序一般指的是设备驱动程序(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;
}
评论
查看更多