在每一行代码后加上解释
时间: 2024-03-07 14:50:25 浏览: 60
好的,以下是加上了解释的代码:
```c
#include<reg51.h> // 包含 51 单片机的头文件
#include<intrins.h> // 包含 _nop_() 函数
#define DQ P2_7 // 定义 DQ 端口为 P2.7
typedef unsigned char uchar; // 定义无符号字符类型
typedef unsigned int uint; // 定义无符号整型类型
uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00}; // 数码管显示表
void delay(uint i) // 延时函数
{
while(i--); // 循环 i 次实现延时
}
uchar ds18b20_init() // DS18B20 初始化函数
{
uchar i;
DQ = 1; // DQ 置高
_nop_(); // 空操作
_nop_(); // 空操作
DQ = 0; // DQ 置低
delay(500); // 延时 500 微秒
DQ = 1; // DQ 置高
delay(60); // 延时 60 微秒
i = DQ; // 判断 DS18B20 是否存在
delay(420); // 延时 420 微秒
return i; // 返回 DS18B20 存在状态
}
void ds18b20_write_byte(uchar dat) // DS18B20 写一个字节函数
{
uchar i;
for(i=0; i<8; i++) // 循环 8 次写入 8 位数据
{
DQ = 0; // DQ 置低
DQ = dat & 0x01; // 写入一个数据位
delay(6); // 延时 6 微秒
DQ = 1; // DQ 置高
dat >>= 1; // 数据右移一位
}
delay(60); // 延时 60 微秒
}
uchar ds18b20_read_byte() // DS18B20 读一个字节函数
{
uchar i, j, dat = 0;
for(i=0; i<8; i++) // 循环 8 次读入 8 位数据
{
DQ = 0; // DQ 置低
dat >>= 1; // 数据右移一位
DQ = 1; // DQ 置高
j = DQ; // 读入一个数据位
_nop_(); // 空操作
_nop_(); // 空操作
if(j) // 判断数据位是否为 1
dat |= 0x80; // 如果为 1,则将数据位写入 dat 的最高位
delay(6); // 延时 6 微秒
}
return dat; // 返回读取的字节数据
}
void ds18b20_start() // DS18B20 温度转换函数
{
ds18b20_init(); // 初始化 DS18B20
ds18b20_write_byte(0xcc); // 发送跳过 ROM 命令
ds18b20_write_byte(0x44); // 发送温度转换命令
}
uchar ds18b20_read_temp() // DS18B20 读取温度函数
{
uchar tl, th;
ds18b20_init(); // 初始化 DS18B20
ds18b20_write_byte(0xcc); // 发送跳过 ROM 命令
ds18b20_write_byte(0xbe); // 发送读取温度命令
tl = ds18b20_read_byte(); // 读取温度数据低八位
th = ds18b20_read_byte(); // 读取温度数据高八位
return tl; // 返回低八位温度数据
}
void display(uchar dat) // 数码管显示函数
{
P0 = table[dat/10]; // 显示十位数码
P1 = table[dat%10]; // 显示个位数码
}
void main()
{
uchar temp;
while(1)
{
ds18b20_start(); // 开始转换温度
temp = ds18b20_read_temp(); // 读取温度
display(temp); // 显示温度
delay(500); // 延时 500 毫秒
}
}
```
希望这份代码加上了注释后可以更加易于理解。
阅读全文