99|0

1125

帖子

0

资源

纯净的硅(中级)

MSP430F5438+DTH11示例代码 [复制链接]

1 unsigned char dth_read(unsigned char array[])//默认16Mhz主频,获取成功返回1,失败返回0,
 2 /*array为5字节数组,带回数据格式为: 一字节湿度(整数),一字节湿度(小数,此芯片无效,但占据8位),一字节温度(整数),一字节温度(小数,无效,占位),一字节和校验 */
 3 {
 4 int index = 40;
 5 unsigned char temp[40] = {0}; //获取40位元数据零时数组
 6 P6DIR |= 0x010; // P6.4 output,dth11元器件的data数据线接到P6.4口
 7 P6OUT &= 0XEF ; //主机拉低data线,之后须保持18ms时间。
 8 __delay_cycles(320000); //至少保持18ms
 9 P6OUT |=0X10; //手动拉高
10 P6DIR &=0XEF; //IO口切换成输入模式 
11 while(P6IN&0x10); //至少保持20-40us
12 if(!(P6IN&0x10)) //电平被拉低,dth响应
13 {
14 while(!(P6IN&0x10)); //等待电平拉高
15 while(P6IN&0x10); //等待电平再次拉低,从次开始数据读取
16 
17 while(index>0) //读取40位bit数据
18 {
19 while(P6IN&0x10); //此处当在传送位是1时高电平会保持70us,所以此处是消除读取高电平后剩余的高电平保持时间
20 while(!(P6IN&0x10)); //低电平保持50us,无论传送0或1,都首先保持50us低电平
21 
22 __delay_cycles(500); //保持30us,之后读取data线,若是低电平,则总线已经启动下个bit位的传送,说明当前传送位是0,否则为1
23 
24 if(P6IN & 0X10) //保存数据1
25 {
26 temp[40-index] = 1;
27 
28 }
29 else //保存数据0
30 {
31 temp[40-index] = 0;
32 }
33 index--; //计数器减一
34 }
35 }
36 for(int z = 0 ; z < 5 ;z ++) //将40位数据转换成5个字节
37 {
38 for(int h = 0 ; h < 8 ;h++)
39 {
40 array[z]<<=1;
41 array[z] += temp[z*8+h];
42 
43 }
44 }
45 if(array[0]+array[2] == array[4]) //校验和
46 return 1; //通过,数据读取有效,且正确
47 else
48 return 0; //未通过。失败
49 }


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表