在线时间237 小时
UID146802
注册时间2015-3-6
NXP金币0
TA的每日心情 | 开心 2019-7-11 19:28 |
---|
签到天数: 141 天 连续签到: 1 天 [LV.7]常住居民III
金牌会员
 
- 积分
- 2492
- 最后登录
- 2020-9-16
|
本帖最后由 chifen 于 2015-10-5 11:14 编辑
DS18B20的资料这里就不介绍了,这里只说怎么使用
1, 硬件,18B20要用一条线就可以实现 读取,所 先要找一个IO做连线,这里使用的是PA13
2, 软件的实现 ,这里主要是移植一些现成的程序代码,KL26与别的ARM的IO操作是差不多的, ARM 的IO不能像8位单片机一样 在使用的时候 也可以输出 和输入 , 我在现有的源码中,只发现 二种状态 ,输出和输入模式,这里我在每次操用IO前,做一个状态转换,比如我要用输入模式时,改成输入模式
附个代码 :
- //数据线强制拉低
- #define CLR_DS18B20 GPIO_CLR(MKL_PORTA, 13)
- //数据线强制拉高,上拉
- #define SET_DS18B20 GPIO_SET(MKL_PORTA,13 )
- //输出
- #define HLD_DS18B20 GPIO_DDR_OUTPUT(MKL_PORTA,13) //M0控制总线
- //输入
- #define RLS_DS18B20 GPIO_DDR_INPUT(MKL_PORTA,13) //释放总线
- //查询
- #define STU_DS18B20 GPIO_GET_VALUE(MKL_PORTA,13) //数据线的状态
复制代码 3,如何读取,这里主要是延时,这里我有一个延时函数做处理,精度不高,但只要满足18B20总线的唤醒条件就可以,我是用逻辑分析仪测到的延时时间是delay_nus(480)时 580US左右 附代码:
//延时函数
- void delay_nus(uint32_t count)
- {
- uint32_t i,j;
- for(i=count;i>0;i--)
- for(j=9;j>0;j--);
- }
复制代码
4,其它部分没有改动
- /***************************************************/
-
-
- /*-------------------------------------------------*/
- //#include "..\..\App\includes.h"
- #include "ds18b20.h"
- //#include "DrvSYS.h"
- unsigned char DS18B20_sign_flag=0;
- void gpio_18B20 (void)
- {
- /*
- * 开启PB PD GPIO时钟
- */
- SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK ;
- PORTA_PCR13 |= (PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK);
- FGPIOA_PSOR |= 1<<13;
- FGPIOA_PDDR |= 1<<13; /* 配置GPIO为输出 */
-
-
- }
- /*************************************************************************************
- ** Function name: delay_ms
- ** Descriptions: 大约40us(晶振为12MHZ)延时子程序
- ** input parameters: count
- ** output parameters: 无
- ** Returned value: 无
- *************************************************************************************/
- void delay_nus(uint32_t count)
- {
- uint32_t i,j;
- for(i=count;i>0;i--)
- for(j=9;j>0;j--);
- }
- /**********************************************************************
- functionName: unsigned char resetDS18B20(void)
- description :DS18B20初始化
- **********************************************************************/
- unsigned char resetDS18B20(void)
- {
- unsigned char errTime=0;
- HLD_DS18B20; //控制总线
- CLR_DS18B20; //强制拉低
- //3us
- delay_nus(480); //以上延时大于480us
-
- SET_DS18B20;
- RLS_DS18B20; //释放总线,总线自动上拉 DDR
- delay_nus(10); //15~60us
-
- while (STU_DS18B20)
- {
- delay_nus(3); //5.15us
- errTime++;
- if (errTime>25)
- return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
- }
- errTime=0;
- while (!(STU_DS18B20))
- {
- delay_nus(3); //5.15us
- errTime++;
- if (errTime>50)
- return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
- }
- HLD_DS18B20; //控制总线
- SET_DS18B20; //强制拉高
- delay_nus(300);
- return(0xff);
- }
- /**********************************************************************
- functionName: unsigned char readByteDS18B20(void)
- description :读DS18B20一个字节
- **********************************************************************/
- unsigned char readByteDS18B20(void)
- {
- unsigned char i;
- unsigned char retVal=0;
- //RLS_DS18B20; //释放总线
- for (i=8;i>0;i--)
- {
- HLD_DS18B20; //控制总线
- CLR_DS18B20; //强制拉低
- delay_nus(2); //延时大于1us
- SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
- RLS_DS18B20; //释放总线
- delay_nus(2);
- retVal>>=1;
- if (STU_DS18B20)
- retVal|=0x80;
- delay_nus(40); //31us
- }
- HLD_DS18B20; //控制总线
- SET_DS18B20; //强制拉高
- return(retVal);
- }
- /**********************************************************************
- functionName: unsigned char readByteDS18B20(void)
- description :写DS18B20一个字节
- **********************************************************************/
- void writeByteDS18B20(unsigned char wb)
- {
- unsigned char i;
- unsigned char temp;
- //RLS_DS18B20; //释放总线
- for (i=0;i<8;i++)
- {
- HLD_DS18B20; //控制总线
- CLR_DS18B20; //强制拉低
- delay_nus(12); //14.92us
- temp=wb>>i;
- if (temp&=0x01)
- SET_DS18B20; //释放总线
- else
- CLR_DS18B20; //强制拉低
- delay_nus(30); //30.38us
- SET_DS18B20; //释放总线
- delay_nus(2); //2.71us(大于1us就行了)
- }
- }
- /**********************************************************************
- functionName: get_rom(unsigned char* p)
- description :读ROM
- **********************************************************************/
- void get_rom(unsigned char* p)
- {
- unsigned char i;
- if (resetDS18B20()==0xff)
- {
- writeByteDS18B20(ds18b20_read_rom);
- for (i=0;i<8;i++)
- {
- *p++ = readByteDS18B20();
- }
- }
- }
- /**********************************************************************
- functionName: void set_ds18b20(char th,char tl,unsigned char config)
- description :设定DS18B20模式
- **********************************************************************/
- void set_ds18b20(char th,char tl,unsigned char config)
- {
- if (resetDS18B20()==0xff)
- {
- writeByteDS18B20(ds18b20_skip_rom);
- writeByteDS18B20(ds18b20_write_ram);
- writeByteDS18B20(th);
- writeByteDS18B20(tl);
- writeByteDS18B20(config);
- }
- }
- /**********************************************************************
- functionName: convert_ds18b20(void)
- description :写DS18B20一个字节
- **********************************************************************/
- void convert_ds18b20(void)
- {
- if (resetDS18B20()==0xff)
- {
- writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
- writeByteDS18B20(ds18b20_convert_tem); //启动温度转换
- }
- }
- /**********************************************************************
- functionName: unsigned int readTempDS18B20(void)
- description :读DS18B20温度 有正负符号标志和两个小数点精度
- **********************************************************************/
- unsigned int readTempDS18B20(void)
- {
- unsigned char tempL,tempH,wm0,wm2;
- unsigned int x;
- if (resetDS18B20()==0)
- { SET_DS18B20; return 0;}
- writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
- writeByteDS18B20(ds18b20_read_ram); //读数据
- tempL=readByteDS18B20();
- tempH=readByteDS18B20();
- wm0=tempL;
- wm0=wm0>>4;
- tempH=tempH<<4;
- wm2=wm0+tempH; //温度的整数值
- if (wm2&0x80) //测试符号位
- {
- DS18B20_sign_flag=1;
- wm2=256-wm2;
- }
- else
- DS18B20_sign_flag=0;
- x = wm2*100; //字符型赋给整形,扩大100倍
- //进精度转换
- if (tempL&0x08) //提高测试精度
- {
- x=x+50;
- }
- if (tempL&0x04)
- {
- x=x+25;
- }
- if (tempL&0x02)
- {
- x=x+12;
- }
- if (tempL&0x01)
- {
- x=x+6;
- }
- convert_ds18b20();//启动温度转换
- // x=tempH*256 ;
- // x=x+ tempL;
- return(x);
- }
复制代码 18B20.H
- #ifndef __DS18B20__H
- #define __DS18B20__H
- //#include "..\..\App\includes.h"
- #include "includes.h"
- //数据线强制拉低
- #define CLR_DS18B20 GPIO_CLR(MKL_PORTA, 13)
- //数据线强制拉高,上拉
- #define SET_DS18B20 GPIO_SET(MKL_PORTA,13 )
- //输出
- #define HLD_DS18B20 GPIO_DDR_OUTPUT(MKL_PORTA,13) //M0控制总线
- //输入
- #define RLS_DS18B20 GPIO_DDR_INPUT(MKL_PORTA,13) //释放总线
- //查询
- #define STU_DS18B20 GPIO_GET_VALUE(MKL_PORTA,13) //数据线的状态
- #define ds18b20_read_rom 0x33
- #define ds18b20_match_rom 0x55
- #define ds18b20_skip_rom 0xcc
- #define ds18b20_search_rom 0xf0
- #define ds18b20_alarm_search_rom 0xec
- #define ds18b20_write_ram 0x4e
- #define ds18b20_read_ram 0xbe
- #define ds18b20_copy_ram 0x48
- #define ds18b20_convert_tem 0x44
- #define ds18b20_eecall_eeprom 0xb8
- #define ds18b20_read_power_supply 0xb4
- extern unsigned char DS18B20_sign_flag;
- void gpio_18B20(void);
- void delay_nus(unsigned int t);
- unsigned char resetDS18B20(void);
- void get_rom(unsigned char* p);
- void set_ds18b20(char th,char tl,unsigned char config);
- void convert_ds18b20(void);
复制代码
硬件连接图
|
|