樓主調不成功主要還是時序問題,給你一個1T單片機的示例程序,是在郭天祥的12T程序基礎上改的,經過實物驗證無誤。
- //DS18b20測溫程序
- #include <STC15F2K60S2.H>
- #include <intrins.h>
- //#include <reg51.H>
- #define uchar unsigned char
- #define uint unsigned int
- //通過DS18B20測試當前環境溫度, 并通過數碼管顯示當前溫度值
- sbit wela = P2^7; //數碼管位選
- sbit dula = P2^6; //數碼管段選
- sbit ds = P2^2; //單總線通訊端口
- //0-F數碼管的編碼(共陰極)
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- //0-9數碼管的編碼(共陰極), 帶小數點
- uchar code tableWidthDot[]={
- 0xbf, 0x86, 0xdb, 0xcf,
- 0xe6, 0xed, 0xfd,
- 0x87, 0xff, 0xef};
- //1ms延時函數
- void delay() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- _nop_();
- _nop_();
- i = 11;
- j = 190;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay824us() //@11.0592MHz
- {
- unsigned char i, j;
- _nop_();
- i = 9;
- j = 218;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay34us() //@11.0592MHz
- {
- unsigned char i;
- _nop_();
- _nop_();
- i = 91;
- while (--i);
- }
- void Delay3us() //@11.0592MHz
- {
- unsigned char i;
- _nop_();
- _nop_();
- _nop_();
- i = 5;
- while (--i);
- }
- //初始化DS18B20
- //讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動
- void dsInit()
- {
- //一定要使用unsigned int型, 一個i--指令的時間, 作為與DS18B20通信的小時間間隔
- //以下都是一樣使用unsigned int型
- // uint i;
- ds = 0;
- // i = 103;
- // while(i>0) //824us
- // i--;
- Delay824us();
- ds = 1;
- Delay34us();
- // i = 4;
- // while(i>0) //34us
- // i--;
- }
- //向DS18B20讀取一位數據
- //讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,
- //之后DS18B20則會輸出持續一段時間的一位數據
- bit readBit()
- {
- // uint i;
- bit b;
- ds = 0;
- Delay3us();
- // i++;
- ds = 1;
- Delay3us();
- Delay3us();
- // i++;
- // i++;
- b = ds;
- Delay34us();
- Delay34us();
- // i = 8;
- // while(i>0)
- // i--;
- return b;
- }
- //讀取一字節數據, 通過調用readBit()來實現
- uchar readByte()
- {
- uint i;
- uchar j, dat;
- dat = 0;
- for(i=0; i<8; i++)
- {
- j = readBit();
- //最先讀出的是最低位數據
- dat = (j << 7) | (dat >> 1);
- }
- return dat;
- }
- //向DS18B20寫入一字節數據
- void writeByte(uchar dat)
- {
- // uint i;
- uchar j;
- bit b;
- for(j = 0; j < 8; j++)
- {
- b = dat & 0x01;
- dat >>= 1;
- //寫"1", 讓低電平持續2個小延時, 高電平持續8個小延時
- if(b)
- {
- ds = 0;
- Delay3us();
- Delay3us();
- // i++;// 3us
- // i++;
- ds = 1; //1us
- Delay34us();
- Delay34us();
- // i = 8; //2us
- // while(i>0) //66us
- // i--;
- }
- else //寫"0", 讓低電平持續8個小延時, 高電平持續2個小延時
- {
- ds = 0;
- Delay34us();
- Delay34us();
- // i = 8;
- // while(i>0)
- // i--;
- ds = 1;
- Delay3us();
- Delay3us();
- // i++;
- // i++;
- }
- }
- }
- //向DS18B20發送溫度轉換命令
- void sendChangeCmd()
- {
- dsInit(); //初始化DS18B20
- delay(); //延時1ms
- writeByte(0xcc); //寫入跳過序列號命令字
- writeByte(0x44); //寫入溫度轉換命令字
- }
- //向DS18B20發送讀取數據命令
- void sendReadCmd()
- {
- dsInit(); //初始化DS18B20
- delay(); //延時1ms
- writeByte(0xcc); //寫入跳過序列號命令字
- writeByte(0xbe); //寫入讀取數據令字
- }
- //獲取當前溫度值
- uint getTmpValue()
- {
- uint value; //存放溫度數值
- float t;
- uchar low, high;
- sendReadCmd();
- //連續讀取兩個字節數據
- low = readByte();
- high = readByte();
- //將高低兩個字節合成一個整形變量
- value = high;
- value <<= 8;
- value |= low;
- //DS18B20的精確度為0.0625度, 即讀回數據的最低位代表0.0625度
- t = value * 0.0625;
- //將它放大10倍, 使顯示時可顯示小數點后一位, 并對小數點后第二2進行4舍5入
- //如t=11.0625, 進行計數后, 得到value = 111, 即11.1 度
- value = t * 10 + 0.5;
- return value;
- }
- //顯示當前溫度值, 精確到小數點后一位
- void display(uint v)
- {
- uchar count;
- uchar datas[] = {0, 0, 0};
- datas[0] = v / 100;
- datas[1] = v % 100 / 10;
- datas[2] = v % 10;
- for(count = 0; count < 3; count++)
- { //片選
- wela = 0;
- P0 = ((0xfe << count) | (0xfe >> (8 - count))); //選擇第(count + 1) 個數碼管
- wela = 1; //打開鎖存, 給它一個下降沿量
- wela = 0;
- //段選
- dula = 0;
- if(count != 1)
- {
- P0 = table[datas[count]]; //顯示數字
- }
- else
- {
- P0 = tableWidthDot[datas[count]]; //顯示帶小數點數字
- }
- dula = 1; //打開鎖存, 給它一個下降沿量
- dula = 0;
- delay(); //延時1ms, 即亮1ms
- //清除段先, 讓數碼管滅, 去除對下一位的影響, 去掉高位對低位重影
- //若想知道影響效果如何, 可自行去掉此段代碼
- //因為數碼管是共陰極的, 所有滅的代碼為: 00H
- dula = 0;
- P0 = 0x00; //顯示數字
- dula = 1; //打開鎖存, 給它一個下降沿量
- dula = 0;
- }
- }
- void main()
- {
- uchar i;
- uint value;
- while(1)
- { //啟動溫度轉換
- sendChangeCmd();
- value = getTmpValue();
- //顯示3次
- for(i = 0; i < 3; i++)
- {
- display(value);
- }
- }
- }
復制代碼 |