|
楼主 |
发表于 2015-4-3 16:22:35
|
显示全部楼层
piaozhiling 发表于 2015-4-1 13:47
亲,给一个注释哈,你这个具体是什么东西,能干什么,然后最好再给一个例子就完美了,我们玩这个Arduino的人 ...
u8 wendu,shidu;
#define DLT21 PTP_PTP5 //数据引脚
#define DLT21DDR DDRP_DDRP5 //数据方向控制 1输出 0输入
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
u8 T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
u8 T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;//校验使用
u8 jiaoyan;
void initdlt21(void)
{
DLT21DDR=1;//初始化为引脚输出
DLT21=0;//低电平
}
void delay1us(void)//1us延时 自己改造下移植一下
{
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);_asm(nop);_asm(nop);
_asm(nop);_asm(nop);
}
void delay30us(void)
{
int time=25;
while(time--)delay1us();
}
u8 readbytedlt21(void)
{
u8 i,num=0,data;
for(i=0;i<8;i++)
{
while(DLT21==0); //越过刚开始的低电平
delay30us();//延时30ms 判断高低电平 就知道输入数据为高低电平
if(DLT21==1) //出现高电平的时候
{
data=data<<1;//左移一位
data=data+1;//加1 相当于读到高电平
while(DLT21==1);//越过高电平持续时间
}
else data=data<<1; //左移一位 相当于读到低电平
}
return data;//返回
}
u8 readdlt21(void)
{
u8 num=0,temp=0;
DLT21=0;
delayms(18);
DLT21=1;//发送一个18毫秒的上升沿,开启传感器发送数据
//
DLT21DDR=0;//数据方向改为输入
delay1us();//等待输入稳定
while(DLT21==1)
{
delay1us ();
num++;
if(num>100)//检测高电平持续时间 如果超过100us 则读取出错
goto loop;
}
while(DLT21==0); //如果没超过100us 越过低电平
while(DLT21==1);//越过高电平
RH_data_H_temp=readbytedlt21();
RH_data_L_temp=readbytedlt21();
T_data_H_temp=readbytedlt21();
T_data_L_temp=readbytedlt21();
checkdata_temp=readbytedlt21(); //读数
jiaoyan=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);//校验
if(jiaoyan==checkdata_temp)
{
RH_data_H=RH_data_H_temp;
RH_data_L=RH_data_L_temp;
T_data_H=T_data_H_temp;
T_data_L=T_data_L_temp;
checkdata=checkdata_temp;
}
DLT21DDR=1;//输出模式
wendu=T_data_H;
shidu=RH_data_H;
loop: return 0;
}
|
|