網上找到cc2530讀取DHT11的溫濕度源代碼,由于是基于8051內核,需要改成cc2530的內核鏈接12864屏幕,更改之后DHT11時序不對,不知道問題所再,再次請教大佬問題所再。附上代碼
DHT11.C
#include <ioCC2530.h>
#include "DHT.h"
#define DHT11 P0_6
int Check;
uchar TL,TH,HL,HH,temp[2],hum[2];
//延時函數
void Delay_us() //1 us延時
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void Delay_10us() //10 us延時
{
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
Delay_us();
}
void Delay_ms(uint Time)//n ms延時
{
unsigned char i;
while(Time--)
{
for(i=0;i<100;i++)
Delay_10us();
}
}
void DHT11Input()
{
P0SEL &= ~0X40; //設置 P06 為普通 IO 口
P0DIR &= ~0x40; //重新配置IO口方向
}
void DHT11Output()
{
P0SEL &= ~0X40; //設置 P06 為普通 IO 口
P0DIR |= 0x40; //重新配置IO口方向
}
/***********************
溫濕度傳感
***********************/
uchar Read_Byte()//讀一個字節—八位
{
uchar i,data;
DHT11Input();
for(i=0;i<8;i++)
{
while(!DHT11);
Delay_10us();
Delay_10us();
Delay_10us();
// Delay_10us();
// Delay_10us();
data<<=1;
if(DHT11)
{
data|=0x01;
while(DHT11);
} else data|=0x00;
//data<<=1;
}
return data;
}
void Start()//起始信號
{
DHT11Output();
DHT11=0;
Delay_ms(20);
DHT11=1;
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
DHT11Input();
if(!DHT11)
{
while(!DHT11);
while(DHT11);
HH=Read_Byte();
HL=Read_Byte();
TH=Read_Byte();
TL=Read_Byte();
Check=Read_Byte();
DHT11=1;
}
}
void Temp()//讀出溫濕度數據 并放入數組里
{
Start();
if(Check==HH+HL+TH+TL)//數據校驗
{
temp[0]=TH/10+48;temp[1]=TH%10+48;
hum[0]=HH/10+48;hum[1]=HH%10+48;
}
else
{
temp[0]=0;temp[1]=0;
hum[0]=0;hum[1]=0;
}
}
main.c
/**************************************/
/* WeBee團隊 */
/* Zigbee學習例程 */
/*例程名稱:溫濕度傳感器DHT11 */
/*建立時間:2012/10/2 */
/*描述:將采集到的溫濕度信息通過串口打印到
串口調試助手。
**************************************/
#include <ioCC2530.h>
#include <string.h>
#include "UART.H"
#include "DHT.h"
extern uchar hum[2];
extern uchar temp[2];
uchar temp1[5]="temp=";
uchar humidity1[9]="humidity=";
/***************************
主函數
***************************/
void main(void)
{
// Delay_ms(1000);//讓設備穩定
InitUart(); //串口初始化
while(1)
{
Temp();
/*******信息通過串口打印********/
Uart_Send_String(temp1,5);
Uart_Send_String(temp,2);
Uart_Send_String("\n",1);
Uart_Send_String(humidity1,9);
Uart_Send_String(hum,2);
Uart_Send_String("\n",1);
Delay_ms(2000); //延時,使周期性2S讀取1次
}
}
UART.C
#include <ioCC2530.h>
#define uchar unsigned char
#define uint unsigned int
void InitUart(); //初始化串口
void Uart_Send_String(unsigned char *Data,int len);
/****************************************************************
串口初始化函數
***********************************************************/
void InitUart()
{
CLKCONCMD &= ~0x40; // 設置系統時鐘源為 32MHZ晶振
while(CLKCONSTA & 0x40); // 等待晶振穩定
CLKCONCMD &= ~0x47; // 設置系統主時鐘頻率為 32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口,第二功能
P2DIR &= ~0XC0; //P0 優先作為UART0 ,優先級
U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR與U0BAUD配合
U0BAUD |= 216; // 波特率設為115200
UTX0IF = 0; //UART0 TX 中斷標志初始置位0
}
/****************************************************************
串口發送字符串函數
****************************************************************/
void Uart_Send_String(uchar *Data,int len)
{
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
}
|