資源簡介
C語言,基于飛凌OK6410開發板的DHT11驅動,內有詳細注釋

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?GPC_7?S3C64XX_GPC(7)
static?volatile?unsigned?char?values[4]={0000};
static?struct?class?*?dhtdrv_class;
static?struct?device?*?dht11_drv_device;
volatile?unsigned?long?*gpccon?=?NULL;
volatile?unsigned?long?*gpcdat?=?NULL;
int?major;
static?int?dht11_drv_open(struct?inode?*inodestruct?file?*?file)
{
/*設置GPC7為輸出引腳*/
*gpccon?&=?~(?0xf?<(4*7));
/*GPC7輸出高電平*/
*gpcdat?|=?(1<<7);
return?0;
}
static?char?dht11_drv_read_byte?(?void?)
{
char?dht11_byte?;
unsigned?char?i?;
unsigned?char?temp?;
dht11_byte?=?0?;
/*接收數據,并利用|和&存儲到dht11_byte*/
for?(?i?=?0?;?i?8?;?i?++?)
{
temp?=?0?;
/*50us傳輸間隔時間*/
while?(?!?(gpio_get_value?(?GPC_7?)?)?)
{
temp?++?;
if?(?temp?>?12?)
return?1?;
udelay?(?5?)?;
}
temp?=?0?;
/*根據接收到高電平持續的時長判斷數據是0還是1*/
while?(?gpio_get_value?(?GPC_7?)?)
{
temp?++?;
if?(?temp?>?20?)
return?1?;
udelay?(?5?)?;
}
/*大于6的話,也就是大于35us,數據為1,否則數據為0*/
if?(?temp?>?6?)
{
dht11_byte?<<=?1?;
dht11_byte?|=?1?;
}?
else
{
dht11_byte?<<=?1?;
dht11_byte?|=?0?;
}
}
return?dht11_byte?;
}
static?ssize_t?dht11_drv_read?(?struct?file*?filp?char?__user*?buf?size_t?count?loff_t*?f_pos?)
{
unsigned?char?DataTemp;
unsigned?char?i;
unsigned?char?err;
char?tempBuf[5];
err?=?0?;
/*設置GPC7為輸出引腳*/
*gpccon?&=?~(?0xf?<(?4*7)?);
*gpccon?|=?(?0x1?<(4*7));
/*GPC7輸出低電平*/
*gpcdat?&=?~(?1<<7?);
/*
等同于
s3c_gpio_cfgpin?(?GPC_7??S3C_GPIO_OUTPUT?);
gpio_set_value?(?GPC_7??0?);
*/
/*延時18毫秒,用于DHT11從待機狀態進入工作狀態*/
msleep?(?18?);//msleep()休眠延時函數,并不精確,實際延時時間會大于設置值
/*GPC7輸出高電平*/
*gpcdat?|=?(?1<<7?);
//gpio_set_value?(?GPC_7??1?);
udelay?(?40?); //udelay()忙等待函數延遲過程中無法運行其他任務.這個延遲的時間是準確但是浪費CPU,不適用魚長時間延時。
/*設置GPC7為輸入引腳*/
*gpccon?&=?~(?0xf?<(?4*7?));
/*
等同于
s3c_gpio_cfgpin?(?GPC_7??S3C_GPIO_INPUT?);
*/
/*
這時候DHT會發出80us的低電平信號,利用while等待信號結束。
下面這個函數在此間拔出?DHT11的話,將會進入死循環,
所以需要添加一個判斷。
while?(?!(?gpio_get_value?(?GPC_7?)?)?)
;
*/
while?(?!(?gpio_get_value?(?GPC_7?)?)?&&?DataTemp?)
{
DataTemp?--;
udelay?(?10?);
}
if?(?!DataTemp?)
{
err?=?1;
count?=?-EFAULT;
}
/*
同上,消掉80us的高電平信號。
while?(?(?gpio_get_value?(?GPC_7?)?)?)
;
*/
if?(?!err?)
{
DataTemp?=?10?;
while?(?(?gpio_get_value?(?GPC_7?)?)?&&?DataTemp?)
{
DataTemp?--;
udelay?(?10?);
}
if?(?!DataTemp?)
{
err?=?1;
count?=?-EFAULT;
}
}
if(?!err?)
{
/*利用數組接收數據
分別是:
8bit濕度整數數據
8bit濕度小數數據
8bi溫度整數數據
8bit溫度小數數據
8bit校驗和
*/
for?(?i?=?0;?i?5
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????162??2014-12-21?10:25??Makefile
?????文件????????609??2014-12-21?10:25??open.c
?????文件???????4622??2014-12-21?10:25??dht11_ok6410.c
-----------?---------??----------?-----??----
?????????????????5393????????????????????3
評論
共有 條評論