onewire(单总线)是DALLAS公司推出的外围串行扩展总线,传输时钟信号又传输数据,而且能够进行双向通信,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。常用到单总线的器件,一般是稳定传感器,如DS18B20、DS2431。
以下是一个简单的onewire(单总线)温度测试程序,希望大家能够喜欢。
- // LCD module connections
- sbit LCD_RS at P2_0_bit;
- sbit LCD_EN at P2_1_bit;
- sbit LCD_D4 at P2_2_bit;
- sbit LCD_D5 at P2_3_bit;
- sbit LCD_D6 at P2_4_bit;
- sbit LCD_D7 at P2_5_bit;
- // End LCD module connections
- // OneWire pinout
- sbit OW_Bit at P1_2_bit;
- // end OneWire definition
- // Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
- // 18S20: 9 (default setting; can be 9,10,11,or 12)
- // 18B20: 12
- const unsigned short TEMP_RESOLUTION = 9;
- char *text = "000.0000";
- unsigned temp;
- void Display_Temperature(unsigned int temp2write) {
- const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
- char temp_whole;
- unsigned int temp_fraction;
- // check if temperature is negative
- if (temp2write & 0x8000) {
- text[0] = '-';
- temp2write = ~temp2write + 1;
- }
- // extract temp_whole
- temp_whole = temp2write >> RES_SHIFT;
- // convert temp_whole to characters
- if (temp_whole/100)
- text[0] = temp_whole/100 + 48;
- else
- text[0] = '0';
- text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
- text[2] = temp_whole%10 + 48; // Extract ones digit
- // extract temp_fraction and convert it to unsigned int
- temp_fraction = temp2write << (4-RES_SHIFT);
- temp_fraction &= 0x000F;
- temp_fraction *= 625;
- // convert temp_fraction to characters
- text[4] = temp_fraction/1000 + 48; // Extract thousands digit
- text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
- text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
- text[7] = temp_fraction%10 + 48; // Extract ones digit
- // print temperature on LCD
- Lcd_Out(2, 5, text);
- }
- void main() {
- Lcd_Init(); // Initialize LCD
- Lcd_Cmd(_LCD_CLEAR); // Clear LCD
- Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
- Lcd_Out(1, 1, " Temperature: ");
- // Print degree character, 'C' for Centigrades
- Lcd_Chr(2,13,223); // different LCD displays have different char code for degree
- // if you see greek alpha letter try typing 178 instead of 223
- Lcd_Chr(2,14,'C');
- //--- main loop
- do {
- //--- perform temperature reading
- Ow_Reset(); // Onewire reset signal
- Ow_Write(0xCC); // Issue command SKIP_ROM
- Ow_Write(0x44); // Issue command CONVERT_T
- Delay_us(120);
- Ow_Reset();
- Ow_Write(0xCC); // Issue command SKIP_ROM
- Ow_Write(0xBE); // Issue command READ_SCRATCHPAD
- temp = Ow_Read();
- temp = (Ow_Read() << 8) + temp;
- //--- Format and display result on Lcd
- Display_Temperature(temp);
- Delay_ms(500);
- } while (1);
- }
复制代码 相关信息:http://www.51hei.com/bbs/dpj-136722-1.html
|