#include <tube.H> #include <key.H> #include <onewire.H> sbit DQ = P3^7; //µ¥×ÜÏß½Ó¿Ú u8 ff=0;//ÅжÏÊÇ·ñΪ¸ºÊý //µ¥×ÜÏßÑÓʱº¯Êý void Delay_OneWire(unsigned int t) //STC89C52RC { while(t--); } //ͨ¹ýµ¥×ÜÏßÏòDS18B20дһ¸ö×Ö½Ú void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(5); DQ = 1; dat >>= 1; } Delay_OneWire(5); } //´ÓDS18B20¶ÁÈ¡Ò»¸ö×Ö½Ú unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } //DS18B20É豸³õʼ»¯ bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } unsigned int Ds18b20temp() { u16 H8=0,L8=0; u16 temp1 = 0; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); Delay_OneWire(200); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); L8 = Read_DS18B20(); H8 = Read_DS18B20(); H8 = (H8 << 8) | L8; temp1 = H8; if((H8 & 0xf800) == 0xf800) { ff=1; temp1=~temp1+1; } else ff=0; temp1 = temp1 * 0.625; return temp1; }
时间: 2023-10-25 16:10:00 浏览: 98
这段代码是关于 DS18B20 温度传感器的读取和处理的部分。具体的功能如下:
1. 引入了头文件 `tube.H`、`key.H` 和 `onewire.H`,其中可能定义了一些函数和变量。
2. 定义了一个位变量 `DQ`,用于控制与温度传感器的通信。
3. 定义了一个 `ff` 变量,用于判断温度是否为负数。
4. 定义了延时函数 `Delay_OneWire()`,用于模拟时序。
5. 定义了函数 `Write_DS18B20()`,用于向 DS18B20 发送一个字节的数据。
6. 定义了函数 `Read_DS18B20()`,用于从 DS18B20 读取一个字节的数据。
7. 定义了函数 `init_ds18b20()`,用于初始化 DS18B20 温度传感器。
8. 定义了函数 `Ds18b20temp()`,用于获取温度传感器的温度值。
- 在函数中,首先进行DS18B20的初始化。
- 然后发送命令让DS18B20开始转换温度。
- 延时一段时间等待转换完成。
- 初始化DS18B20。
- 发送命令读取DS18B20的温度值。
- 将高8位和低8位进行合并得到完整的温度值。
- 判断温度是否为负数。
- 将温度值乘以0.625,得到最终的温度值。
- 返回温度值。
以上是对代码的简单分析,具体的实现逻辑可能还需要查看 `tube.H`、`key.H` 和 `onewire.H` 头文件中的定义。
相关问题
#include<REG52.H> #include<stdio.h> #include <intrins.h> sbit Trig=P2^0; sbit Echo=P2^1;超声模块测距代码补全
`#include<REG52.H>`是一段头文件的引用,代表使用了基于Intel 8051的单片机开发环境。`<stdio.h>`是标准输入输出头文件的引用。`<intrins.h>`是用于特殊函数的头文件引用。
以下是超声模块测距的代码补全:
```
#include<REG52.H>
#include<stdio.h>
#include <intrins.h>
sbit Trig=P2^0;
sbit Echo=P2^1;
void delay(unsigned int us) //延时函数
{
while(us--);
}
unsigned char read_distance() //读取距离函数
{
unsigned char distance;
Trig = 0; //初始化
delay(2);
Trig = 1; //触发测量
delay(10);
Trig = 0; //停止测量
while(!Echo); //等待Echo为高电平
TH0 = 0;
TL0 = 0; //清零计时器
while(Echo); //等待Echo为低电平
distance = (unsigned char)(TH0*256+TL0)/58.0; //计算距离
return distance;
}
void main()
{
unsigned char distance;
TMOD |= 0x01; //设置为定时器0,工作方式1
while(1)
{
distance = read_distance(); //读取距离
printf("The distance is %d cm\n",distance); //打印距离
delay(500); //延时500ms
}
}
```
#include <reg52.h> #include <intrins.h> #include "delay.h" #define CHECK_BUSY unsigned char LCD_Status; sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1
这段代码是用来控制LCD显示器的。它使用了8051系列单片机的寄存器和延时函数。代码中定义了LCD的控制引脚,包括RS、RW和EN。通过设置这些引脚的电平状态,可以实现对LCD的控制。
在代码中,通过定义一些宏来简化操作。比如,RS_CLR和RS_SET用于清零和置位RS引脚,RW_CLR和RW_SET用于清零和置位RW引脚,EN_CLR和EN_SET用于清零和置位EN引脚。
通过控制这些引脚的电平状态,可以发送命令和数据给LCD显示器,以实现显示内容的控制。具体的操作可以根据LCD显示器的规格和使用手册来确定。
这段代码中还定义了一个LCD_Status变量,用于保存LCD的状态信息。在实际使用中,可以根据需要对其进行修改和使用。
需要注意的是,这段代码并不完整,还需要结合其他代码来完成对LCD显示器的控制和数据的发送。
阅读全文