单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序

该博客详细介绍了如何使用AVR单片机通过C语言控制DS18B20数字温度传感器进行温度测量。文中提供了一个完整的C程序,包括初始化、数据读取和温度转换,并解释了单总线操作的实现。此外,还提及了CRC8校验在DS18B20中的应用。
摘要由CSDN通过智能技术生成

原标题:AVR单片机控制DS18B20的示例C程序

#include

#include

#include

#include

unsigned char data_H, data_L,wendu;

unsigned int data_T;

void main(void)

{

lcd_init(); //lcd初始化

lcd_cls(); //清屏,光标回位

while(1)

{

monobus_init(); //单 复位

write_monobus(0xCC); //跳过ID码匹配,适用于一个

//可以使用8条语句代替上面的那条语句依次写入8个ID码,这样就是ID码匹配了

//如果不知道18B20的ID码,可以在总线上接入单个18B20

//然后参考下面的读取语句,依次读取18B20的8个ID码

//记得使用CRC8校验一下是否正确

write_monobus(0x44); //启动温度转换

delay_ms(500); //等待转换

monobus_init(); //单总线复位

write_monobus(0xCC); //跳过ID码匹配

write_monobus(0xBE); //通知DS18B20,准备读数据

data_L=read_monobus(); //读取第一个数据(温度低字节)

data_H=read_monobus(); //读取第二个数据(温度高字节)

//可以继续读取第三个到第九个RAM数据

lcd_cls();

data_T=data_H*256+data_L; //合并后得到原始温度数据

if(data_H>15) data_T=(~data_T+1)/16; else data_T/=16; //计算实际温度

wendu=data_T;

lcd_gotoxy(16,3);

lcd_putsf("T = ",4); //显示字符串,字符串是保存在Flash的

if(data_H>15) lcd_putchar(’-’);

lcd_put(wendu); //显示温度

lcd_putchar(’ ’); //空一个字符

lcd_write(2); //显示C前面上标的一个点

lcd_write(0); //空一小格

lcd_putchar(’C’);

delay_ms(250);

}

}

/*

如果温度为正,则T的最高位的4位都为0,否则为1

负温度的计算:原始数据取反、加1、再乘以 0.0625

正温度的计算:原始数据乘以 0.0625

CV 自带了18B20的库,如果大家不喜欢上面我写的函数,也可以使用自带的

*/

//**********************************************************************************

//**********************************************************************************

//monobus.h文件,用于操作DS18B20/DS2401等单总线器件

//假设软件设计要求的时钟频率是4MHz

//实际上硬件工作在2-8MHz下也很正常,就是说,下面代码的延时取值是很合适的

//CVAVR本身自带单总线的库1wire.h,如果大家不喜欢下面的代码也可以使用它自带的函数(请看帮助文档)

#define monobus_1 DDRC.0=0 //设置 IO为输入,由于总线存在 ,所以此时电平是1

#define monobus_0 DDRC.0=1 //设置单片机IO为输出,配合默认的 PORTC.0=0 则输出0电平

#define monobus_in PINC.0 //检测总线(从机)的电平状态

void monobus_init(void) //复位,不检测从机设备是否存在(只要没有虚焊就肯定存在的)

{

monobus_0;

delay_us(480);

monobus_1;

delay_us(480);

}

void write_monobus(unsigned char data) //向单总线的从机写入数据(先写低位再写高位,与SPI相反)

{

unsigned char n=1;

while(n)

{

monobus_0;

delay_us(2); //拉低总线1-3us,通知从机准备收发数据

if(data&n) monobus_1; else monobus_0; //向总线写数据的某一位(1或者0)

delay_us(75); //等待90us,保证从机有足够的时间进行采样(24-210us)

monobus_1; //释放总线

delay_us(2); //释放总线时间要大于1us

n<<=1;

}

}

unsigned char read_monobus(void) //读单总线的从机数据(先传输低位后传输高位,与SPI相反)

{

unsigned char data_ =0;

unsigned char n=1;

while(n)

{

monobus_0;

delay_us(2); //拉低总线1-3us,通知从机准备收发数据

monobus_1; //释放总线

delay_us(5); //从机在1-25us内会向总线输出数据的某一位(1或者0)

if(monobus_in) data_18b20+=n; //读取总线数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值