DS18B20与AVR单片机的数字温度计设计源程序.doc
文本预览下载声明
DS18B20与AVR单片机的数字温度计设计源程序
利用avr来读取ds18b20,实现温度计的功能,下面是关于DS18B20与AVR单片机的数字温度计设计源程序
#include mega48.h? #include delay.h? #include nokia3310.h #include monobus.h? 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码匹配,适用于一个DS18B20???????? ???????? //可以使用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_H15) data_T=(~data_T+1)/16; else data_T/=16; //计算实际温度???????? wendu=data_T;???????? ???????? lcd_gotoxy(16,3);???????? lcd_putsf(T = ,4);?????? //显示字符串,字符串是保存在Flash的???????? if(data_H15) 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.0625CVAVR自带了18B20的库,如果大家不喜欢上面我写的函数,也可以使用自带的*/
//**********************************************************************************
//**********************************************************************************
//monobus.h文件,用于操作DS18B20/DS2401等单总线器件? //假设软件设计要求的时钟频率是4MHz//实际上硬件工作在2-8MHz下也很正
显示全部