楼主调不成功主要还是时序问题,给你一个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);
- }
- }
- }
复制代码 |