#ifndef _DS18B20_C_#define _DS18B20_C_#define DQ_18B20 (1<<3) // PD3#define DQ_TO_0() (DDRD |= DQ_18B20) // PD3=’0′#define DQ_TO_1() (DDRD &= ~DQ_18B20) // PD3=’float’#define DQ_status() (PIND & DQ_18B20) // read PD3 pin#ifndef CPU_CRYSTAL#define CPU_CRYSTAL (11.0592)#endif#define wait_us(us)_delay_loop_2((INT16U)((us)*CPU_CRYSTAL/4))// 1个初始化模块void ds18b20_config(void); // 配置端口// 3个基本模块BOOL ds18b20_reset(void); // 复位DS18B20void ds18b20_write(INT8U dat); // 写字节到DS18B20INT8U ds18b20_read(void); // 读字节从DS18B20// 2个应用模块void convert_T(void); // 启动温度转换INT16U read_T(void); // 读取转换值void ds18b20_config(void){DDRD &= ~DQ_18B20; // 输入模式(上电时为高电平)PORTD &= ~DQ_18B20; // 输出锁存器写0,以后不再更改}BOOL ds18b20_reset(void){BOOL bus_flag;DQ_TO_0(); // 设置1-wire总线为低电平(占领总线)…wait_us(490); // 490uscli(); // 下面这段时间要求比较严格,为保险起见,关中断DQ_TO_1(); // 设置1-wire总线为高电平(释放总线)wait_us(67.5); // 最佳时间: 60us+7.5us!(忙延时,只是一种策略)// 探测总线上是否有器件if(DQ_status()) bus_flag=FAIL; // 复位单总线但没有发现有器件在线else bus_flag=SUCC; // 复位单总线并发现有器件在线sei(); // 退出临界代码区(开中断)wait_us(490-67.5); // 490-67.5usreturn(bus_flag);}void ds18b20_write(INT8U dat){INT8U count;// 每个字节共8位,一次发一位for(count=0; count<8; count++) {cli(); // 保证绝对不会发生中断!DQ_TO_0(); // 设置1-wire总线为低电平wait_us(2); // about 2usif(dat&0×01) DQ_TO_1(); // 并串转换,先低位后高位else DQ_TO_0();dat >>= 1; // 下一位做好准备// 60us~120us(实际不能到120us, 因为其它语句也用时间了!)wait_us(62); // 62usDQ_TO_1();sei(); // 恢复系统中断wait_us(2); // 2us}}INT8U ds18b20_read(void){INT8U count,dat;dat = 0×00; // 数据接收准备// 每个字节共8位,一次收一位for(count=0; count<8; count++) {cli(); // 保证绝对不会发生中断!// 从总线拉低到读总线状态,不能大于15us!DQ_TO_0(); // 设置1-wire总线为低电平(拉低总线以同步)wait_us(2); // 2usDQ_TO_1(); // 设置1-wire总线为高电平(释放总线)wait_us(4); // 4usdat >>= 1;if(DQ_status()) dat|=0×80; // 读取总线电平,先收低位再收高位sei(); // 恢复系统中断wait_us(62); // 必须大于60us}return(dat);}void convert_T(void){if(ds18b20_reset()==SUCC) { // 如果复位成功ds18b20_write(0xcc); // 跳过多器件识别ds18b20_write(0×44); // 启动温度转换}}INT16U read_T(void){INT16U value=0;if(ds18b20_reset()==SUCC) { // 如果复位成功ds18b20_write(0xcc); // 跳过多器件识别ds18b20_write(0xbe); // 读暂存器value = (INT16U)ds18b20_read(); // 低字节value += (INT16U)(ds18b20_read())<<8; // 高字节}return(value);}#endif
导读:目前正在解读《基于WinAVR的DS18B20源程序》的相关信息,《基于WinAVR的DS18B20源程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《基于WinAVR的DS18B20源程序》的详细说明。
简介:本文给大家分享了一个基于WinAVR的DS18B20源程序。
提醒:《基于WinAVR的DS18B20源程序》最后刷新时间 2024-03-14 00:57:47,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《基于WinAVR的DS18B20源程序》该内容的真实性请自行鉴别。