unsigned char temperature; //???????? //???DS18B20,?????? void ds18b20_init() { DQ=1; Delay(2); DQ=0; Delay(480); DQ=1; Delay(60); } //?DS18B20????????? void ds18b20_write_byte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ=0; Delay(1); DQ=dat&0x01; dat>>=1; Delay(60); DQ=1; } } //??DS18B20????????? unsigned char ds18b20_read_byte() { unsigned char i,dat=0; for(i=0;i<8;i++) { DQ=0; Delay(1); DQ=1; Delay(1); dat|=(DQ<<i); Delay(60); } return dat; } //??DS18B20???? void ds18b20_read_temperature() { unsigned char TL,TH; ds18b20_init(); ds18b20_write_byte(0xCC); //??ROM?? ds18b20_write_byte(0x44); //?????? Delay(750); ds18b20_init(); ds18b20_write_byte(0xCC); //??ROM?? ds18b20_write_byte(0xBE); //??????? TL=ds18b20_read_byte(); //??????8? TH=ds18b20_read_byte(); //??????8? temperature=(TH<<4)|(TL>>4); //????? }
时间: 2023-08-25 08:06:53 浏览: 111
这段代码是一个用于读取DS18B20温度传感器的程序。首先,`ds18b20_init()`函数初始化DS18B20传感器。然后,`ds18b20_write_byte()`函数用于向DS18B20发送命令和数据。`ds18b20_read_byte()`函数用于从DS18B20读取数据。最后,`ds18b20_read_temperature()`函数用于读取DS18B20传感器的温度值,并将其存储在`temperature`变量中。
具体来说,`ds18b20_read_temperature()`函数通过向DS18B20发送"跳过ROM"指令和"温度转换"指令来启动温度转换过程。然后等待750毫秒,等待转换完成。接着发送"跳过ROM"指令和"读取暂存器"指令,来读取DS18B20传感器中存储的温度值。最后将读取到的温度值转换成实际的温度值,并将其存储在`temperature`变量中。
需要注意的是,这段代码中的`Delay()`函数是一个自定义的延时函数,它用于在需要等待一段时间时调用。具体实现可能因不同的开发板而异。
相关问题
给出主函数的主要流程步骤:#include "system.h" #include "lcd12864_st7920.h" #include "delay.h" #include <stdio.h> #include "18b20.h" sbit buzzer = P1^3 ; sbit yeweiG =P1^0; sbit yeweiD =P1^1; unsigned char xdata dis0[16];//定义显示区域临时存储数组 unsigned char xdata dis1[16]; unsigned char xdata dis2[16]; unsigned char xdata dis3[16]; unsigned char i; unsigned char ReadTempFlag;//定义读时间标志 int temp1; //温度读取值 float temperature; unsigned long time_20ms=0; //定时器计数 float Sudu =0; //速度值 unsigned int PluNum = 0; //脉冲数 unsigned int disPlu = 0; //脉冲数 bit dealSuduFlag =0; //处理速度标志 float xdata juli=0; //距离 bit disFlag =0;//更新显示 unsigned char yeweiFlag = 'N';//液位标志 void main(void) { Init_Timer0(); //定时器0初始化 UART_Init(); DelayMs(200); //延时有助于稳定 Init_ST7920(); //初始化 ClrScreen(); buzzer =1; // sprintf(dis0,"20%02d-%02d-%02d ",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周 // LCD_PutString(0,1,dis0,16);//显示第时间 // // sprintf(dis0,"%02d:%02d:%02d ",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//时分秒 // LCD_PutString(0,2,dis0,16);//显示第时间 // // LCD_PutString(0,3,"起:5元 3元/km ",16); //固定显示价格 // LCD_PutString(0,4,"实际价格",8); // uartSendStr("ready ok !",10); // Ds1302_Write_Time(); while(1) { if(dealSuduFlag == 1) { Sudu=(float)PluNum0.23.6/2; //m/s 20个脉冲为1圈 3s时间进行检测 disPlu = PluNum/2; //转速 PluNum=0; dealSuduFlag=0; juli = juli+Sudu0.2; //公里 } if(disFlag==1) //显示 { disFlag=0; //标志位清零 ReadTempFlag++; //读取温度计时 if(ReadTempFlag >= 3) { ReadTempFlag=0; temp1=ReadTemperature(); //读取温度 temperature=(float)temp10.0625; //温度值转换 } if((yeweiG == 0)&&(yeweiD == 0))//上下液位有水 { yeweiFlag = 'H'; } sprintf(dis0,"液位 %c ",yeweiFlag);//打印 LCD_PutString(0,1,dis0,16);//显示 sprintf(dis1,"温度 %4.1fC 40 ",temperature);//打印 LCD_PutString(0,2,dis1,16);//显示 if((Sudu>1.5)||(temperature>40)||(yeweiFlag=='L')) //异常情况 {buzzer = !buzzer;} } } }
1. 引入所需头文件:system.h、lcd12864_st7920.h、delay.h、stdio.h、18b20.h;
2. 定义引脚及变量:定义蜂鸣器、液位传感器引脚,定义显示区域临时存储数组、温度读取标志、温度读取值、速度值、脉冲数、距离、更新显示标志、液位标志;
3. 初始化定时器0、串口;
4. 清空 LCD 显示屏;
5. 进入无限循环;
6. 如果处理速度标志为1,则计算速度、脉冲数、距离,处理速度标志清零;
7. 如果更新显示标志为1,则更新 LCD 显示,包括液位、温度、异常情况等;
8. 循环结束,回到第5步。
解释代码。#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "adc.h" #include "ds18b20.h" #include "oled_iic.h" short temperature; unsigned char Tx_Buf[10]; extern u8 flag; int main(void) { float temp; delay_init(); NVIC_Configuration(); uart_init1(9600); LED_Init(); // KEY_Init(); OLED_Init(); OLED_Clear(); OLED_ShowCH(0,0,"tem"); while(DS18B20_Init()) } while(1) { temperature=DS18B20_Get_Temp(); temperature=temperature/100*10+temperature%100/10; OLED_ShowNum(40, 0, temperature, 2,1); if(flag==1) { OLED_ShowCH(0,2,"Banana"); OLED_ShowCH(0,4,"2023.1.23"); OLED_ShowCH(0,6,"sichuan fujian"); } if(flag==2) { OLED_ShowCH(0,2,"Apple"); OLED_ShowCH(0,4,"2023.1.18"); OLED_ShowCH(0,6,"shandong yunan"); } if(flag==3) { OLED_ShowCH(0,2,"fish"); OLED_ShowCH(0,4,"2023.1.31"); OLED_ShowCH(0,6,"rizhao jinan"); } delay_ms(250); if(temperature>30) { GPIO_SetBits(GPIOA,GPIO_Pin_0); } if(temperature<30) { GPIO_ResetBits(GPIOA,GPIO_Pin_0); } } }
这段代码是一份嵌入式系统的 C 语言程序,用于控制温度传感器 DS18B20 和 OLED 显示屏。主要功能是读取温度传感器的温度数据并在 OLED 显示屏上显示出来,同时根据温度值控制 LED 灯的开关。
具体实现过程如下:
1. 引入需要的头文件包括 led.h、delay.h、key.h、sys.h、lcd.h、usart.h、adc.h、ds18b20.h 和 oled_iic.h。
2. 初始化系统延时、中断配置、串口通信、LED 灯和 OLED 显示屏。
3. 判断温度传感器 DS18B20 是否初始化成功。
4. 进入主循环,读取温度传感器的温度数据并在 OLED 显示屏上显示出来。同时根据温度值控制 LED 灯的开关。
5. 根据外部的 flag 变量的值,在 OLED 显示屏上显示不同的信息,其中 flag 的值由外部设备设置。
6. 延时 250 毫秒后再次执行读取温度数据和控制 LED 灯的操作。
需要注意的是,该程序的具体实现可能会因为硬件平台的不同而略有差异。例如,其中的 GPIO_SetBits 和 GPIO_ResetBits 函数可能是根据具体的开发板而定制的。
阅读全文