我这有个C源程序,供你参考:
三通道18B20温度测量数码管显示。-55-+125℃,用1位数码管显示当前通道号,4位数码管显示18B20当前通道温度值(一位小数),负号位与正温度百位1用同一位数码管显示,该位为0不显示,如:0 27.9、1 123.1、2 -35.6。连接方法:18B20接P3.7,P0口(JP10)接8位数码管段码口(J12)。
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit ADDR0 = P2^2;
sbit ADDR1 = P2^3;//定义38译码器地址
sbit ADDR2 = P2^4;
uint8 x,h;//定义通道
uint16 ans,ansb[3],f,g,p; //ans各通道温度值,f符号值,g为小数部分,p为1秒的计数变量
code uint8 number[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x80};//0,1,2,3,4,5,6,7,8,9,-,灭,小数点
sbit DQ = P3^7; //温度DQ一线输入口
#define nops(); {_nop_(); _nop_(); _nop_(); _nop_();} //定义空指令
uint8 romid[3][8]={//romid二维数组存放每个芯片ROM编号
{0x28,0xA2,0xb4,0x0A,0x00,0x00,0x00,0x83},//0通道
{0x28,0xA2,0xb4,0x0A,0x03,0x00,0x00,0x83},//1通道
{0x28,0xA2,0xb4,0x0A,0x05,0x00,0x00,0x83},//2通道
};
// 定时器初始化
void T1_init(void)
{
TMOD = 0x10; //定时器1工作在方式1(显示扫描定时)
TH1 = 0xfc;
TL1 = 0x67;//T1定时1ms初值
TR1 = 1;//启动T1
}
void delay(uint16 n)
{
while (n--);
}
// 18B20复位函数
void DS18b20_reset(void)
{
bit flag=1;
while (flag)
{
while (flag)
{
DQ = 1;
delay(1);
DQ = 0;
delay(50); // 550us
DQ = 1; //给18B20发出复位信号
delay(6); // 66us
flag = DQ; //检测18B20发出的存在脉冲"0",判断复位是否成功
}
delay(45); //延时500us
flag = ~DQ; //18B20存在脉冲过后变"1",取反后仍为"0"
}
DQ=1;
}
//18B20写1个字节函数 * 向1-WIRE总线上写一个字节
void write_byte(uint8 val)
{
uint8 i;
for (i=0; i<8; i++)
{
DQ = 1;
_nop_();
DQ = 0;
nops(); //4us,11.0592晶振时每个时钟周期约1us
DQ = val & 0x01; //最低位移出
delay(6); //66us
val >>= 1; //右移一位
}
DQ = 1;
delay(1);
}
//18B20读1个字节函数 * 从1-WIRE总线上读取一个字节
uint8 read_byte(void)
{
uint8 i, value=0;
for (i=0; i<8; i++)
{
DQ=1;
_nop_();
value >>= 1;
DQ = 0;
nops(); //4us
DQ = 1;
nops(); //4us
if (DQ)
value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
// 启动温度转换
void start_temp_sensor(void)
{
DS18b20_reset();
write_byte(0xCC); // 发Skip ROM命令
write_byte(0x44); // 发转换命令
}
// 读出温度,多点多个18B20测温主程序:
void read_temp() //读取通道x的温度值
{
uint8 i,temp_data[2];//读出温度暂放
uint16 temp;
for(x=0;x<3;x++)
{
DS18b20_reset(); //复位
write_byte(0x55); // 发匹配ROM命令
for(i=0;i<8;i++)
write_byte(romid[x][i]);//写8位器件ID(从左到右),如:28 A2 b4 0A 03 00 00 83。
write_byte(0xBE);//读RAM命令,共9个字节,只取前两温度字节
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
temp=temp_data[1];//温度高字节
temp=temp<<8;//移到高8位中
temp+=temp_data[0];//温度低字节
ansb[x]=temp;
}
}
// 刷新5位数码管程序
void refresh()
{
static uint8 j = 0,a;//j为数码管位数,a为临时存放红外数据高或低4位
P0 = 0x00;//防止重影
switch(j)
{
case 0: ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;j++;//最右边一位数码管,一位小数
a=g*625/1000;//只取小数点后一位,*625把16进制换算成对应的10进制
P0 = number[a];break;
case 1: ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;j++;
a = ans%10;//取个位
P0 = number[a];break;
case 2: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j++;
a = ans/10%10;//取十位
P0 = number[a];break;
case 3: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;
a = ans/100%10;//取百位
if (f!=0){a=10;}//若为负显示-号
else if (a!=1){a=11;}//若小于100度该位熄灭
P0 = number[a];break;//为1则正常显示
case 4: ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;j++;
a = 12;//个位显示小数点
P0 = number[a];break;
case 5: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j=0; //通道显示
P0 = number[h];break;//显示通道号
default: break;
}
}
main()
{
T1_init();//定时器初始化
while(1)
{
if(TF1==1)
{
TF1 = 0;
TH1 = 0xfc;
TL1 = 0x67;
start_temp_sensor();//启动温度转换
p++;
if(p==1000)// 延时约1秒
{
read_temp();//读各通道温度值
switch(h)
{//切换温度显示通道
case 0: ans=ansb[1];h++;break;//1通道
case 1: ans=ansb[2];h++;break;//2通道
case 2: ans=ansb[0];h=0;break;//0通道
default: break;
}
f=ans&0xF800;//取符号位
g = ans&0x000f;//取小数部分
ans>>=4;//去除小数部分
if (f!=0)
{
ans=~ans+1;
}
p=0;
}
refresh();
}
}
}
温馨提示:内容为网友见解,仅供参考
请那位高手给我一份中文ds18b20数字温度传感器资料
传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果[7]。美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只...
请那位高手给我一份中文ds18b20数字温度传感器资料
1、传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果[7]。2、DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字...
单片机18b20的资料
(4)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。 测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接...
我要用DS18B20测量温度,大约1分钟测一次,而同时还要保持没10ms发送一...
我的基本思路是,DS18B20的延时不要用delay,用定时器延时,定时器可以设置5us中断,然后中断里加个标志位,在DS18B20里判断标志位就可以,这样就可以1820延时的同时定时器是工作的,当然在哪开定时器哪关定时器很重要。
我要写一篇关于单片机测温的论文谁给点资料,重谢!
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A\/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,支持3V~5.5V的电压范围,使系统设计更灵活、方便;其工作电源既可在远端引入,...
单片机ds18b20测温程序,为啥数码管显示的温度是16进制,我照着别人的...
共阴极和共阳极的数码管字符编码不同的,好好检查检查你的段码数组。
数字温度传感器测温显示系统毕业设计开题报告
通过DS18B20直接读取被测温度值,进行数据转换,能够设置温度上下限来设置报警温度。并且在到达报警温度后,系统会自动报警。 本文设计是从测温电路、主控电路、报警电路等几个方面来分析说明的。该器件可直接向单片机传输数字信号,便于单片机处理及控制。另外,该温度计还能直接采用测温器件测量温度。从而简化数据传输与处理...
5、每人必须写出一份课程设计总结报告,总结报告应包含以下内容: (1...
试验过程中我们先后对串口无输出,DS18B20无法测温,CX20106A芯片不稳定,测量距离出错等一些列问题提出了解决方案和理论分析。最终我们成功的做出了我们的产品,基本上达到了设计需求。二、 选题开始时,我们选定的课题是基于超声波测距的汽车智能防护系统,在之后的学习过程中,我们发现我们的课题对于我们目前的水平来说,还是...
求:基于AT89C51单片机的多路DS18B20测温显示
我的毕设也用的18b20,可是使用stm32做mcu的。下面是我之前找的一段代码,你可以参考下。include <REGX52.H> include <intrins.h> \/\/声明_nop_() 便于实现延时 define DS18B20 P1_0 unsigned char xdata LEDSEG _at_ 0xfeff; \/\/P2.0 unsigned char xdata LEDBIT _at_ 0xfdff; \/\/P2...
我用proteus仿真在P1口读取多个DS18B20的ROM序列号都一样?
可能是你的DS18B20的序列号没有设置,读出来就一个样了!按附图的红色的地方修改序列号。你看我的图和程序有20多个的一线式芯片,读出的序列号都不同,要注意的是,每个芯片的序列号都要设置,不能重复。说明一下,这是北航《PIC16系列单片机C程序设计与PROTEUS仿真》一书中P353的例子,其中有完整...