AM2305的测试程序Word文档下载推荐.docx
《AM2305的测试程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《AM2305的测试程序Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
//收到起始标志位
unsignedcharSensor_ErrorFlag;
//读取传感器错误标志
unsignedintSys_CNT;
unsignedintTmp;
unsignedchar*String;
//字符串定义
#defineS_Temp"
Temp:
"
#defineS_RH"
RH:
#defineS_CRCT"
Check:
True"
#defineS_CRCF"
Wrong"
#defineS_Data"
Data:
"
#defineS_NotS"
SensorNotConnected"
/********************************************\
|*功能:
延时晶振为12M时*|
|*t=1为20us然后成倍增加10us左右*|
\********************************************/
voidDelay_N10us(unsignedchart)
{
while(t--)
{
_nop_();
}
}
延时晶振为12M时*|
|*延时大约1ms*|
\********************************************/
voidDelay_N1ms(unsignedintt)
unsignedinti;
unsignedintj;
for(j=t;
j>
0;
j--)
for(i=124;
i>
i--);
//延时大约1ms
初始化串口*|
voidInitUART(void)
unsignedintiTmpBaud;
unsignedlonglTmpBaud;
iTmpBaud=0;
//首先选定定时器2作为波特率发生器,16位定时器,自动装载
SCON=0x50;
//SM0SM1SM2RENTB8RB8TIRI//01010000
PCON=0x00;
//PCON的地址是87H,这里SMOD=0
T2CON=0x30;
//TF2EXF2RCLKTCLKEXEN2TR2C(/T2)CP(/RL2)//00110000
T2MOD=0x00;
////////T2OEDCEN//00000000
lTmpBaud=FOSC/BAUD;
lTmpBaud/=32;
//12T-mode
iTmpBaud=lTmpBaud&
0xFFFF;
iTmpBaud=65536-iTmpBaud;
RCAP2H=(iTmpBaud>
>
8)&
0x0FF;
RCAP2L=iTmpBaud&
RI=0;
//清除接收中断标志
REN=1;
//允许串行接收
ES=1;
//允许串行中断
TR2=1;
//启动定时器1
EA=1;
//开总中断
}
串口发送函数*|
voidUARTSend(charUCHAR)
SBUF=UCHAR;
while(TI==0);
TI=0;
串口中断函数*|
voidUARTRead(void)interrupt4
chartemp;
if(RI)
RI=0;
temp=SBUF;
/********************************************\
串口发送子函数*|
voidUART_PutString(unsignedchar*buf)
while(*buf)
UARTSend(*buf++);
voidUART_PutStringAndNum(unsignedchar*buf,unsignedintnum)
unsignedchara[3],i;
a[3]='
0'
+num%10;
a[2]='
.'
;
a[1]='
+num/10%10;
a[0]='
+num/100%10;
UARTSend('
'
);
for(i=0;
i<
4;
i++)
UARTSend(a[i]);
voidUART_PutStringAnd_Data(unsignedchar*buf,unsignedchar*bufdata)
unsignedchara[2],i,j;
5;
a[0]=bufdata[i]/16;
a[1]=bufdata[i]%16;
for(j=0;
j<
2;
j++)
{
if(a[j]>
9)
a[j]=(a[j]-10)+'
A'
}
else
a[j]=a[j]+'
UARTSend(a[j]);
UARTSend('
串口发送传感器数据函数*|
voidUARTSend_Nbyte(void)
if(Sensor_AnswerFlag==1)
Sensor_Check=Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
//校验成功
if(Sensor_Check==Sensor_Data[4])
String=S_RH;
//"
Tmp=Sensor_Data[0]*256+Sensor_Data[1];
UART_PutStringAndNum(String,Tmp);
UARTSend('
String=S_Temp;
//"
Tmp=Sensor_Data[2]*256+Sensor_Data[3];
String=S_CRCT;
UART_PutString(String);
}else//校验失败送上读到数据
String=S_Data;
UART_PutStringAnd_Data(String,Sensor_Data);
String=S_CRCF;
}//传感器未连接
String=S_NotS;
//"
UART_PutString(String);
}
UARTSend(0x0A);
voidClear_Data(void)
inti;
Sensor_Data[i]=0x00;
}//接收数据清零
读传感器发送的单个字节*|
unsignedcharRead_SensorData(void)
unsignedchari,cnt;
unsignedcharbuffer,tmp;
buffer=0;
8;
cnt=0;
while(!
Sensor_SDA)//检测上次低电平是否结束
if(++cnt>
=300)
break;
//延时Min=26usMax50us跳过数据"
0"
的高电平
Delay_N10us
(2);
//延时30us
//判断传感器发送数据位
tmp=0;
if(Sensor_SDA)
tmp=1;
cnt=0;
while(Sensor_SDA)//等待高电平结束
if(++cnt>
=200)
{
}
buffer<
<
=1;
buffer|=tmp;
returnbuffer;
读传感器*|
unsignedcharRead_Sensor(void)
unsignedchari;
//主机拉低(Min=800USMax=20Ms)
Sensor_SDA=0;
Delay_N1ms
(2);
//延时2Ms
//释放总线延时(Min=30usMax=50us)
Sensor_SDA=1;
Delay_N10us
(1);
//延时30us
//主机设为输入判断传感器响应信号
Sensor_AnswerFlag=0;
//传感器响应标志
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(Sensor_SDA==0)
Sensor_AnswerFlag=1;
//收到起始信号
Sys_CNT=0;
//判断从机是否发出80us的低电平响应信号是否结束
while((!
Sensor_SDA))
if(++Sys_CNT>
300)//防止进入死循环
Sensor_ErrorFlag=1;
return0;
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
while((Sensor_SDA))
}
//数据接收传感器共发送40位数据
//即5个字节高位先送5个字节分别为湿度高位湿度低位温度高位温度低位校验和
//校验和为:
湿度高位+湿度低位+温度高位+温度低位
Sensor_Data[i]=Read_SensorData();
else
//未收到传感器响应
return1;
voidmain(void)
Sensor_SCL=0;
InitUART();
//初始串口发送函数
while
(1)
Clear_Data();
//清除收到数据
Read_Sensor();
//读取传感器数据
UARTSend_Nbyte();
//串口发送读到传感器数据
Delay_N1ms(2000);
//延时2S(两次读取间隔至少2S)