数码管显示DS18B20温度
从DS18B20读取的温度数据,共有11bit:BIT10~BIT0。
每一位,都代表一种十进制数:
BIT0为1,就代表:0.0625;
BIT1为1,就代表:0.125;
BIT2为1,就代表:0.25;
……
为0就是代表0。
本程序,就是分别判断 BIT0、BIT1、...BIT10,
如果为1则然后在十进制数中,分别加上625、125、25...。
如下就是判断 BIT0 的:
if(temper & BIT0)
{
dN[0] = 5;
dN[1] = 2;
dN[2] = 6;
}
如下就是判断 BIT1 的:
if(temper&BIT1)
{
dN[1] += 5;
dN[2] += 2;
dN[3] += 1;
}
……
说实话,还从来没有见过有谁,竟能编写出来这么笨的程序。
//DS18B20的读写程序,数据脚P2.7 //
//温度传感器18B20汇编程序,采用器件默认的12位转化 //
//最大转化时间750微秒,显示温度-55到+125度,显示精度 //
//为0.1度,显示采用4位LED共阳显示测温值 //
//P0口为段码输入,P34~P37为位选 //
/***************************************************/
#include "reg51.h"
#include "intrins.h" //_nop_();延时函数用
#define Disdata P0 //段码输出口
#define discan P2 //扫描口
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^2; //温度输入口
sbit DIN=P0^7; //LED小数点控制
uint h;
uint temp;
//
//
//**************温度小数部分用查表法***********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳LED段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
//
//
//
/*****************11us延时函数*************************/
//
void delay(uint t)
{
for (;t>0;t--);
}
//
/****************显示扫描函数***************************/
scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
Disdata=dis_7[display[k]]; //数据显示
if (k==1){DIN=0;} //小数点显示
discan=scan_con[k]; //位选
delay(300);
P2=0xff;
}
}
//
//
/****************DS18B20复位函数************************/
ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delay(50); //550 us
DQ=1;
delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
}
//
//
/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void write_byte(uchar val)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_(); //从高拉倒低
DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
delay(1);
}
//
/****************DS18B20读1字节函数************************/
//从总线上取1个字节
uchar read_byte(void)
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
delay(6); //66 us
}
DQ=1;
return(value);
}
//
/****************读出温度函数************************/
//
read_temp()
{
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的第字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}
//
/****************温度数据处理函数************************/
//二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分
/********************************************************/
work_temp(uint tem)
{
uchar n=0;
if(tem>6348) // 温度值正负判断
{tem=65536-tem;n=1;} // 负温度求补码,标志位置1
display[4]=tem&0x0f; // 取小数部分的值
display[0]=ditab[display[4]]; // 存入小数部分显示值
display[4]=tem>>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存
display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
/******************符号位显示判断**************************/
if(!display[3])
{
display[3]=0x0a; //最高位为0时不显示
if(!display[2])
{
display[2]=0x0a; //次高位为0时不显示
}
}
if(n){display[3]=0x0b;} //负温度时最高位显示"-"
}
//
//
/****************主函数************************/
main()
{
Disdata=0xff; //初始化端口
discan=0xff;
for(h=0;h<4;h++) //开机显示"0000"
{display[h]=0;}
ow_reset(); //开机先转换一次
write_byte(0xcc); //Skip ROM
write_byte(0x44); //发转换命令
for(h=0;h<100;h++) //开机显示"0000"
{scan();}
while(1)
{
work_temp(read_temp()); //处理温度数据
scan(); //显示温度值
}
}
//
//***********************结束**************************//
没有你的硬件,用PROTEUS仿真了一个显示电路,见插图。
稍稍改了一下程序,显示效果不错,数值随着温度调整,可以发生变化。
……
temp = TMPH;
temp <<= 8;
temp = temp | TMPL;
tt = temp * 0.0625;
a = tt * 10000;
a = a + 1235; //加上了四位小数
//温度百位
P2 = 255; //先消隐
P0 = table1[a / 1000000];
P2 = 255 - 0x80; delayms(5); //延时5ms
//温度十位
P2 = 255; P0 = table1[a % 1000000 / 100000];
P2 = 255 - 0x40; delayms(5);
//温度个位,此位带小数点
P2 = 255; P0 = table2[a % 1000000 / 10000 % 10];
P2 = 255 - 0x20; delayms(5);
//温度十分位
P2 = 255; P0 = table1[a % 1000000 / 1000 % 10];
P2 = 255 - 0x10; delayms(5);
//温度百分位
P2 = 255; P0 = table1[ a % 1000000 / 100 % 10];
P2 = 255 - 8; delayms(5);
//温度千分位
P2 = 255; P0 = table1[a % 1000000 / 10 % 10];
P2 = 255 - 4; delayms(5);
//温度万分位
P2 = 255; P0 = table1[a % 1000000 % 10];
P2 = 255 - 2; delayms(5);
}
}
完整才好改点,不完整的话,想调试一下有些程序还得添啊
刚刚编译你的完整程序,有问题没有通过(你怎么都可以弄进去运行了呢?):
//温度十位
P2=1;
P0=table1[a%1000000/100000];//table[a%1000000/100000]; //table1或者table2,没有table
delayms(5);
//温度个位,此位带小数点
口袋妖怪白金中文版有金手指吗?
按Add new,然后会出现个小窗口,小窗口有两个空白框,把你要用的金手指代码复制,然后粘贴在大的空白框里面,然后把Action Repldy DS的选项选上,而小的...395 18B エンペルト396 18C ムックル397 18D ムクバード398 18E ムクホーク399 18F ビッパ400 190 ビーダル401 191 コロボーシ402 192 コロ...
口袋白金金手指(只要特定代码)
按Add new,然后会出现个小窗口,小窗口有两个空白框,把你要用的金手指代码复制,然后粘贴在大的空白框里面,然后把Action Repldy DS的选项选上,而小的...395 18B エンペルト396 18C ムックル397 18D ムクバード398 18E ムクホーク399 18F ビッパ400 190 ビーダル401 191 コロボーシ402 192 コロ...
有人知道湖南省农村信用社公开招聘今年的试卷么
48.26的压缩BCD码是( ) A.00100110B B.01100010BC.01100001B D.00100100B 49.WINDOWS中的回收站是( ) A.内存中一块区域 B.软盘中一块区域C.硬盘中一块区域 D.网络中一块区域 50.使用屏幕保程序时,下列说法正确的是( ) A.可以廷长显示器显像管的寿命 B.可以廷长硬盘的寿命C.可以廷长光驱的寿命 D....
况帜小儿: 先用一个数据变量显示不同值,确定显示部分是否正常.再确定温度正不正常.
高青县15551569668: 基于51单片机的DS18B20程序(数码管显示) - ?
况帜小儿: 参考下吧! 18B20数字温度显示系统 综合实验:用18B20(数字温度采集)74LS47(数码管译码)74LS138(三八译码) DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125...
高青县15551569668: 单片机 通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值 - ?
况帜小儿: void dsInit() //初使化DS18b20 dsWait() //等待,延时 bit readBit() //读取一bit(一位),返回值为一个bit unsigned char readByte() //读取一个字节(Byte),就是读ds18b20一个字节的信息 void writeByte(unsigned char dat) //写一个字节给ds18b20,参数就是要写进的数据 int getTmpValue() //获取温度值,这个会返回一个整型的温度值
高青县15551569668: DS18B20的温度报警标志在哪,怎么读出来如果报警了有没有什? ?
况帜小儿: DS18B20引脚定义: (1)DQ为数字信号输入/输出端;(需要加个上拉电阻加到电源上) (2)GND为电源地; (3)VDD为外接供电电源输入端(在寄生电源接线方式...
高青县15551569668: 为什么我做的DS18B20数码管显示的温度不准确? - ?
况帜小儿: 首先,要检查你的程序读出的DS18B20的温度值有没有问题,比如仿真中设定26°C,在程序中判断是不是26°C,若是,编一个简单的程序,让数码管输出1,这样就可以判定你的测温程序有没有问题.其次,最怀疑的地方就是你这个数码管的程序有问题,若你可以保证没有问题,可以排除这一块.最后,注意各个模块同一个寄存器的值是会相互影响的,存不存在一个模块破坏另一个模块寄存器值的情况.祝你成功!
高青县15551569668: DS18B20检测到的温度用数码管显示出来,用C程序写,电路图如下(数码管为共阴极). - ?
况帜小儿: 你好:我有LCD1602和LCD12864的DS1820程序,数码管的更简单,我可以给你LCD的程序,你自己修改一点.希望我的回答能帮助到你.
高青县15551569668: DS18B20温度采集器四位阴极数码管显示 - ?
况帜小儿: 你好:程序看着累.从你的描述来看,应该存在两个方面的问题:1. DS的时序问题.时序没对,读出来的值本身就不正确,更别说数值编码显示了.2. 数值编码问题.从你的程序开头的数组来看,只有数字和带小数点的数字,没有 DS的小数部分的处理数组,所以我想没有正确处理好DS返回值得小数部分.但是DS返回值得整数部分不需要处理就能显示的,而你的仿真图什么都显示错误了,所以我想最大可能还是时序问题.你若需要,我可以把我的的protues仿真图给你,还有程序,LCD1602显示.希望我的回答能帮助到你.
高青县15551569668: 郭天祥写的数码管显示ds18b20温度数值转换(msp430单片机) 哪位高手给解释一下后面的温度转换,谢谢! - ?
况帜小儿: 从DS18B20读取的温度数据,共有11bit:BIT10~BIT0.每一位,都代表一种十进制数:BIT0为1,就代表:0.0625;BIT1为1,就代表:0.125;BIT2为1,就代表:0.25;…… 为0就是代表0.本程序,就是分别判断 BIT0、BIT1、...BIT10,如果为1则...
高青县15551569668: DS18B20采集温度用4位八段数码管显示的编码 - ?
况帜小儿: /*DS18b20温度传感器 p3.4作为数据传输口 p1.0~3控制显示led的位选 共阳极 经过PNP后 低电平有效 p0口是led的字形码 晶振:11.0592M 设计者:陈仲库 设计日期:2006年3月29日*/#include//#include//#include//#include sbit DQ= P3^4; sbit p...
高青县15551569668: 关于DS18b20的问题 - ?
况帜小儿: 你接数码管的时候用手摸一下,看温度是不是能正常显示逐渐升高,然后在找个温度低的地方,放冰箱里也行.看温度会不会渐渐降低.如果不正常一定是你的程序不对,或者18B20坏了.正常的话,那就是你的显示程序没调好.