硬件接线
DT-06 vcc接3.3v gnd接地 RXD接P2^3模拟串口的txd 三根线
AHT10 vin接3.3v gnd接地 SCL接P2^0模拟IIC的SCL口 SDA接 P2^1模拟IIC的SDA口
单片机使用STC90C52单片机
网站
局域网建立一个页面 my_home_status.php 用于显示和接收WiFi模块发送过来的数据
注意:接收过来的数据需要做处理,否则如果char字符组合成某个中文或者特殊字符的话会出现404错误
请求
首先单片机设置每10秒通过IIC协议采集一次AHT10温度传感器的数据
先将采集到的6个字节的数据做特殊处理,这里采用高低4字节加60作为12个字符发送,到达请求页面在依次处理。然后把这12个字符通过GET请求发送过去
串口发送给WiFi模块的内容格式为 "GET my_home_status.php?xxx=yyy"
再在这个页面中将接收到的内容结果处理之后保存到数据库中
完整代码如下:
#include <reg52.h>
sbit RXD2 = P2^2;
sbit TXD2 = P2^3;
sbit TXD1 = P3^1;
//iic
sbit DT06_SDA = P2^0;
sbit DT06_SCL = P2^1;
//GET /my_home_status.php?action=putdata&name=wendu&value=114
unsigned char buffer[56] = "GET /my_home_status.php?action=putdata&name=wendu&value="; //接收缓存
int getbuffernum,putbuffernum,num;
void delay1(void);
void Delay10ms(unsigned int c);
void putdata(unsigned char str);
void putdata2(unsigned char str);
//
unsigned char IIC_send(unsigned char data1);
void IIC_end_ack();
unsigned char IIC_read();
void IIC_stop();
void IIC_start();
void Delay(unsigned int a);
void main(){
unsigned char i;
long data1;
unsigned char datas[6];
unsigned char data2[6];
float temp;//临时变量
//初始化aht10
IIC_start();
IIC_send(0x70);
IIC_send(0xba);
IIC_stop();
Delay(3000);
while(1){
//初始化aht10 不知道为什么测量的温度不会变化
IIC_start();
IIC_send(0x70);
IIC_send(0xba);
IIC_stop();
Delay(3000);
//请求测量
IIC_start();
IIC_send(0x70); //0x38
IIC_send(0xac);
IIC_send(0x33);
IIC_send(0x00);
IIC_stop();
Delay(5000); //延时82ms
//获取数据
IIC_start();
Delay(1);
IIC_send(0x71);
datas[0] = IIC_read();
IIC_end_ack();
datas[1] = IIC_read();
IIC_end_ack();
datas[2] = IIC_read();
IIC_end_ack();
datas[3] = IIC_read();
IIC_end_ack();
datas[4] = IIC_read();
IIC_end_ack();
datas[5] = IIC_read();
IIC_end_ack();
IIC_stop();
data1 = (datas[3] & 0xf) * 65536 + datas[4] * 256 + datas[5];
temp = data1 / 1048576 * 200 - 50;
data1 = temp * 1;
data2[0] = datas[3];//(data1 / 10) + 48;
data2[1] = datas[4];//(data1 % 10) + 48;
for(i=0;i<56;i++){
putdata(buffer[i]);
}
putdata((datas[0]>>4) + 'A');
putdata((datas[0]&0xf) + 'A');
putdata((datas[1]>>4) + 'A');
putdata((datas[1]&0xf) + 'A');
putdata((datas[2]>>4) + 'A');
putdata((datas[2]&0xf) + 'A');
putdata((datas[3]>>4) + 'A');
putdata((datas[3]&0xf) + 'A');
putdata((datas[4]>>4) + 'A');
putdata((datas[4]&0xf) + 'A');
putdata((datas[5]>>4) + 'A');
putdata((datas[5]&0xf) + 'A');
putdata2(datas[0]);
putdata2(datas[1]);
putdata2(datas[2]);
putdata2(datas[3]);
putdata2(datas[4]);
putdata2(datas[5]);
putdata(0x0d); //DT-06 WIFI模块需要发送回车和换行
putdata(0x0a);
Delay10ms(1000);//10秒
}
}
void putdata(unsigned char str){
TXD2 = 0;
delay1();
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
str >>= 1;
TXD2 = str & 0x1;
delay1();
TXD2 = 1;
delay1();
}
void putdata2(unsigned char str){
TXD1 = 0;
delay1();
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
str >>= 1;
TXD1 = str & 0x1;
delay1();
TXD1 = 1;
delay1();
}
//104us 9600波特率是通过计算得出来的 num为7 表示 104us 误差 0.05us
void delay1(){
//i=134 2400 (415us)通过 i=67 4800 (208us)通过 i=32 9600 (104us)通过发送
unsigned char i;
for(i=0;i<134;i++){}
}
////误差 0us
void Delay10ms(unsigned int c){
unsigned char a,b;
for(;c>0;c--){
for(b=38;b>0;b--){
for(a=130;a>0;a--){
}
}
}
}
void usart0() interrupt 4{
if(RI){
RI = 0;
}
if(TI){
}
}
//IIC
//IIC起始信号
void IIC_start(){
DT06_SCL = 0;
Delay(1); //6.33us左右,必须大于4.7us
DT06_SDA = 1;
Delay(1);
DT06_SCL = 1;
Delay(1);
DT06_SDA = 0;
Delay(1);
DT06_SCL = 0;
}
//IIC停止信号
void IIC_stop(){
DT06_SCL = 0;
Delay(1);
DT06_SDA = 0;
Delay(1);
DT06_SCL = 1; //接收时将SCL拉高表示总线空闲
Delay(1);
DT06_SDA = 1;
}
//IIC读取数据
unsigned char IIC_read(){
unsigned char i,data1;
DT06_SDA = 1; //这里设置为1应该是为了保险起见,因为一方发送完之后 SDA 和 SCL 都是高电平的
for(i=0; i<8; i++){
Delay(1);
DT06_SCL = 1;
Delay(1);
data1 <<= 1; //低位先接收
data1 |= DT06_SDA; //低位或运算获取数据
Delay(1);
DT06_SCL = 0; //拉低等待对方设置数据吗?
Delay(1);
}
return data1;
}
//IIC确认ACK
void IIC_end_ack(){
DT06_SCL = 0;
Delay(1);
DT06_SDA = 0;
Delay(1);
DT06_SCL = 1;
Delay(1);
DT06_SCL = 0;
Delay(1);
}
//IIC发送信号
unsigned char IIC_send(unsigned char data1){
unsigned char i,num;
DT06_SCL = 0;
Delay(1);
for(i=0; i<8; i++){
//因为SCL现在时低电平,所以可以设置SDA 高位先发
DT06_SDA = data1 >> 7; //第一位 12345678 >> 7 = 00000001 ←----┒
data1 = data1 << 1; // 12345678 << 1 = 23456780 ---------┘
Delay(1);
DT06_SCL = 1;
Delay(1);
DT06_SCL = 0; //拉高再拉低
}
DT06_SDA = 1;
Delay(1);
DT06_SCL = 1; //发送完一个字节,等待从机响应 ACK
num = 0;
while(DT06_SDA){
num++;
Delay(2);
if(num > 200){//防止从机不响应死循环 1.几毫秒左右
DT06_SCL = 0;
return 2;
}
}
DT06_SCL = 0; //从机响应
Delay(1);
return 1;
}
//IIC延时函数
void Delay(unsigned int a){ //6.33us
unsigned char b;
for(;a>0;a--)
{
for(b=3;b>0;b--);
}
}