//函数名称: void DS18B20_Init(void) //实现功能: 初始化18B20 //入口参数: 无 //出口返回值: 无
//======================================== void DS18B20_Init(void) {
DQ_OUT; DQ_L;
usDelay(700); DQ_H;
usDelay(4); DQ_IN;
usDelay(100);
/* if(DQ_STAT!=0) //测试复位是否成功
Uart_Printf(\ else
Uart_Printf(\*/
usDelay(250); }
//======================================== //函数名称: U8 DS18B20_ReadBit(void) //实现功能: 读取18b20的一位数据 //入口参数: 无
//出口返回值: 读取的一位数据
//======================================== U8 DS18B20_ReadBit(void) {
U8 dat; DQ_OUT; DQ_L;
usDelay(2); DQ_IN;
usDelay(10); if(DQ_STAT!=0) dat=1; else
dat=0; usDelay(50); return (dat); }
//======================================== //函数名称: U8 DS18B20_ReadByte(void)
//实现功能: 读取一个字节的数据 //入口参数: 无
//出口返回值: 读取的一个字节数据
//======================================== U8 DS18B20_ReadByte(void) {
U8 i,j,dat; dat=0;
for(i=1;i<=8;i++) {
j=DS18B20_ReadBit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 }
return(dat); }
//======================================== //函数名称: void DS18B20_WriteByte(U8 dat) //实现功能: 向18B20写一个字节数据 //入口参数: 要写入的数据 //出口返回值: 无
//======================================== void DS18B20_WriteByte(U8 dat) {
U8 j;
U8 testb; DQ_OUT;
for(j=1;j<=8;j++) {
testb=dat&0x01; dat=dat>>1; if(testb) {
DQ_L;
usDelay(8); DQ_H;
usDelay(50); } else {
DQ_L;
usDelay(90); DQ_H;
usDelay(8);
} } }
//======================================== //函数名称: void DS18B20_ReadID(void) //实现功能: 读取18B20的ID号 //入口参数: 无 //出口返回值: 无
//======================================== void DS18B20_ReadID(void) {
usDelay(1);
DS18B20_Init();
DS18B20_WriteByte(DS18B20_ReadROM); DS18B20_ID[0] = DS18B20_ReadByte(); DS18B20_ID[1] = DS18B20_ReadByte(); DS18B20_ID[2] = DS18B20_ReadByte(); DS18B20_ID[3] = DS18B20_ReadByte(); DS18B20_ID[4] = DS18B20_ReadByte(); DS18B20_ID[5] = DS18B20_ReadByte(); DS18B20_ID[6] = DS18B20_ReadByte(); DS18B20_ID[7] = DS18B20_ReadByte(); }
//======================================== //函数名称: void DS18B20_Match(void) //实现功能: 匹配18B20 //入口参数: 无 //出口返回值: 无
//======================================== void DS18B20_Match(void) {
DS18B20_WriteByte(DS18B20_MatchROM); DS18B20_WriteByte(DS18B20_ID[0]); DS18B20_WriteByte(DS18B20_ID[1]); DS18B20_WriteByte(DS18B20_ID[2]); DS18B20_WriteByte(DS18B20_ID[3]); DS18B20_WriteByte(DS18B20_ID[4]); DS18B20_WriteByte(DS18B20_ID[5]); DS18B20_WriteByte(DS18B20_ID[6]); DS18B20_WriteByte(DS18B20_ID[7]); }
//======================================== //函数名称: void DS18B20_TmpChange(void) //实现功能: 18B20开始温度转换
//入口参数: 无 //出口返回值: 无
//======================================== void DS18B20_TmpChange(void) {
DS18B20_Init();
usDelay(2);/*delay(1);*/
DS18B20_WriteByte(DS18B20_SkipROM); // address all drivers on bus DS18B20_WriteByte(DS18B20_ConvertTemp); // initiates a single temperature conversion }
//======================================== //函数名称: U16 DS18B20_Temperature(void) //实现功能: 得到18B20温度值 //入口参数: 无
//出口返回值: 温度值
//======================================== U16 DS18B20_Temperature(void) {
float tt; U8 a,b;
DS18B20_Init();
usDelay(4);/*delay(1);*/
DS18B20_WriteByte(DS18B20_SkipROM); DS18B20_WriteByte(DS18B20_ReadSCR); a=DS18B20_ReadByte(); b=DS18B20_ReadByte(); temp=b;
temp<<=8; //two byte compose a int variable temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; }
//======================================== //函数名称: void Test_DS18B20(void) //实现功能: 18B20测试程序 //入口参数: 无 //出口返回值: 无
//======================================== void Test_DS18B20(void) {
U16 tmp;
TFT_Init(); //LCD初始化
Test_TFT(); //上白框背景
for (k=0;k<340;k++)//hang for (j=10;j<520;j++) //列
LCD_BUFFER[k][j]=COLOR_RED; //红色铺满屏幕 Uart_Printf(\
Uart_Printf(\ while(1) {
DS18B20_TmpChange(); Delay(1000);
tmp = DS18B20_Temperature(); //
Uart_Printf(\ LCD_Display_hanzi_16_16(50,30,hanzi[10]);//通 LCD_Display_hanzi_16_16(70,30,hanzi[11]);//信 LCD_Display_hanzi_16_16(90,30,hanzi[12]);//工 LCD_Display_hanzi_16_16(110,30,hanzi[13]);//程 LCD_Display_hanzi_16_16(130,30,hanzi[7]);//詹 LCD_Display_hanzi_16_16(150,30,hanzi[8]);//文 LCD_Display_hanzi_16_16(170,30,hanzi[9]);//魁 LCD_Display_hanzi_16_16(30,100,hanzi[14]);//温 LCD_Display_hanzi_16_16(50,100,hanzi[15]);//度 LCD_Display_hanzi_16_16(70,100,hanzi[16]);//是 LCD_Display_English_8_16(90,100,number[tmp/100]);
LCD_Display_English_8_16(100,100,number[(tmp0)/10]); LCD_Display_English_8_16(120,100,number[tmp]); LCD_Display_English_8_16(110,100,number[10]);//点 LCD_Display_hanzi_16_16(130,100,hanzi[17]);//摄 LCD_Display_hanzi_16_16(150,100,hanzi[18]);//氏
LCD_Display_hanzi_16_16(170,100,hanzi[15]);//度 t=tmp; } }
主函数
//====================================================================== // 工程名称: DS18B20.mcp
// 功能描述: 驱动DS18B20,在终端上显示温度值 // IDE环境: ADS v1.2 // 组成文件: main.c // 硬件连接: DQ ---- GPB5
// 维护记录: 2014-06-12 V1.0 by xgc