找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2347|回复: 4
打印 上一主题 下一主题
收起左侧

程序一直报错 找不出问题 求大神帮助

[复制链接]
跳转到指定楼层
楼主
#include <at89x51.h>
#include <intrins.h>  
#define uint unsigned int
#define uchar unsigned char

sbit DQ=P2^3;//ds18b20与单片机连接口
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
uchar data disdata[5];
uint tvalue,CurrentT=0;//温度值
uchar tflag;//温度正负标志
#define LCD_BUS P0
sbit SetKey = P2^2;
sbit UpKey  = P2^1;
sbit DnKey  = P2^0;
sbit BEEP   = P2^4;
sbit Heat  = P1^0;
sbit Cool   = P1^1;
unsigned char AlarmTempLow=10,AlarmTempTop=40,Set=0,NG=0;
void delayms(uint ms)   //延时xx毫秒
{
uchar i;  while(ms--)
{
for(i=0;i<120;i++);  } }
void command(uint com)   
{
RS=0;     
LCD_BUS=com;
delayms(5);  
EN=1;
delayms(5);
EN=0;  }
void write_dat(uchar dat)   
{        RS=1;     
LCD_BUS=dat;
delayms(5);  
EN=1;
delayms(5);
EN=0;  }
void writestring (uchar x ,uchar y,uchar s)
{ if (y == 0)  command(0x80 + x);   
   else  command(0xC0 + x);
   while( s)  
{        
   write_dat( s);      } }
void writeChar (uchar x ,uchar y,uchar s)
{ if (y == 0)  command(0x80 + x);   
   else  command(0xC0 + x);
   {
   write_dat( s);
   } }

void LCD_Initial()  
{
EN=0;   
RW=0;     
command(0x38);
command(0x0c);
command(0x06);
command(0x01);
command(0x80+0x02);  }
void delay_18B20(unsigned int i)
{while(i--);}
void ds1820rst(void)
{unsigned char x=0;
DQ=1;
delay_18B20(4);
DQ=0;
delay_18B20(4);
DQ=1;
delay_18B20(4);
}
uchar ds1820rd(void)
{unsigned char i=0;unsigned char dat=0;for(i=8;i>0;i--)
{DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay_18B20(10);}
return(dat);}
void ds1820wr(uchar wdata)
{unsigned char i=0;
for(i=8;i>0;i--)
{DQ=wdata&0x01;
delay_18B20(10);
DQ=1;wdata>>=1;}
}
unsigned int Read_Temperature(void)
/*读取温度值并转换*/
{uchar a,b;         
ds1820rst();
ds1820wr(0xcc);
ds1820wr(0x44);
ds1820rst();
ds1820wr(0xcc);
ds1820wr(0xbe);
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;  
tvalue=tvalue|a;
if(tvalue<0x0fff)  
tflag=0;
else {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625);
CurrentT=tvalue;
return(tvalue);
}
void Display_Temperature()
  //显示温度
{
uchar flagdat;
disdata[0]=tvalue/1000+0x30;
disdata[1]=tvalue%1000/100+0x30;
disdata[2]=tvalue%100/10+0x30;
disdata[3]=tvalue%10+0x30;
if(tflag==0)
flagdat=0x20;
else
flagdat=0x2d;//负温度显示负号:-    //
if(disdata[0]==0x30)
{
disdata[0]=0x20;
if(disdata[1]==0x30)
disdata[0]=0x20; }
if(tflag==1)
{  
writeChar(10,0,flagdat); //
wr_com(0x8a); wr_dat(flagdat);//显示符号位   
writeChar(11,0,disdata[0]); //
wr_com(0x8b); wr_dat(disdata[0]);//显示百位  
writeChar(12,0,disdata[1]);//
wr_com(0x8c);wr_dat(disdata[1]);//显示十位   
  writeChar(13,0,disdata[2]);//wr_com(0x8d);
  wr_dat(disdata[2]);//显示个位   
  writeChar(14,0,0X2E);//
  wr_com(0x8e);wr_dat(0x2e);//显示小数点   
  writeChar(15,0,disdata[3]);//
  wr_com(0x8f);  
  wr_dat(disdata[3]);//显示小数位
   }  
  else  {writeChar (10,0,disdata[0]);//
  wr_com(0x8a);wr_dat(disdata[0]);//显示百位  
   writeChar(11,0,disdata[1]);//
   wr_com(0x8b);wr_dat(disdata[1]);//显示十位   
   writeChar(12,0,disdata[2]);//
   wr_com(0x8c);
   wr_dat(disdata[2]);//显示个位   
   writeChar(13,0,0X2e);
   wr_com(0x8d);
   wr_dat(0x2e);//显示小数点   
    writeChar(14,0,disdata[3]);
        wr_com(0x8e);
        wr_dat(disdata[3]);//显示小数位
         } }

