代码分为两块,一块是读取18B20的,一块是mian主函数
#include <reg52.h>
#include <intrins.h>
sbit IO_18B20 = P3^2; //DS18B20通信引脚
/* 软件延时函数,延时时间(t*10)us */
void DelayX10us(unsigned char t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
bit Get18B20Ack()
{
bit ack;
EA = 0;
IO_18B20 = 0;
DelayX10us(50);
IO_18B20 = 1;
DelayX10us(6);
ack = IO_18B20;
while(!IO_18B20);
EA = 1;
return ack;
}
void Write18B20(unsigned char dat)
{
unsigned char mask;
EA = 0;
for(mask=0x01; mask!= 0; mask<<=1)
{
IO_18B20 = 0;
_nop_();
_nop_();
if((mask&dat) == 0)
IO_18B20 = 0;
else
IO_18B20 = 1;
DelayX10us(6);
IO_18B20 = 1;
}
EA = 1;
}
unsigned char Read18B20()
{
unsigned char dat;
unsigned char mask;
EA = 0;
for(mask=0x01; mask!=0; mask<<=1)
{
IO_18B20 = 0;
_nop_();
_nop_();
IO_18B20 = 1;
_nop_();
_nop_();
if(!IO_18B20)
dat &= ~mask;
else
dat |= mask;
DelayX10us(6);
}
EA = 1;
return dat;
}
bit Start18B20()
{
bit ack;
ack = Get18B20Ack();
if(ack == 0)
{
Write18B20(0xCC);
Write18B20(0x44);
}
return ~ack;
}
bit Get18B20Temp(int *temp)
{
bit ack;
unsigned char LSB, MSB;
Start18B20();
ack = Get18B20Ack();
if(ack == 0)
{
Write18B20(0xCC);
Write18B20(0xBE);
LSB = Read18B20();
MSB = Read18B20();
*temp = ((int)MSB<<8) + LSB;
}
return ~ack;
}
#include<reg52.h>
void ConfigUART();
extern bit Get18B20Temp(int *p);
unsigned char IntToString(unsigned char *str, int dat);
void Delay(unsigned int i )
{
int x=0;
for(x=0;x<i;x++);
}
void Delay2(unsigned int i )
{
unsigned int x=0;
int y=0;
for(y=0;y<500;y++)
{
for(x=0;x<i;x++);
}
}
/********************************************************************
名称:串口发送函数 功能:MCU向无线WIFI模块ESP8266发送数据
********************************************************************/
void Send_Uart(unsigned char value)
{
ES=0; //关闭串口中断
TI=0; //清发送完毕中断请求标志位
SBUF=value; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1; //允许串口中断
}
/********************************************************************
名称:WIFI模块设置函数 作用: 启动模块,以便可以实现无线接入和控制
********************************************************************/
void SendAT(unsigned char *puf) // 数组指针*puf指向字符串数组
{
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
Delay(5);
puf++;
}
}
sbit LED=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
sbit KEY1=P2^4;
unsigned char text[2];
int f=1;
int temp;
void SetRed()
{
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
LED=1;
LED2=1;
//P2=0xF7;
}
void InitWifi()
{
SendAT("AT+CWMODE=1\r\n");
Delay2(500);
SendAT("AT+CWJAP=\"CMCC-5tiu\",\"12345\"\r\n");
Delay2(2000);
SendAT("AT+CIPSTART=\"TCP\",\"192.168.1.4\",19660\r\n");
Delay2(500);
SendAT("AT+CIPMODE=1\r\n");
Delay2(500);
SendAT("AT+CIPSEND\r\n");
Delay2(500);
f=1;
// SendAT("AT\r\n");
// Delay(30000);
// SendAT("AT+CWMODE=2\r\n");
// Delay(30000);
// SendAT("AT+CWSAP=\"esp8899\",\"12345678\",11,4\r\n");
// Delay(30000);
// SendAT("AT+CIPMUX=1\r\n");
// Delay(30000);
// SendAT("AT+CIPSERVER=1,5000\r\n");
// Delay(30000);
// SendAT("AT+CIPSTO=0\r\n");
}
int intT,decT;
unsigned char len;
unsigned char str[12];
bit res;
void main()
{
LED2=0;
Delay2(500);
ConfigUART();
SetRed();
InitWifi();
LED2=0;
while(1)
{
//LED=~LED;
//
// Delay(50000);
if(LED3==0)
{
LED=0;
LED2=0;
//SendAT("8\r\n");
res= Get18B20Temp(&temp);
intT = temp >> 4; //分离出温度值整数部分
decT = temp & 0xF; //分离出温度值小数部分
len = IntToString(str, intT); //整数部分转换为字符串
str[len++] = '.'; //添加小数点
decT = (decT*10) / 16; //二进制的小数部分转换为1位十进制位
str[len++] = decT + '0'; //十进制小数位再转换为ASCII字符
while (len < 6) //用空格补齐到6个字符长度
{
str[len++] = ' ';
}
str[len] = '\0'; //添加字符串结束符
SendAT(str);
Delay2(1000);
}
else
{
LED=1;
LED2=0;
}
}
}
void ConfigUART()
{
TMOD=0x20;
SCON=0x50;
//TH1=256-(11059200/12/32)/baud;
TH1=0xFD;
TL1=TH1;
PCON = 0x00;
EA=1;
ES=1;
TR1=1;
}
void InterruptUART() interrupt 4
{
if(RI)
{
RI=0;
}
if(TI)
{
TI=0;
}
}
/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString(unsigned char *str, int dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //如果为负数,首先取绝对值,并在指针上添加负号
{
dat = -dat;
*str++ = '-';
len++;
}
do { //先转换为低位在前的十进制数组
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
len += i; //i最后的值就是有效字符的个数
while (i-- > 0) //将数组值转换为ASCII码反向拷贝到接收指针上
{
*str++ = buf[i] + '0';
}
*str = '\0'; //添加字符串结束符
return len; //返回字符串长度
}