专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
DSP如何采集DHT11的信号-------急需,谢谢!
2019-03-26 15:21
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
DSP
11201
12
955
本帖最后由 qingtenglei 于 2015-9-7 15:53 编辑
各位大神好!最近 小妹正在调试DHT11的温湿度显示,从DHT11的输出管脚可以看到有波形,但是DSP2812这边不知 如何处理并显示 出来。单步执行时发现根本进不了循环,直接跳过了。 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
qiushenghua
2019-03-27 03:54
本帖最后由 qiushenghua 于 2015-9-7 16:40 编辑
楼主的问题:
1、在主程序中的do while语句无法进入运行。改为if语句可以进入但是采集的不对
2、个人觉得在数据传输这块有点问题,但是师兄说是时序配置问题。因为此模块要时序启动。
3、DSP2812是150M,拷的程序30M的,假如延时30ms。
4、请问数据缓存这块程序有没有
液晶显示相关函数
#include"DSP281x_Device.h"
#include "DSP281x_Examples.h"
typedef enum
{
ERR = 0,
OK
}RESULT;
typedef struct
{
Uint16 HumiH:8;
Uint16 HumiL:8;
Uint16 TempH:8;
Uint16 TempL:8;
RESULT flag;
}Obj_Sensor;
#define UNDEF 0xFF
#define DATA GpioDataRegs.GPDDAT.bit.GPIOD0
#define Data_O GpioMuxRegs.GPDDIR.bit.GPIOD0 = 1;
#define Data_I GpioMuxRegs.GPDDIR.bit.GPIOD0 = 0;
#define EN GpioDataRegs.GPFDAT.bit.GPIOF2
#define RW GpioDataRegs.GPFDAT.bit.GPIOF1
#define RS GpioDataRegs.GPFDAT.bit.GPIOF0
#define RST GpioDataRegs.GPFDAT.bit.GPIOF3
#define uchar unsigned char
#define unit unsigned int
Uint16 Temp[]={0,0,0,0,0};
void delay(Uint16 t);
void LCD_DATA(unit d)//将数据赋值给DSP的响应控制管脚
{
GpioDataRegs.GPBDAT.all=d;
}
void Write_order(Uint16 order)
{
RS=0;delay(1);
RW=0;delay(1);
EN=1;delay(1);
LCD_DATA(order);
delay(10);
EN=0;delay(1);
}
void Write_data(Uint16 data)
{
RS=1;delay(1);
RW=0;delay(1);
EN=1;delay(1);
LCD_DATA(data);
delay(10);
EN=0;delay(1);
}
void LCDInit(void)
{
delay(500);
Write_order(0x30);// 功能设定:基本指令动作
delay(5);
Write_order(0x0c);//显示状态:开
delay(5);
Write_order(0x01);//清屏
delay(6);
Write_order(0x02);//地址归位:AC=0x00
delay(4);
}
void Gpio_Set(void)
{
EALLOW;
GpioMuxRegs.GPBMUX.all=0X000;
GpioMuxRegs.GPBDIR.all =0xffff;
GpioMuxRegs.GPADIR.all =0xffff;
GpioMuxRegs.GPFMUX.all=0X000;
GpioMuxRegs.GPFDIR.bit.GPIOF0 = 1;
GpioMuxRegs.GPFDIR.bit.GPIOF1 = 1;
GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;
EDIS;
}
void display(char *hz)
{
while(*hz!=' ')
{
Write_data(*hz);
hz++;
delay(2);
}
}
//函数功能:显示十进制数据(最大9999 9999 9)
//输入参数: v:要显示的十进制数据
// add: 显示起始地址
// Len:十进制数据长度(最长9位)
//输出参数:无
void DisDec(Uint32 v, Uint16 add, unsigned char Len)
{
Uint32 GUI_Pow10[] =
{
10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000, 1000000000
};
char c[10], g;
unsigned char s=0;
if (Len > 9)
{
Len = 9;
}
if(v == 0) Len = 1;
while(Len--)
{
//d = GUI_Pow10[Len];
g = (char) (v / GUI_Pow10[Len]);
v -= g * GUI_Pow10[Len];
c[s++] = g + '0';//数字加’0’可以转化为字符
}
c[s] = ' ';
g=0;
while(g<s-1)
{
if(c[g]=='0') c[g]=' ';
else break;
g++;
}
if(add != UNDEF) Write_order(add);
delay(5);
display(c);
GpioDataRegs.GPADAT.bit.GPIOA6=0;
DELAY_US(50000);
}
复制代码
数据采集部分:
void Read_Temp(Uint16 *pot)
{
Uint16 a=0,b,x;
Uint16 Time_out=0;
for(;a<5;a++)
{ //0
for(b=0;b<8;b++)
{ //1
while(!DATA); //等待拉高
DELAY_US(30); //waiting 30us
x = 0;
if(DATA) x = 1;
Time_out = 2;
while(DATA && Time_out++); //数据变为0或者超时可以结束该while
if(Time_out == 1) break; //已经超时 跳出循环
(*pot) <<= 1;
if(x) (*pot)++;
} //1
pot++;
GpioDataRegs.GPADAT.bit.GPIOA5=0;
DELAY_US(50000);
} //0
}
Obj_Sensor GET_Dev(void)
{
Obj_Sensor Obj_x;
Uint16 u=0, sum=0;
Data_O; //配置为输出
DATA = 0;
DELAY_US(20000); //拉低延时20ms
DATA = 1;
DELAY_US(40); //拉高延时40us
Data_I; //配置为输入
Obj_x.flag = ERR;
if(DATA == 0)
{ //DHT11发送响应拉低80us
while(!DATA); //等待拉高
while(DATA); //等待拉低
Read_Temp(Temp);
for(;u<4;u++)
sum += Temp[u];
Obj_x.HumiH = Temp[0];
Obj_x.HumiL = Temp[1];
Obj_x.TempH = Temp[2];
Obj_x.TempL = Temp[3];
if(sum != Temp[4]) //校验和
Obj_x.flag = ERR;
else
Obj_x.flag = OK;
}
GpioDataRegs.GPADAT.bit.GPIOA4=0;
DELAY_US(50000);
return Obj_x;
}
复制代码
主函数:
void main(void)
{
Obj_Sensor o;
InitSysCtrl();
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
Gpio_Set();
RS=0;
delay(5);
RW=0;
delay(5);
EN=0;
LCDInit();
delay(5);
Write_order(0x01);
delay(50);
Write_order(0x80);
delay(5);
display("*******");
Write_order(0x90);
delay(5);
display("*******");
Write_order(0x88);
delay(5);
display("湿度 %RH");
Write_order(0x98);
delay(5);
display("温度 ℃");
while(1)
{
/* do{
o = GET_Dev();
DELAY_US(1000000);
}
while( o.flag != OK);
*/
if(o.flag != OK)
{
o = GET_Dev();
DELAY_US(1000000);
}
Write_order(0x8A);
delay(5);
display(":");
DisDec(o.HumiH, UNDEF, 2);
display(".");
DisDec(o.HumiL, UNDEF, 1);
Write_order(0x9A);
delay(5);
display(":");
DisDec(o.TempH, UNDEF, 2);
display(".");
DisDec(o.TempL, UNDEF, 1);
GpioDataRegs.GPADAT.bit.GPIOA7=0;
DELAY_US(50000);
GpioDataRegs.GPADAT.bit.GPIOA7=1;
DELAY_US(50000);
}
}
复制代码
加载中...
查看其它12个回答
一周热门
更多
>
相关问题
相关文章
事件管理器――PWM
0个评论
FPGA时序分析基础(二):vivado中常用的时序约束命令
0个评论
LDO和BUCK降压稳压器对比
0个评论
伺服控制系统教学实验平台
0个评论
asoc之动态PCM
0个评论
ADS7928
0个评论
基于AD9957实现射频数字化变频模块和AD转换模块的方案详细教程
0个评论
多功能车载DVD智能导航平台
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
楼主的问题:
1、在主程序中的do while语句无法进入运行。改为if语句可以进入但是采集的不对
2、个人觉得在数据传输这块有点问题,但是师兄说是时序配置问题。因为此模块要时序启动。
3、DSP2812是150M,拷的程序30M的,假如延时30ms。
4、请问数据缓存这块程序有没有
液晶显示相关函数
- #include"DSP281x_Device.h"
- #include "DSP281x_Examples.h"
- typedef enum
- {
- ERR = 0,
- OK
- }RESULT;
- typedef struct
- {
- Uint16 HumiH:8;
- Uint16 HumiL:8;
- Uint16 TempH:8;
- Uint16 TempL:8;
- RESULT flag;
- }Obj_Sensor;
- #define UNDEF 0xFF
- #define DATA GpioDataRegs.GPDDAT.bit.GPIOD0
- #define Data_O GpioMuxRegs.GPDDIR.bit.GPIOD0 = 1;
- #define Data_I GpioMuxRegs.GPDDIR.bit.GPIOD0 = 0;
- #define EN GpioDataRegs.GPFDAT.bit.GPIOF2
- #define RW GpioDataRegs.GPFDAT.bit.GPIOF1
- #define RS GpioDataRegs.GPFDAT.bit.GPIOF0
- #define RST GpioDataRegs.GPFDAT.bit.GPIOF3
- #define uchar unsigned char
- #define unit unsigned int
- Uint16 Temp[]={0,0,0,0,0};
- void delay(Uint16 t);
- void LCD_DATA(unit d)//将数据赋值给DSP的响应控制管脚
- {
- GpioDataRegs.GPBDAT.all=d;
- }
- void Write_order(Uint16 order)
- {
- RS=0;delay(1);
- RW=0;delay(1);
- EN=1;delay(1);
- LCD_DATA(order);
- delay(10);
- EN=0;delay(1);
- }
- void Write_data(Uint16 data)
- {
- RS=1;delay(1);
- RW=0;delay(1);
- EN=1;delay(1);
- LCD_DATA(data);
- delay(10);
- EN=0;delay(1);
- }
- void LCDInit(void)
- {
- delay(500);
- Write_order(0x30);// 功能设定:基本指令动作
- delay(5);
- Write_order(0x0c);//显示状态:开
- delay(5);
- Write_order(0x01);//清屏
- delay(6);
- Write_order(0x02);//地址归位:AC=0x00
- delay(4);
- }
- void Gpio_Set(void)
- {
- EALLOW;
- GpioMuxRegs.GPBMUX.all=0X000;
- GpioMuxRegs.GPBDIR.all =0xffff;
- GpioMuxRegs.GPADIR.all =0xffff;
- GpioMuxRegs.GPFMUX.all=0X000;
- GpioMuxRegs.GPFDIR.bit.GPIOF0 = 1;
- GpioMuxRegs.GPFDIR.bit.GPIOF1 = 1;
- GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;
- EDIS;
- }
- void display(char *hz)
- {
- while(*hz!=' ')
- {
- Write_data(*hz);
- hz++;
- delay(2);
- }
- }
- //函数功能:显示十进制数据(最大9999 9999 9)
- //输入参数: v:要显示的十进制数据
- // add: 显示起始地址
- // Len:十进制数据长度(最长9位)
- //输出参数:无
- void DisDec(Uint32 v, Uint16 add, unsigned char Len)
- {
- Uint32 GUI_Pow10[] =
- {
- 10, 100, 1000, 10000,
- 100000, 1000000, 10000000, 100000000, 1000000000
- };
- char c[10], g;
- unsigned char s=0;
- if (Len > 9)
- {
- Len = 9;
- }
- if(v == 0) Len = 1;
- while(Len--)
- {
- //d = GUI_Pow10[Len];
- g = (char) (v / GUI_Pow10[Len]);
- v -= g * GUI_Pow10[Len];
- c[s++] = g + '0';//数字加’0’可以转化为字符
- }
- c[s] = ' ';
- g=0;
- while(g<s-1)
- {
- if(c[g]=='0') c[g]=' ';
- else break;
- g++;
- }
- if(add != UNDEF) Write_order(add);
- delay(5);
- display(c);
- GpioDataRegs.GPADAT.bit.GPIOA6=0;
- DELAY_US(50000);
- }
复制代码数据采集部分:
- void Read_Temp(Uint16 *pot)
- {
- Uint16 a=0,b,x;
- Uint16 Time_out=0;
- for(;a<5;a++)
- { //0
- for(b=0;b<8;b++)
- { //1
- while(!DATA); //等待拉高
- DELAY_US(30); //waiting 30us
- x = 0;
- if(DATA) x = 1;
- Time_out = 2;
- while(DATA && Time_out++); //数据变为0或者超时可以结束该while
- if(Time_out == 1) break; //已经超时 跳出循环
- (*pot) <<= 1;
- if(x) (*pot)++;
- } //1
- pot++;
- GpioDataRegs.GPADAT.bit.GPIOA5=0;
- DELAY_US(50000);
- } //0
- }
- Obj_Sensor GET_Dev(void)
- {
- Obj_Sensor Obj_x;
- Uint16 u=0, sum=0;
- Data_O; //配置为输出
- DATA = 0;
- DELAY_US(20000); //拉低延时20ms
- DATA = 1;
- DELAY_US(40); //拉高延时40us
- Data_I; //配置为输入
- Obj_x.flag = ERR;
- if(DATA == 0)
- { //DHT11发送响应拉低80us
- while(!DATA); //等待拉高
- while(DATA); //等待拉低
- Read_Temp(Temp);
- for(;u<4;u++)
- sum += Temp[u];
- Obj_x.HumiH = Temp[0];
- Obj_x.HumiL = Temp[1];
- Obj_x.TempH = Temp[2];
- Obj_x.TempL = Temp[3];
- if(sum != Temp[4]) //校验和
- Obj_x.flag = ERR;
- else
- Obj_x.flag = OK;
- }
- GpioDataRegs.GPADAT.bit.GPIOA4=0;
- DELAY_US(50000);
- return Obj_x;
- }
复制代码主函数:
- void main(void)
- {
- Obj_Sensor o;
- InitSysCtrl();
- DINT;
- InitPieCtrl();
- IER=0x0000;
- IFR=0x0000;
- Gpio_Set();
- RS=0;
- delay(5);
- RW=0;
- delay(5);
- EN=0;
- LCDInit();
- delay(5);
- Write_order(0x01);
- delay(50);
- Write_order(0x80);
- delay(5);
- display("*******");
- Write_order(0x90);
- delay(5);
- display("*******");
- Write_order(0x88);
- delay(5);
- display("湿度 %RH");
- Write_order(0x98);
- delay(5);
- display("温度 ℃");
- while(1)
- {
- /* do{
- o = GET_Dev();
- DELAY_US(1000000);
- }
- while( o.flag != OK);
- */
- if(o.flag != OK)
- {
- o = GET_Dev();
- DELAY_US(1000000);
- }
- Write_order(0x8A);
- delay(5);
- display(":");
- DisDec(o.HumiH, UNDEF, 2);
- display(".");
- DisDec(o.HumiL, UNDEF, 1);
- Write_order(0x9A);
- delay(5);
- display(":");
- DisDec(o.TempH, UNDEF, 2);
- display(".");
- DisDec(o.TempL, UNDEF, 1);
- GpioDataRegs.GPADAT.bit.GPIOA7=0;
- DELAY_US(50000);
- GpioDataRegs.GPADAT.bit.GPIOA7=1;
- DELAY_US(50000);
- }
- }
复制代码一周热门 更多>