搜档网
当前位置:搜档网 › 5、串口温度数据发送程序

5、串口温度数据发送程序

/************************************************************
*DS18B20 驱动程序
***********************************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar Tx_Data[2];//全局变量,存放两位需发送的数据

uchar temperature[2];//存放温度数据
uchar temp[7]; //存放分解的7个温度数据
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴

sbit P2_0=P2^0;//数码管位选,十位
sbit P2_1=P2^1;//数码管位选,个位
sbit P1_1=P1^1;//发送数据后,指示灯显示

sbit DS18B20_DQ=P1^0; //单总线引脚
void DS18B20_Init(); //DS18B20初始化
bit DS18B20_Reset(); //DS18B20复位
void DS18B20_WriteData(uchar wData); //写数据到DS18B20
uchar DS18B20_ReadData(); //读数据

void display_Temp(uchar shi,uchar ge);//显示温度
void work_Temp(); //转换温度

void Tx_UARTData(uchar Data0,uchar Data1);//温度发送子程序
void UART_Init(); //串口初始化

/************************************************************
*DS18B20的初始化
*函数名称:DS18B20_Init()
************************************************************/
void DS18B20_Init()
{
DS18B20_Reset();
DS18B20_WriteData(0xCC);//跳过ROM
DS18B20_WriteData(0x4E);//写暂存器
DS18B20_WriteData(0x20);//往暂存器的第三个字节中写上限值
DS18B20_WriteData(0x00);//往暂存器的第四个字节中写下限值
DS18B20_WriteData(0x7F);//将配置寄存器配置为12位精度
DS18B20_Reset();
}
/************************************************************
*DS18B20复位及存在检测(通过存在脉冲可以判断DS18B20是否损坏)
*函数名称:DS18B20_Reset()
************************************************************/
bit DS18B20_Reset()
{
uchar i;
bit flag;
DS18B20_DQ=0; //拉低总线
for(i=240;i>0;i--); //延时480微妙,产生复位脉冲
DS18B20_DQ=1; //释放总线
for(i=40;i>0;i--); //延时80微妙,对总线采样
flag=DS18B20_DQ; //对数据脚采样
for(i=200;i>0;i--); //延时400微妙,等待总线恢复
return(flag); //根据flag的值可知DS18B20是否存在或损坏,可加声音警告提示DS18B20故障
}
/*************************************************************
*写数据到DS18B20
*函数名称:DS18B20_WriteData()
**************************************************************/
void DS18B20_WriteData(uchar wData)
{
uchar i,j;
for(i=8;i>0;i--)
{
DS18B20_DQ=0; //拉低总线,产生写信号
for(j=2;j>0;j--); //延时4us
DS18B20_DQ=wData&0x01;//发送1位
for(j=30;j>0;j--); //延时60us,写时序至少要60us
DS18B20_DQ=1; //

释放总线,等待总线恢复
wData>>=1; //准备下一位数据的传送
}
}
/*************************************************************
*从DS18B20中读数据
*函数名称:DS18B20_ReadData()
**************************************************************/
uchar DS18B20_ReadData()
{
uchar i,j,TempData;
for(i=8;i>0;i--)
{
TempData>>=1;
DS18B20_DQ=0; //拉低总线,产生读信号
for(j=2;j>0;j--); //延时4us
DS18B20_DQ=1; //释放总线,准备读数据
for(j=4;j>0;j--); //延时8us,读数据
if(DS18B20_DQ==1)
{ TempData |=0x80; }
for(j=30;j>0;j--); //延时60us
DS18B20_DQ=1; //拉高总线,准备下一位数据的读取
}
return( TempData); //返回读到的数据
}
/*************************************************************
*定时器延时,每次0.1ms(12Mz)
*函数名称:delay(uint delaytime)
**************************************************************/
void delay(uint delaytime)
{
uint j;
//TMOD=0X02; //T0定时器,方式2,自动重装初值
TL0=0X9C; //每次0.1ms(晶振12Mz)
TH0=0X9C;
TR0=1; //启动T0
for(j=delaytime;j>0;j--)
{
while(!TF0);
TF0=0; //溢出标志清零
}
TR0=0;
}
/*************************************************************
*温度发送子程序
*函数名称:void Tx_UARTData(uchar Data0,uchar Data1)
**************************************************************/
void Tx_UARTData(uchar Data0,uchar Data1)
{
uchar i;
Tx_Data[0]=Data0;
Tx_Data[1]=Data1;
for(i=0;i<2;i++)
{
SBUF=Tx_Data[i];
while(!TI); //等待数据发送完
TI=0;
delay(10);//延时0.5ms,等待发送下一个数据
}
}
/*************************************************************
*串口初始化
*函数名称:void Init()
**************************************************************/
void UART_Init()
{
//TMOD = 0x20; //定时器1,方式2
TH1 = 0xFD;
TL1 = 0xFD; //波特率9600,晶振12Mz
SCON = 0x40; //串口方式1,允许接收
PCON = 0x00; //SMOD=0
TR1 = 1; //启动定时器1
}

/*************************************************************
*主程序
**************************************************************/
void main()
{
uchar i,k=60;
P2=1; //显示初始化
P1_1=0; //发送指示清零
TMOD = 0x22; //T0定时器,方式2,用于延时;定时器1,方式2,用于设置波特率
DS18B20_Init();//DS18B20初始化
UART_Init(); //串口初始化
while(1)
{
DS18B20_Reset(); //复位
DS18B20_WriteData(0xcc); //跳过ROM命令
DS18B20_WriteData(0x44); //温度转换命令
DS18B20_Reset();
DS18B20_WriteData(
0xCC);
DS18B20_WriteData(0xbe);
for

(i=0;i<2;i++)
{temperature[i]=DS18B20_ReadData();}//采集温度
DS18B20_Reset(); //复位,结束读数据
work_Temp();
Tx_UARTData(temp[1],temp[2]);
display_Temp(temp[1],temp[2]); //显示温度

}
}
/*************************************************************
*温度显示子程序
*函数名称:display_Temp()
**************************************************************/
void display_Temp(uchar shi,uchar ge)
{
P2_0=0;//显示十位
P0=table[shi];
delay(30);//延时2ms
P2_0=1;

P2_1=0;//显示个位
P0=table[ge];
delay(30);//延时2ms
P2_1=1;

//P2_2=1;//显示小数十分位
//P0=table[temp[3]];
//delay(30);//延时3ms
//P2_2=0;
}
/*************************************************************
*温度转换子程序
*函数名称:void work_Temp()
**************************************************************/
void work_Temp()
{
uchar temp_data,temp_data_2;
//uint tempDec; //用来存放4位小数
//temp_data=temperature[1];
//temp_data&=0xf0; //取高4位
temp_data=temperature[1]<<4; //取高字节低4位(温度读数高4位),注意此时是12位精度
temp_data_2=temperature[0]>>4; //取低字节高4位(温度读数低4位),注意此时是12位精度
temp_data=temp_data|temp_data_2;//组合成完整的数据
//temp[0]=temp_data/100; //取百位
temp[1]=(temp_data%100)/10; //取十位
temp[2]=(temp_data%100)%10; //取个位

//temperature[0]&=0x0f; //取低字节低4位,即温度小数位
//tempDec=temperature[0]*625; //625=0.625*10000,表示小数部分扩大1万倍,方便显示
//temp[3]=tempDec/1000; //取小数十分位
//temp[4]=(tempDec%1000)/100; //取小数百分位
//temp[5]=((tempDec%1000)%100)/10;//取小数千分位
//temp[6]=((tempDec%1000)%100)%10;//取小数万分位
}







相关主题