网上找到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;
}
}
}
|