注册会员
- 积分
- 60
- 威望
- 34
- 贡献
- 20
- 兑换币
- 21
- 注册时间
- 2018-1-26
- 在线时间
- 3 小时
|
用51的程序改半天,没改出来。
#include "include.h"
//毫秒级延时
void time_delay_ms(u32 ms)
{
u16 i;
while(ms--)
{
for(i=0;i<1200;i++);
}
}
//微秒级延时
void time_delay_us(u32 us)
{
while(us--)
{
}
}
//全局变量
u8 U8FLAG;
float ftemp2;
u8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;//----温度高8位== U8T_data_H
u8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;//----湿度高8位== U8RH_data_H
u8 U8comdata;//----校验 8位 == U8checkdata
/***FUNC+*********************************************************************/
/* Name : com */
/* Descrp : 判断时序是否超时程序 */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void COM(void)
{
u8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!GPIO_Get(PTC6))&&U8FLAG++);
time_delay_us(10);
time_delay_us(10);
time_delay_us(10);
U8temp=0;
if(GPIO_Get(PTC6))
{
U8temp=1;
U8FLAG=2;
while((GPIO_Get(PTC6))&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
/***FUNC+*********************************************************************/
/* Name : RH */
/* Descrp : 湿度读取程序 */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
float RH(void)
{ int a;
//主机拉低18ms
/*设置PTC6输出为DQ高电平,板子P13_2 */
//P2_0=0;
GPIO_Ctrl(PORTC,6,0);
time_delay_ms(2000);
//P2_0=1;
GPIO_Ctrl(PORTC,6,1);
//总线由上拉电阻拉高 主机延时20us
//Delay_10us();
//Delay_10us();
//Delay_10us();
//Delay_10us();
time_delay_us(20);
//主机设为输入 判断从机响应信号
//P2_0=1;
GPIO_Ctrl(PORTC,6,1);
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
a=GPIO_Get(PTC6);
//time_delay_ms(1000);
if(a==0) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!a)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((a)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi
ftemp2= U8temp;
return ftemp2;
}
//主函数
void main(void)
{
u8 i,j;
PLL_Init(PLL96); //初始化PLL为96M
float ftemp2; //温湿度
UART_Init (UART1,115200);
char data[100];
while(1)
{
//调用温湿度读取子程序
ftemp2=RH();
sprintf(data,"您发送的数据是:%f\n",ftemp2);//打印数据
UART_Put_Str (UART1, data); //方法2,更方便
time_delay_ms(2000);
}
} |
|