void SetFun(void)
{
unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
if(SetKey==0)
{   delayms(20);   if(SetKey==0)   
{   if(Set<2) Set++;    else Set=0; }
switch(Set)
  {   
case 0:  writestring(0,1," ");  
writestring(8,1," ");
break;   
case 1: writestring(0,1,">");
writestring(8,1," ");
break;   
case 2: writestring(0,1," ");
writestring(8,1,">");
break;   }  
while(SetKey==0);  }
if((UpKey==0)&&(Set!=0))
{  
delayms(20);  
if(UpKey==0)  
{   
switch(Set)   
{  
case 1: if(AlarmTempLow<99)
AlarmTempLow++;
else AlarmTempLow=99;
break;   
  case 2: if(AlarmTempTop<99) AlarmTempTop++;
else AlarmTempTop=99; break;    }   
i1 = AlarmTempLow/100;  
i2 = AlarmTempLow%100/10;  
i3 = AlarmTempLow%10;   
  i4 = AlarmTempTop/100;
i5 = AlarmTempTop%100/10;  
i6 = AlarmTempTop%10;  
writestring(5,1,"   ");
writestring(13,1,"     ");  
if(i1!=0) writeChar(5,1,i1+'0');
if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
if(i1!=0) writeChar(6,1,i2+'0');
if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');  
else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');  
if((i1!=0))  writeChar(7,1,i3+'0');
if(i4!=0) writeChar(13,1,i4+'0');
if((i4==0)&&(i5!=0))
writeChar(13,1,i5+'0');   
if(i4!=0) writeChar(14,1,i5+'0');
if((i4==0)&&(i5==0)) writeChar(13,1,i6+'0');  
else if((i4==0)&&(i5!=0)) writeChar(14,1,i6+'0');
if((i4!=0)) writeChar(15,1,i6+'0');  
while(UpKey==0);   }  }
if((DnKey==0)&&(Set!=0))
{   
delayms(20);   
if(DnKey==0)  
{   
switch(Set)   
{   
case 1: if(AlarmTempLow>0) AlarmTempLow--;
else AlarmTempLow=0;
break;  
case 2: if(AlarmTempTop>0) AlarmTempTop--;
else AlarmTempTop=0; break;    }   
i1 = AlarmTempLow/100;  
i2 = AlarmTempLow%(10,0,disdata[0]);
i3 = AlarmTempLow%10;   //获得温度值的个位
i4 = AlarmTempTop/100;   //获得温度值的百位
i5 = AlarmTempTop%100/10;  //获得温度值的十位
i6 = AlarmTempTop%10;   //获得温度值的个位
writestring(5,1,"   ");
writestring(13,1,"     ");
if(i1!=0) writeChar(5,1,i1+'0');
if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
if(i1!=0) writeChar(6,1,i2+'0');
if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');
else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');
if((i1!=0))
writeChar(7,1,i3+'0');
if(i4!=0) writeChar(13,1,i4+'0');
if((i4==0)&&(i5!=0))
writeChar(13,1,i5+'0');
if(i4!=0) writeChar(14,1,i5+'0');
if((i4==0)&&(i5==0))
writeChar(13,1,i6+'0');
else if((i4==0)&&(i5!=0))
writeChar(14,1,i6+'0');
if((i4!=0))
writeChar(15,1,i6+'0');

writeChar(4,1,i1+'0');
writeChar(5,1,i2+'0');
writeChar(6,1,i3+'0');
writeChar(12,1,i4+'0');
writeChar(13,1,i5+'0');
writeChar(14,1,i6+'0');
while(DnKey==0);   }  } }
void Alarm(void)
{
if((CurrentT>(AlarmTempTop*10))||(CurrentT<(AlarmTempLow*10))||(tflag==1))  
  {    BEEP=0;   }
  else  
{    BEEP=1;   } }
void main(void)
{
unsigned char i=0;
P3=0xef;
P2=0xef;P1=0x00;BEEP=1;   
LCD_Initial();
Read_Temperature();
writestring(1,0,"DS18B20 Alarmer");   //显示“DS18B20 Alarmer”  delayms(1000);  //延时1S

writestring(0,0,"Current T=      ");   //显示“Current T= ”
}
writestring(0,1," Low=10  Top=40 ");   //显示“ Low=10  Top=40
NG=0; while(1)
{
Read_Temperature(); // //读取温度值  
Display_Temperature();  //显示温度值
SetFun();
Alarm();
if((CurrentT<(AlarmTempTop*10))&&(CurrentT>(AlarmTempLow*10)))
{   Cool=0;Heat=0;  }  
else if((CurrentT>(AlarmTempTop*10)))
{   Cool=1;Heat=0;  }
else if((CurrentT<(AlarmTempLow*10))||(tflag==1))  
{   Cool=0;Heat=1;  } }
程序一直报错  找不出问题   求大神帮助  

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:110895 发表于 2016-6-22 00:22 | 只看该作者
报的什么错?
回复

使用道具 举报

板凳
ID:135253 发表于 2016-8-5 17:03 | 只看该作者
把wr_com()函数体放在调用它的函数前面,或在前面添加wr_com()函数声明。
回复

使用道具 举报

地板
ID:111634 发表于 2016-8-6 09:44 | 只看该作者
本帖最后由 zl2168 于 2016-8-6 09:47 编辑

DS18B20 测温


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



以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

5#
ID:136169 发表于 2016-8-6 19:34 | 只看该作者
报错是什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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