找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2700|回復: 3
打印 上一主題 下一主題
收起左側

我在做環(huán)境溫度監(jiān)測系統(tǒng),可是用下面這個程序4位數(shù)碼管老是顯示8000沒有變化 怎么辦

[復制鏈接]
跳轉到指定樓層
樓主
ID:127450 發(fā)表于 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之間的浮點數(shù)轉為單個數(shù)碼,并送顯示緩沖區(qū)和返回小數(shù)點位置
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微秒的函數(shù)
void delay(unsigned char n)
{
do {  
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();  
n--;  
}while(n);
}
//DS18B20復位函數(shù)
void ow_reset(void)
{
DQ = 0;   
delay(120);   
DQ = 1;   
delay(24);   
}
//DS18B20讀位函數(shù)  
unsigned char read_bit(void)
{
unsigned char i;
  DQ = 0;   
  DQ = 1;   
  for(i=0; i<5; i++);
  return(DQ);
}
//DS18B20寫位函數(shù)
void write_bit(char bitval)
{
DQ = 0;   
if(bitval==1) DQ =1;
delay(6);   
DQ = 1;
}
//從DS18B20讀取字節(jié)函數(shù)  
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);
}
//寫字節(jié)到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終端函數(shù),每中斷一次,顯示一次數(shù)碼管  
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中斷函數(shù),每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;
}
}
//主函數(shù)
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);  
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:127450 發(fā)表于 2016-6-21 20:05 | 只看該作者
這程序網(wǎng)上找的
回復

使用道具 舉報

板凳
ID:111634 發(fā)表于 2016-6-28 22:21 | 只看該作者
DS18B20 測溫


DS18B20 測溫


Proteus仿真一下,確認有效。
實例97 DS18B20測溫.rar (51.78 KB, 下載次數(shù): 7)




以上摘自張志良編著《單片機實驗實訓100例》 ISBN 978-7-5124-1603-1,北航社出版
書中電路和程序設計有詳細說明,程序語句條條有注解。
回復

使用道具 舉報

地板
ID:127881 發(fā)表于 2016-6-28 22:35 | 只看該作者
網(wǎng)上應該可以找到可以用的程序
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表