找回密码
 立即注册

QQ登录

只需一步,快速开始

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

各位大声快来帮我看一下,我这个程序是哪里出现问题了?谢谢啦

[复制链接]
跳转到指定楼层
楼主
ID:70508 发表于 2015-10-17 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题:就在程序最后那个if语句,如果  if(25<TN)  led0=0;
                                                                  else
                                                                      led0=1;单片就能正常显示,
但是我想分(22<TN<25),(25<=TN<28),(TN>28),这几个段,就不能正常显示了,确定用的if嵌套没错啊?
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int;
unsigned char code digit[11]={"0123456789-"};
unsigned char code shuoming[]={"Now temperature:"};
unsigned char code error[]={"DS18B20 Error"};
unsigned char code error0[]={"please check"};
unsigned char code temp[]={"wendu:"};
unsigned char code danwei[]={"cent"};
unsigned char flag,tltemp;
unsigned char b=0,s=0,g=0;
sbit jdq=P3^7;
sbit fmq=P3^6;
sbit led=P1;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
/*显示模块程序*/
sbit RS=P2^0; //数据(RS=1),命令(RS=0)选择端
sbit RW=P2^1; //读(RW=1)写(RW=0)选择端
sbit E=P2^2;
sbit BF=P0^7;

void delay500us()
{
        unsigned int i;
        for(i=1;i<57;i++);
}
void delayms()//延时1ms
{
   unsigned char i,j;
   for(i=0;i<4;i++)
     for(j=0;j<33;j++);
}

void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
    delayms();
}
bit panduan(void)  //判断显示器是否在忙碌中状态
{
   bit result;
   RS=0;
   RW=1;
   E=1;
   _nop_();        //空操作
   _nop_();
   _nop_();
   _nop_();
   result=BF;
   E=0;
   return result;
}
void write0(unsigned char dictate)        //写指令
{
while(panduan()==1);
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
P0=dictate;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}       
void address(unsigned char x)//显示位置确定,方法:0x80+地址码x
{
   write0(x|0x80);
}
void writedate(unsigned char y)//写数据
{        while(panduan()==1);
     RS=1;
         RW=0;
         E=0;
         P0=y;
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         E=1;
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         E=0;
         }
void chushihua(void)
{
   delay(15);
   write0(0x38);//显示模式设置,16*2,7*5点阵,8位数据接口
   delay(5);
   write0(0x38);
   delay(5);
   write0(0x38);
   delay(5);
      write0(0x0c);//显示开,有光标,光标闪烁
   delay(5);
      write0(0x06);        //光标右移,字符不移
        delay(5);
           write0(0x01);//清屏
           delay(5);
}
/*void beer()

{        unsigned char t=2000;
        while(t--)
         {
                  fmq=0;
    delay500us();
                fmq=1;
        delay500us();
        }
}  */

/*DS18B20模块*/
sbit D=P3^3;
unsigned char T;
bit chushihua0(void)//初始化DS18b20
{
  bit flag;
  D=1;
  for(T=0;T<2;T++);
  D=0;
  for(T=0;T<200;T++);
  D=1;
  for(T=0;T<10;T++);
  flag=D;
  for(T=0;T<200;T++);
  return(flag);
}
unsigned char readchar(void)//读数据
{
unsigned char i=0;
unsigned char dat;//储存读出的数据
  for(i=0;i<8;i++)
   {
         D=1;
         _nop_();
         D=0;
         _nop_();
         D=1;
         for(T=0;T<2;T++);//延时6秒
         dat>>=1;
         if(D==1)
         dat|=0x80;
         else
         dat|=0x00;
         for(T=0;T<8;T++);

   }
   return(dat);
   }
   writechar(unsigned char dat)//写数据;
   {
     unsigned char i=0;
         for(i=0;i<8;i++)
         {
           D=1;
           _nop_();
           D=0;
           D=dat&0x01;
                for(T=0;T<10;T++);
                D=1;
                for(T=0;T<1;T++);
                dat>>=1;
                         }
                         for(T=0;T<4;T++);
                         

         return 0;
}
void readtemp(void)//读温度;
{
   chushihua0();
   writechar(0xCC);
   writechar(0x44);
   delay(200);
   chushihua0();
   writechar(0xCC);
   writechar(0xBE);
}
/*以下是与温度的显示有关的程序*/
void display_xerror(void) //没有检测到温度时的显示
{
   unsigned char i;
      address(0x00);
         
          i=0;
                  while(error[i]!='\0')//"\0"数组结束标志
                   {  writedate(error[i]);
                          i++;//显示完每一个字母(DS18B20 Error)
                          delay(100);
                   }
                   address(0x40);
                   i=0;
                   while(error0[i]!='\0')//"\0"数组结束标志
                   {  
                      writedate(error0[i]);
                          i++;//显示完每一个字母(please check)
                          delay(100);
                   }
                   while(1);
}
void display_symbol(void) //显示“wendu”
{
    unsigned char i;
        address(0x40);
        i=0;
        while(temp[i]!='\0')//只要没有写到结束标志,就继续写;
        {
          writedate(temp[i]);
          i++;
          delay(50);

        }
}
void display_explain(void)//显示说明;
{
  unsigned char i;
  address(0x00);
  i=0;
  while(shuoming[i]!='\0')
  {
  writedate(shuoming[i]);
  i++;
  delay(100);
  }
}
void display_dot(void)//显示小数点
{
  address(0x49);
  writedate('.');
  delay(50);
}
void display_cent(void)        //显示单位;
{
   unsigned char i;
   address(0x4c);
   i=0;
   while(danwei[i]!='\0')
   {
     writedate(danwei[i]);
         i++;
         delay(50);

   }
}

void display_zheng(unsigned char x)//显示整数部分
{

  b=x/100;
  s=(x%100)/10;
  g=x%10;
  address(0x46);


     if(flag==1)
  {
    writedate(digit[10]);
        }
        else
        {
        writedate(digit[b]);
        }
        writedate(digit[s]);
       
        writedate(digit[g]);
        delay(50);
         

}
void display_xiao(unsigned char x)//显示小数部分
{
  address(0x4a);
  writedate(digit[x]);
  delay(50);
}
    unsigned char TL;//储存暂存器的低位
        unsigned char TH;//储存暂存器的高位
        unsigned char TN;//储存暂存器的整数部分
    unsigned char TD;//储存暂存器的小数部分

void main(void)
{
           //led=1;
    chushihua();
        delay(5);
        if(chushihua0()==1)
        display_xerror();
        display_explain();
        display_symbol();
        display_dot();
        display_cent();


        while(1)
        {
       flag=0;
           readtemp();
           TL=readchar();
           TH=readchar();
          
           if((TH&0xf8)!=0x00)
           {
            flag=1;
                TL=~TL;
                TH=~TH;
                tltemp=TL+1;
                TL=tltemp;
                if(tltemp>255)
                     TH++;
                TN=TH*16+TL/16;
                TD=(TL%16)*10/16;
                          
           }
           TN=TH*16+TL/16;
           TD=(TL%16)*10/16;
           display_zheng(TN);
           display_xiao(TD);
           delay(10);
           if(25<TN)
            led0=0;
                    else
                  led0=1;

                     
                 
        }
}




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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