12MHz的51单片机写控制DS18B20的延时函数
时间: 2023-06-25 21:04:06 浏览: 91
控制DS18B20需要使用延时函数来确保时序准确。以下是一个12MHz的51单片机控制DS18B20的延时函数示例:
```c
void delay_us(unsigned int us)
{
unsigned int i,j;
for(i=0;i<us;i++)
for(j=0;j<12;j++);
}
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<12000;j++);
}
```
其中,delay_us()函数用于微秒级别的延时,delay_ms()函数用于毫秒级别的延时。请根据自己的需要调整参数。注意,延时函数的精度受到单片机时钟频率的影响,如果使用不同频率的单片机,请重新计算延时参数。
相关问题
12MHz的51单片机写控制DS18B20的延时函数,写出调用延时60us和1S
下面是一个使用12MHz的51单片机控制DS18B20的延时函数示例代码:
```c
#include <reg51.h>
void DelayUs(unsigned int us)
{
while(us--)
{
/* 延时1微秒 */
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void DelayMs(unsigned int ms)
{
while(ms--)
{
/* 延时1毫秒 */
DelayUs(1000);
}
}
void main()
{
/* 延时60微秒 */
DelayUs(60);
/* 延时1秒钟 */
DelayMs(1000);
}
```
这个例子中,DelayUs() 函数使用了循环来实现延时,每次循环都执行四个 _nop_() 指令,每个 _nop_() 指令耗时1us,所以循环一次总共延时4us。因此,如果想要延时60us,就需要将 DelayUs(60) 传入 DelayUs() 函数中。
而对于 DelayMs() 函数,它是基于 DelayUs() 实现的,每次调用 DelayUs(1000) 来延时1ms,因此如果想延时1S,只需要调用 DelayMs(1000) 即可。
用c语言写51单片机和DS18B20的驱动函数
以下是51单片机和DS18B20的驱动函数示例代码:
```c
#include <reg51.h>
sbit DQ = P1^0; // DS18B20数据线连接到P1.0
void delay(int us) // 延时函数
{
int i,j;
for(i=0; i<us; i++)
for(j=0; j<11; j++);
}
// 向DS18B20写入一个字节的数据
void write_byte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
// 从DS18B20读取一个字节的数据
unsigned char read_byte()
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ) dat |= 0x80;
delay(5);
}
return dat;
}
// 启动DS18B20温度转换
void start_ds18b20()
{
DQ = 0;
delay(80);
DQ = 1;
delay(5);
DQ = 0;
delay(500);
}
// 读取DS18B20温度值
int read_ds18b20()
{
unsigned char th, tl;
int temp;
start_ds18b20(); // 启动温度转换
write_byte(0xCC); // 跳过ROM操作
write_byte(0x44); // 启动温度转换
delay(1000); // 等待转换完成
start_ds18b20(); // 再次启动DS18B20
write_byte(0xCC); // 跳过ROM操作
write_byte(0xBE); // 读取温度值
tl = read_byte(); // 读取低字节温度值
th = read_byte(); // 读取高字节温度值
temp = (th << 8) | tl; // 合并温度值
return temp * 0.0625; // 返回温度值
}
void main()
{
unsigned int temp;
while(1)
{
temp = read_ds18b20(); // 读取温度值
// 在这里可以将温度值输出到LCD或串口等设备
}
}
```
这段代码实现了从DS18B20获取温度值的功能,具体实现方法是通过向DS18B20写入命令启动温度转换,然后再读取温度值。注意,在读取温度值时要先读取低字节,再读取高字节,并且需要将两个字节的值合并成一个整数。最后,将温度值乘以0.0625即可得到摄氏度温度值。
阅读全文