历史上的今天
今天是:2025年01月10日(星期五)
2021年01月10日 | 单片机MSP430 DS1B20 驱动
2021-01-10 来源:eefocus
多个共总线
ds18b20.h
#ifndef __ds18b20
#define __ds18b20
#include "msp430g2553.h"
#include #include #include #define DQ_1 P2OUT |= BIT0 #define DQ_0 P2OUT &= ~BIT0 #define DQ_in P2DIR &= ~BIT0 #define DQ_out P2DIR |= BIT0 #define DQ_val (P2IN & BIT0) void read_rom(unsigned char rom[]); void WRITE_ROM(unsigned char T_H, unsigned char T_L, unsigned char CONFIG1); unsigned int get_one_temperature(unsigned char ch); unsigned char DS18B20_SearchRomId(unsigned char (*pID)[8], unsigned char Num);//没用到 #endif ds18b20.c #include "ds18b20.h" #define CPU_F ( (double) 8000000) #define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) ) #define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) ) unsigned char ds18b20_rom1[8] = { 0x80, 0x3C, 0x01, 0xA8, 0x16, 0x8D, 0xB7, 0x28 }; /* 八个DS18B20的64位ROM地址 */ unsigned char ds18b20_rom2[8] = { 0xB4, 0x3C, 0x01, 0xA8, 0x16, 0x1C, 0x9C, 0x28 }; unsigned char ds18b20_rom3[8] = { 0x6E, 0x3C, 0x01, 0xA8, 0x16, 0x8E, 0x3A, 0x28 }; unsigned char ds18b20_rom4[8] = { 0x9F, 0x3C, 0x01, 0xA8, 0x16, 0x75, 0xA3, 0x28 }; /************************************************ ** 函数名称 : void reset(void) ** 函数功能 : ds18b20复位函数 ** 输 入 : 无 ** 输 出 : 无 ** 说 明 : ************************************************/ void reset(void) { DQ_out; /* 先设为输入口 */ DQ_0; /* 主机发送复位脉冲,强制拉DQ至低电平 */ delay_us(750); /* 延时500vs */ DQ_1; delay_us(15); // DQ_in; /* 设为输入口,释放DQ线 */ // while (DQ_val == 1) // ; /* 等待器件DS18B20应答(如果有低电平出现说明总线上有器件作出应答) */ // delay_us(50); /* 延时 */ } //等待DS18B20的回应 //返回1:未检测到DS18B20的存在 //返回0:存在 unsigned char DS18B20_Check(void) { unsigned char retry = 0; DQ_in; //SET PA0 INPUT while (DQ_val && retry < 200) { retry++; delay_us(1); }; if (retry >= 200) return 1; else retry = 0; while (!DQ_val && retry < 240) { retry++; delay_us(1); }; if (retry >= 240) return 1; return 0; } //从DS18B20读取一个位 //返回值:1/0 unsigned char DS18B20_Read_Bit(void) // read one bit { unsigned char data; DQ_out; //SET PA0 OUTPUT DQ_0; delay_us(2); DQ_1; DQ_in; //SET PA0 INPUT delay_us(12); if (DQ_val) data = 1; else data = 0; delay_us(50); return data; } //从DS18B20读取一个字节 //返回值:读到的数据 unsigned char DS18B20_Read_Byte(void) // read one byte { unsigned char i, j, dat; dat = 0; for (i = 1; i <= 8; i++) { j = DS18B20_Read_Bit(); dat = (j << 7) | (dat >> 1); } return dat; } //写一个字节到DS18B20 //dat:要写入的字节 void DS18B20_Write_Byte(unsigned char dat) { unsigned char j; unsigned char testb; DQ_out; //SET PA0 OUTPUT; for (j = 1; j <= 8; j++) { testb = dat & 0x01; dat = dat >> 1; if (testb) { DQ_0; // Write 1 delay_us(2); DQ_1; delay_us(60); } else { DQ_0; // Write 0 delay_us(60); DQ_1; delay_us(2); } } } //开始温度转换 void DS18B20_Start(void) // ds1820 start convert { reset(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); // skip rom DS18B20_Write_Byte(0x44); // convert } /************************************************ ** 函数名称 : void read_rom(unsigned char rom[]) ** 函数功能 : 从ds18b20中读出64位序列号 ** 输 入 : 无 ** 输 出 : 无 ** 说 明 : ************************************************/ void read_rom(unsigned char rom[]) { unsigned char i; reset(); DS18B20_Check(); DS18B20_Write_Byte(0x33); for (i = 8; i > 0; i--) { rom[i - 1] = DS18B20_Read_Byte(); } } /************************************************ ** 函数名称 : bit match_rom(uchar *rom) ** 函数功能 : 64位的ROM序列号匹配 ** 输 入 : 无 ** 输 出 : 无 ** 说 明 : ************************************************/ char match_rom(unsigned char *rom) { unsigned char i; reset(); DS18B20_Check(); DS18B20_Write_Byte(0x55); for (i = 8; i > 0; i--) { DS18B20_Write_Byte(*(rom + i - 1)); } return (1); } //写入配置 分辨率多少位 默认12位 void WRITE_ROM(unsigned char T_H, unsigned char T_L, unsigned char CONFIG1) { reset(); /*复位 */ DS18B20_Write_Byte(0xCC); /* SKIP ROM */ DS18B20_Write_Byte(0x4E); /* 写RAM命令 */ DS18B20_Write_Byte(T_H); /* 温度报警高限值 */ DS18B20_Write_Byte(T_L); /* 温度报警低限值 */ DS18B20_Write_Byte(CONFIG1); /* 配置位 */ reset(); /* 重新复位 */ DS18B20_Write_Byte(0xCC); /* SKIP ROM */ DS18B20_Write_Byte(0x48); /* 将RAM拷贝到EEPROM */ delay_ms(12); /* 耗时约10MS */ } /* 读取温度 */ unsigned int get_one_temperature(unsigned char ch) { unsigned int Temp_l = 0, Temp_h = 0, Temp = 0; float f_temp; switch (ch) { case 1: match_rom(ds18b20_rom1); break; case 2: match_rom(ds18b20_rom2); break; case 3: match_rom(ds18b20_rom3); break; case 4: match_rom(ds18b20_rom4); break; } DS18B20_Write_Byte(0xbe); // convert Temp_l = DS18B20_Read_Byte(); // LSB Temp_h = DS18B20_Read_Byte(); // MSB DS18B20_Start(); // ds1820 start convert Temp_h <<= 8; Temp = Temp_h + Temp_l; f_temp = Temp * 0.0625; /* 18b20的分辨率是0.0625 */ Temp = f_temp * 10 + 0.5; /* 乘以10表示小数点后面取一位,加0.5是四舍五入 */ return (Temp); /* Temp是整型 */ } /***************************************************************** * @brief :DS18B20_WriteBit() 主机向总线写1bit 数据 * @param : bit:要写入位的值 0或1 * @retval :无 ****************************************************************/ void DS18B20_WriteBit(unsigned char bit) { DQ_out; /* 主机端口推挽输出模式 */ DQ_0; /* Write 0 拉低总线10-15us */ delay_us(12); if (bit & 0x01) { DQ_1; // Write 1 } else { DQ_0; // Write 0 } delay_us(30); /* 写入数据位,保持20-45us */ DQ_1; /* 释放总线 */ delay_us(5); } /***************************************************************** * @brief :DS18B20_Read2Bit() 主机从总线上读取2位的数据 * @param :无 * @retval :读到到的数据 :00H,01H,10H,11H ****************************************************************/ unsigned char DS18B20_Read2Bit(void) { unsigned char i, data = 0; for (i = 0; i < 2; i++) { data <<= 1; if (DS18B20_Read_Bit()) data |= 1; } return (data); } /***************************************************************** * @brief :DS18B20_CRC8() DS18B20 ROMID CRC校验 * @param :*pRomId :要校验诉RomID * @retval :返回校验值 ****************************************************************/ unsigned char DS18B20_CRC8(unsigned char *pRomId) { unsigned char i, x; unsigned char crcbuff; unsigned char crc; crc = 0; for (x = 0; x < 8; x++) { crcbuff = pRomId[x]; for (i = 0; i < 8; i++) { if (((crc ^ crcbuff) & 0x01) == 0) crc >>= 1; else { crc ^= 0x18; /* crc=x8+x5+x4+1 */ crc >>= 1; crc |= 0x80;
史海拾趣
|
TOTA EMS(设备管理系统)简介生产设备,对一个制造型企业来说越来越重要,它是代表制造业先进生产力不可或缺的元素。目前,制造型企业所采用的生产设备是否更智能化,数量是否更多等,这些指标在一定程度上也标识了一个制造型企业的竞争力。然而如 ...… 查看全部问答> |
|
大家好,我在做一个毕设,按照nRF2402的数据手册建好了原理图,protel dxp没有2402的封装,我就自己建了个库,可是怎么也编译不过去,真是挺着急的,我把我做的东西都传上来,麻烦大家帮忙看看,学生不尽感激..... 这是几张截图,大家能发现问题的 ...… 查看全部问答> |
|
我有一个灰度显示的摄像头,也就是只有流明度信息 Y,一个BYTE表示一个像素点,看了S3C6410的手册,发现要么数据时YUV,要么是RGB, DMA后的内存组织方式是YUV三通道分量存储,或者是插入式存储,能够比较高效的直接将Y通道数据一一对应像素点的顺 ...… 查看全部问答> |
|
MPSendPackets(){ .... pAdapt->nTotalPacketsSeen[pVElan->NetworkConnection]++; ...… 查看全部问答> |
|
各位大虾: 最近有个问题困扰小弟很长时间了,请帮帮忙给点启示,在此多谢了! 我在linux内核里实现了一个1ms的定时器驱动,每当定时器到期时会发生定时中断,我想在我的定时中断处理函数(驱 ...… 查看全部问答> |
|
我们浏览网页必然需要浏览器,所以一个好的浏览器是至关重要的,可以保证我们浏览器网页、看视频、玩游戏的流畅和清晰。之前看到说Firefox和chrome都支持GPU硬件加速,前段时间发布的IE9Beta版据说也对GPU加速和Html5有着很好的支持,不知道效 ...… 查看全部问答> |
|
项目要求: 两线制电源供电,输出4~20mA电流信号(用XTR115处理电流及电源) 传感器模拟信号直接进入单片机的24位AD进行处理 RS232芯片可以与电脑进行通信(如果功耗允许的话会选择485通信) 4位数码管屏幕显示,3个按键操作 利用单片机的PWM输出电压 ...… 查看全部问答> |




