如图,用的是下载来的资料自己焊了个板子,但是程序烧进去之后一直显示0.0
求做过这个实验的老哥帮忙看看程序
主程序:
- main()
- {
- init_various();
- while(1) //不断重复循环
- {
- 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; //先将数据线拉高
- delay_16us(1); //稍作延迟
- DQ_PIN = LOW; //将数据线拉低
- delay_16us(30); //延时600us
- DQ_PIN = HIGH; //将数据线再次拉高
- delay_16us(5); //延时80us
- if(!DQ_PIN) //判断如果读到数据线低电平则初始化成功
- {
- delay_16us(30); //延时420us
- return 1;
- }
- else
- return 0;
- }
- /************************************************
- * 函数名称:ds18b20_write_byte
- * 功能描述:DS18B20写数据
- *************************************************/
- void ds18b20_write_byte(u8 wByte)
- {
- u8 i; //定义unsigned char类型的i
- for(i=0; i<8; i++)
- {
- DQ_PIN = LOW; //数据线拉低
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP();
- NOP(); //进行延时
- DQ_PIN = wByte & 0x01; //按低位到高位写数据(每次一位)
- NOP();
- NOP();
- NOP();
- NOP();
- NOP(); //延时
- DQ_PIN = HIGH; //数据线拉高
- NOP();
- NOP();
- NOP();
- wByte >>= 1; //要写入的数据右移一位后在下一循环写入
- }
- }
- /************************************************
- * 函数名称:ds18b20_read_byte
- * 功能描述:DS18B20读数据
- *************************************************/
- u8 ds18b20_read_byte(void)
- {
- u8 rByte; //存放所读出的数据
- u8 i;
- for(i=0; i<8; i++)
- {
- DQ_PIN = LOW;
- NOP();
- NOP();
- rByte >>= 1; //将上次所读数据右移一位,以下一循环读取数据
- 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; //将所读字节送回
- }
- /************************************************
- * 函数名称: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); //发送温度转化命令
- delay_16us(30);
- if(ds18b20_reset() == 0) //再次复位
- return 0;
- ds18b20_write_byte(0xcc); //忽略ROM
- ds18b20_write_byte(0xbe); //读寄存器,共九字节,前两字节为转换值
- Temp = ds18b20_read_byte();
- Temp |= ds18b20_read_byte() << 8;
- return Temp;
- }
- 中断:
- #include <reg52.h>
- #include "device_init.h"
- #include "ds18b20.h"
- /************************************************
- * 函数名称:init_c51
- * 功能描述:定时器的初始化设置
- *************************************************/
- void init_c51(void)
- {
- TMOD = 0x01; //选择工作方式,定时方式,16位计数器
- TH0 = TH0HIGH;
- TL0 = TL0LOWW; //给定时器赋值,先装高位后装低位
- ET0 = 1; //允许IT0中断
- TR0 = 1; //启动定时器T0
- }
- /************************************************
- * 函数名称: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};//小数表
- 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;
- /************************************************
- * 函数名称:dynamic_display
- * 功能描述:动态显示
- *************************************************/
- 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;
- }
- /************************************************
- * 函数名称:set_temp_data
- * 输 入:
- * 输 出:
- * 功能描述:
- *************************************************/
- void set_temp_data(void)
- {
- u16 TempData;
- float Temp;
- u8 Negative;
- s8 i;
- TempData = ds18b20_get_temp(); //度温度数据
- /* 小于零 */
- if(TempData & 0xf000)
- {
- TempData = ~TempData + 1;
- TempData &= 0x0fff;
- Negative = 1;
- }
- /* 大于零 */
- else
- {
- Negative = 0;
- }
- Temp = (TempData >> 4) * 10; //温度读数乘以精度(0.0625),显示小数点一位,所以乘以10
- Temp = Temp + float_tab[(TempData & 0x000f)] + 0.5; //加上小数部分,四舍五入所以加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;
- }
- }
- }
- }
复制代码 |