如圖,用的是下載來的資料自己焊了個板子,但是程序燒進去之后一直顯示0.0
求做過這個實驗的老哥幫忙看看程序
仿真圖.png (125.16 KB, 下載次數(shù): 47)
下載附件
2018-1-8 18:59 上傳
主程序:
- main()
- {
- init_various();
- while(1) //不斷重復循環(huán)
- {
- if(b10msEvent)
- {
- b10msEvent = false;
- dynamic_display(); //顯示
- if(b500msEvent)
- {
- b500msEvent = false;
- set_temp_data(); //讀溫度
- }
- }
- }
- }
- /*********************************************
- * 定時器0中斷
- *********************************************/
- void timer0(void) interrupt 1
- {
- static u8 SecCount = 0;
- TH0 = TH0HIGH;
- TL0 = TL0LOWW;
- b10msEvent = true; //10毫秒中斷
- if(++SecCount == 50)
- {
- SecCount = 0;
- b500msEvent = true; //1秒到時
- }
- }
- 芯片程序:
- u8 ds18b20_reset(void)
- {
- DQ_PIN = HIGH; //先將數(shù)據(jù)線拉高
- delay_16us(1); //稍作延遲
- DQ_PIN = LOW; //將數(shù)據(jù)線拉低
- delay_16us(30); //延時600us
- DQ_PIN = HIGH; //將數(shù)據(jù)線再次拉高
- delay_16us(5); //延時80us
- if(!DQ_PIN) //判斷如果讀到數(shù)據(jù)線低電平則初始化成功
- {
- delay_16us(30); //延時420us
- return 1;
- }
- else
- return 0;
- }
- /************************************************
- * 函數(shù)名稱:ds18b20_write_byte
- * 功能描述:DS18B20寫數(shù)據(jù)
- *************************************************/
- void ds18b20_write_byte(u8 wByte)
- {
- u8 i; //定義unsigned char類型的i
- for(i=0; i<8; i++)
- {
- DQ_PIN = LOW; //數(shù)據(jù)線拉低
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP(); //進行延時
- DQ_PIN = wByte & 0x01; //按低位到高位寫數(shù)據(jù)(每次一位)
- NOP();
- NOP();
- NOP();
- NOP();
- NOP(); //延時
- DQ_PIN = HIGH; //數(shù)據(jù)線拉高
- NOP();
- NOP();
- NOP();
- wByte >>= 1; //要寫入的數(shù)據(jù)右移一位后在下一循環(huán)寫入
- }
- }
- /************************************************
- * 函數(shù)名稱:ds18b20_read_byte
- * 功能描述:DS18B20讀數(shù)據(jù)
- *************************************************/
- u8 ds18b20_read_byte(void)
- {
- u8 rByte; //存放所讀出的數(shù)據(jù)
- u8 i;
- for(i=0; i<8; i++)
- {
- DQ_PIN = LOW;
- NOP();
- NOP();
- rByte >>= 1; //將上次所讀數(shù)據(jù)右移一位,以下一循環(huán)讀取數(shù)據(jù)
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- DQ_PIN = HIGH;
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- if(DQ_PIN) //如果讀到是1,rByte與0x80相與,最高位寫1
- rByte |= 0x80;
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- }
- DQ_PIN = HIGH;
- return rByte; //將所讀字節(jié)送回
- }
- /************************************************
- * 函數(shù)名稱:ds18b20_get_temp
- * 功能描述:讀溫度值
- *************************************************/
- u16 ds18b20_get_temp(void)
- {
- u16 Temp; //定義unsigned short類型變量temp
- if(ds18b20_reset() == 0) //若復位程序傳回值是0則證明沒有成功復位
- return 0;
- ds18b20_write_byte(0xcc); //忽略ROM
- ds18b20_write_byte(0x44); //發(fā)送溫度轉(zhuǎn)化命令
- delay_16us(30);
- if(ds18b20_reset() == 0) //再次復位
- return 0;
- ds18b20_write_byte(0xcc); //忽略ROM
- ds18b20_write_byte(0xbe); //讀寄存器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值
- Temp = ds18b20_read_byte();
- Temp |= ds18b20_read_byte() << 8;
- return Temp;
- }
- 中斷:
- #include <reg52.h>
- #include "device_init.h"
- #include "ds18b20.h"
- /************************************************
- * 函數(shù)名稱:init_c51
- * 功能描述:定時器的初始化設置
- *************************************************/
- void init_c51(void)
- {
- TMOD = 0x01; //選擇工作方式,定時方式,16位計數(shù)器
- TH0 = TH0HIGH;
- TL0 = TL0LOWW; //給定時器賦值,先裝高位后裝低位
- ET0 = 1; //允許IT0中斷
- TR0 = 1; //啟動定時器T0
- }
- /************************************************
- * 函數(shù)名稱:init_various
- * 功能描述:中斷設置
- *************************************************/
- void init_various(void)
- {
- EA = 0; //關閉總中斷允許
- init_c51(); //進行定時器初始化設置并啟動定時器
- ds18b20_reset(); //DS18B20初始化設置
- ds18b20_get_temp(); //獲取溫度
- EA = 1; //開總中斷
- }
- 顯示程序:
- #include <reg52.h>
- #include "typedef.h"
- #include "device_init.h"
- #include "ds18b20.h"
- code u8 float_tab[16] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小數(shù)表
- code u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff, 0xbf}; //字形表
- u8 DisNum[4] = {0x0a, 0x0a, 0x00, 0x00};
- u8 DisPosition = 0;
- /************************************************
- * 函數(shù)名稱:dynamic_display
- * 功能描述:動態(tài)顯示
- *************************************************/
- void dynamic_display(void)
- {
- static u8 DisPinOn = 0x01;
- DisPinOn <<= 1;
- if(DisPinOn == 0x10)
- {
- DisPosition = 0;
- DisPinOn = 0x01;
- }
- DIS_DAT = 0xff;
- DIS_POS = DisPinOn;
- DIS_DAT = DisCode[DisNum[DisPosition++]];
- if(DisPinOn == 0x04)
- DIS_DAT &= 0x7f;
- }
- /************************************************
- * 函數(shù)名稱:set_temp_data
- * 輸 入:
- * 輸 出:
- * 功能描述:
- *************************************************/
- void set_temp_data(void)
- {
- u16 TempData;
- float Temp;
- u8 Negative;
- s8 i;
- TempData = ds18b20_get_temp(); //度溫度數(shù)據(jù)
- /* 小于零 */
- if(TempData & 0xf000)
- {
- TempData = ~TempData + 1;
- TempData &= 0x0fff;
- Negative = 1;
- }
- /* 大于零 */
- else
- {
- Negative = 0;
- }
- Temp = (TempData >> 4) * 10; //溫度讀數(shù)乘以精度(0.0625),顯示小數(shù)點一位,所以乘以10
- Temp = Temp + float_tab[(TempData & 0x000f)] + 0.5; //加上小數(shù)部分,四舍五入所以加0.5
- TempData = Temp;
- for(i=3; i>=0; i--)
- {
- DisNum[i] = TempData % 10;
- TempData /= 10;
- }
- for(i=0; i<2; i++)
- {
- if(DisNum[i] != 0)
- {
- break;
- }
- else
- {
- DisNum[i] = 0x0a; //前面為0不顯示
- }
- }
- /* 顯示負號 */
- if(Negative == 1)
- {
- for(i=2; i>=0; i--)
- {
- if(DisNum[i] == 0x0a)
- {
- DisNum[i] = 0x0b; //'-'
- break;
- }
- }
- }
- }
復制代碼 |