数字式温度传感器:
芯片先初始化:
- UNLOCKREG(); // 芯片注册解锁
- SYSCLK->PWRCON.XTL12M_EN = 1; // 设定12M外部晶振
- DrvSYS_Delay(5000); // 等待时钟就绪
- LOCKREG(); //向“0x5000_0100”写入任何值,就可以重锁保护寄存器
然后再初始化串口:
- STR_UART_T param;
- DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); // 使能UART时钟
- DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置
- param.u32BaudRate = 115200; // 波特率
- param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
- param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
- param.u8cParity = DRVUART_PARITY_NONE; // 校验位
- param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
- param.u8TimeOut = 0; // FIFO超时设定
- DrvUART_Open(UART_PORT0, ¶m); // 串口开启、结构体整体赋值
下一步就是获取18B20的ID号:
- 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: unsigned char resetDS18B20(void)
- description :DS18B20初始化
- **********************************************************************/
- unsigned char resetDS18B20(void)
- {
- unsigned char errTime=0;
- HLD_DS18B20; //控制总线
- CLR_DS18B20; //强制拉低
- delay_nus(260); //以上延时大于480us
- SET_DS18B20;
- RLS_DS18B20; //释放总线,总线自动上拉 DDR
- delay_nus(7); //15~60us
- while (STU_DS18B20)
- {
- delay_nus(3); //5.15us
- errTime++;
- if (errTime>20)
- 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; //强制拉高
- return(0xff);
- }
下面就是一些DS18B20的常用读写操作,只要服从DATASHEET的时序规范就可以了:
|