找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2284|回复: 3
收起左侧

我在做环境温度监测系统,可是用下面这个程序4位数码管老是显示8000没有变化 怎么办

[复制链接]
ID:127450 发表于 2016-6-21 20:05 | 显示全部楼层 |阅读模式
#include <reg51.h>
#include <intrins.h>
sbit led0=P3^4;
sbit led1=P3^5;
sbit led2=P3^6;
sbit led3=P3^7;
sbit DQ=P2^4;   
float data TMP[2]={0,0};
unsigned char data f[2]={0,0};  
unsigned char data disp_buf[4]={0,0,0,0};
unsigned char data dot_position=0;
unsigned char data chno=0;  
unsigned char code SN[2][8]={{16, 62,148,60,0,0,0, 247},{16,229,146,60,0,0,0, 87}};
unsigned char code seg_table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x6f,0x76};
unsigned char code CH[ ]={10,11,12,13,14,15,16,17};
// 将0.00~99.9之间的浮点数转为单个数码,并送显示缓冲区和返回小数点位置
void ftochar(float valp)
{
if(valp<10.0)   
  {
   dot_position=1;  
   valp*=100.0;  
   }
else if((valp>=10.0)&&(valp<100.0))   
{               
  dot_position=2;  
  valp*=10.0;
  }
else if((valp>=100.0)&&(valp<1000.0))
dot_position=3;
disp_buf[1]=(int)valp/100;
disp_buf[2]=((int)valp%100)/10;
  disp_buf[3]=((int)valp%100)%10;
}
    //延时15微秒的函数
void delay(unsigned char n)
{
do {  
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();  
n--;  
}while(n);
}
//DS18B20复位函数
void ow_reset(void)
{
DQ = 0;   
delay(120);   
DQ = 1;   
delay(24);   
}
//DS18B20读位函数  
unsigned char read_bit(void)
{
unsigned char i;
  DQ = 0;   
  DQ = 1;   
  for(i=0; i<5; i++);
  return(DQ);
}
//DS18B20写位函数
void write_bit(char bitval)
{
DQ = 0;   
if(bitval==1) DQ =1;
delay(6);   
DQ = 1;
}
//从DS18B20读取字节函数  
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for(i=0;i<8;i++)  
{
if(read_bit()) value|=0x01<<i;
delay(11);
}
return(value);
}
//写字节到DS18B20
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++)  
{
temp = val>>i;   
temp &= 0x01;  
write_bit(temp);     

}
delay(10);
}

//读温度代码  
void  read_temp()  
{
unsigned char i,j;  
unsigned char a,b;  
int mr;
for(j=0;j<2;j++)
{  
ow_reset();
delay(20);
write_byte (0x55);
for(i=0;i<8;i++)   
{  
  write_byte(SN[j][i]);   
}

write_byte (0xbe);
a = read_byte();
b = read_byte();
mr=b*256+a;
if((mr&0xf800)!=0)
  mr=-mr+1;  
TMP[j]=mr*0.5;  
}  
}
//定时器T0终端函数,每中断一次,显示一次数码管  
void Time_disp(void) interrupt 1
{
static unsigned char dispno=0;
TH0=0xee;
TL0=0x00;
P3|=0xf0;
P0=seg_table[disp_buf[dispno]];  
if(dispno==dot_position) P0|=0x80;
switch(dispno)   
{
case 0 :  led0=0;
break;  case 1 : led1=0;
break;  case 2 : led2=0;
break;  case 3 : led3=0;
break;  
  }
dispno++;
if(dispno==4) dispno=0;
}
//定时器T1中断函数,每50ms中断一次
void Timer1(void) interrupt 3
{
static unsigned int count;
TH1=0x4c;
TL1=0x00;
count++;
if(count>=20)  
{  
count=0;
ftochar(TMP[chno]);
disp_buf[0]=CH[chno];
chno++;
if(chno==2) chno=0;
}
}
//主函数
main( )
{  
TMOD=0x11;  
EA=1;
ET0=1;
ET1=1;
TH0=0xee;
TL0=0x00;
TH1=0x4c;  
TL1=0x00;
TR0=1;
TR1=1;
do
{   
ow_reset( );
write_byte(0xcc);
write_byte(0x44);
read_temp( );  
}
while(1);  
}
回复

使用道具 举报

ID:127450 发表于 2016-6-21 20:05 | 显示全部楼层
这程序网上找的
回复

使用道具 举报

ID:111634 发表于 2016-6-28 22:21 | 显示全部楼层
DS18B20 测温


DS18B20 测温


Proteus仿真一下,确认有效。
实例97 DS18B20测温.rar (51.78 KB, 下载次数: 7)
回复

使用道具 举报

ID:127881 发表于 2016-6-28 22:35 | 显示全部楼层
网上应该可以找到可以用的程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表