2669|5

23

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

仿真了下18b20,都显示出来了,加了4个模块后,一段时间,? [复制链接]

#include
#include
#include
#define uchar  unsigned char
#define uint   unsigned int
static   uchar  th,tl,b,c,d,f,j,e;
   uint a, temp;
sbit morehigh=P1^0 ;
sbit high=P1^1 ;
sbit low=P1^2 ;
sbit morelow=P1^3 ;
sbit R=P2^3;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit speak=P2^5;
sbit di=P2^4;
sbit close=P2^6;
sbit open=P2^7;
unsigned char  time ;
void  motor();
void motor1();
void rotate();
unsigned char code table[]={"0123456789.:'C"};
unsigned char code table1[]={"temp:"};
unsigned char code table2[]={"the angular is "};
unsigned char code error[]={"    error!"};
unsigned char code table4[]={"the angular is "};
void delay1us(unsigned char x)
{
uint i;
x*=5/4;
  for(i=0;i }      
void delay1ms()
{ unsigned int x,y; for(x=0;x<10;x++) for(y=33;y>0;y--); }
void delay(unsigned int z)
{ unsigned char x; for(x=z;x>0;x--)   delay1ms();}
  void change();

void write_com(unsigned char com)
  {
lcdrs=0;  
             SBUF=com;         //       原来并行通信时,  这条 是  P1=com;         
       // P1=com;         
          while(TI==0);TI=0;  //   这条 是我改过的, 原来并行通信时,这条 是没有的  
delay(5);
lcden=1;
delay(5);
lcden=0;
   }
void write_data(unsigned char dat)
{
lcdrs=1;      
             SBUF=dat;            //     原来并行通信时,  这条 是  P1=com;
             while(TI==0);TI=0;        //     这条 是我改过的, 原来并行通信时,这条 是没有的  
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init(void)
{
            lcden=0;
         lcdrw=0;
write_com(0x01);   
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
}

   /*DS18b20操作program*/
bit datayn(void)       //初始化设置
    {
  bit flag;
  di=1;
  for(time=0;time<2;time++);
  di=0;
  for(time=0;time<200;time++);  
  di=1;
for(time=0;time<10;time++);
  flag=di;
for(time=0;time<100;time++);
   di=1;
for(time=0;time<10;time++);
  return(flag) ;
     }
void Delayxus_DS18B20(unsigned int t)
    {
          for(t;t>0;t--)
          {
                 _nop_();_nop_();_nop_();_nop_();
          }     
          _nop_(); _nop_();
    }
unsigned char Read_Bit()
    {
          unsigned char ret;
          di=0;//拉低总线
          _nop_(); _nop_();   
          di=1;//释放总线      
        //  _nop_(); _nop_();
        //  _nop_(); _nop_();
          ret=di;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性
          Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求
      di=1;//释放总线
          return ret; //返回读取到的数据
    }

uchar read_onechar(void)
      {
          unsigned char i;
          unsigned char dat=0;
       for(i=0;i<8;i++)
          {
          dat>>=1; //先读最低位
          if(Read_Bit())
                 dat|=0x80;
          }
          return(dat);
    }
  void write_onechar(uchar dat)
{
  uchar i,time;
      di=1; _nop_();
     for(i=0;i<8;i++)
     {
       di=0;  // delay1us(2); //for(time=0;time<4;time++);
        di=dat&0x01; delay1us(20);  // for(time=0;time<10;time++);
     di=1;
    _nop_(); //_nop_();
     dat>>=1;
     }
   for(time=0;time<2;time++);
}
void display(void)
{
  unsigned int i=0;
  write_com(0x80);
  if(datayn()==1)
    {
     while(error!='\0')
            {
            write_data(error);
            i++;
            }
    }
   else
     {
       while(table1!='\0')
        {
          write_data(table1);
          i++;
        }
     }
}
void readtemp()
   {
  
      di=1;_nop_();_nop_();
     datayn();
     write_onechar(0XCC);
     write_onechar(0x44);
     for(time=0;time<100;time++);
     datayn();
     write_onechar(0XCC);
     write_onechar(0XBE);
   for(time=0;time<200;time++);
  tl=read_onechar(); th=read_onechar();
//  while ((tl>>4|th<<4)==85);  
     di=1; _nop_();    _nop_();  //   nop_();
      if (th>>4==0)
    {
       e=1;
          a=tl>>4|th<<4;
        b=a/100;c=(a%100)/10;d=a%10;
        j=tl&0x0f;f=(j*10/16)%10;
       write_com(0x85); write_data('\0');
     }
    else
     {
      e=0;
      temp=(~(tl|th<<8)+1);temp*=0.0625;b=temp/100;c=temp/10%10;d=temp%10;f=(temp*10)%10;
      write_com(0x85); write_data('-');
     }           
     write_com(0x86); write_data(table);write_data(table[c]);
     write_data(table[d]);write_data(0x2e);write_data(table[f]);
     write_data(table[12]);write_data('c');
    }
void main()
{
      
SCON=0x00;           
R=0; _nop_(); _nop_(); R=1;         
   init();  
  display();
  while(1)
  {  
   readtemp();
   motor();
   motor1();
    rotate();
  }
}
void motor()
{
  P0=0XFF;
// uchar t;
   while (close==0)
   {
      uchar i,t;   t=0xfe;
     while (close==0);   
        for(i=0;i<4;i++)
       {
          P0=t;
           delay(1000);
          t=_crol_(t,1);
        
        }
  }  
  while (open==0)
   {
     uchar i,t;   t=0xf7;
     while (open==0);
            
      for(i=0;i<4;i++)
       {
          P0=t;  delay(1000);t=_cror_(t,1);
         
        }
   }
}
void motor1()
{
  P1=0XFF;
   
// uchar t;
   while ( high==0)
   {
     uchar i,t;
   while (1)   
    { t=0xfe;
        for(i=0;i<4;i++)
       {
          P0=t;
           delay(100);
          t=_crol_(t,1);
        
        }
    }  
   }
  while (low==0)
   {
     uchar i,t;
    while (low==0)
     {  t=0xf7;      
      for(i=0;i<4;i++)
       {
          P0=t;
          delay(20);  t=_cror_(t,1);
      }  
      }
   }
}
   void  alarm()
   {
      uchar j=10;
       while (j--)
      {  
        speak=~speak;
        delay(30);
      }  
   }
  void rotate()
   {
   if(a>100)
   {
       uchar i,t;
      while (1)   
        { t=0xfe;
           for(i=0;i<4;i++)
         {
              P0=t;
              delay(20);
              t=_crol_(t,1);
              alarm();
          }
        }  
   }
   if(a>90&&a<100)
{
        uint uk ;
        uk=55-a;
        while (uk--)
   {
      {
      uchar i,t; t=0xfe;
         for(i=0;i<4;i++)
            {
               P0=t;
               delay(20);
               t=_crol_(t,1);
            }
       }  
   }
}
if(a>50&&a<90) P0=0xff;
if(a>40&&a<50)
   {
     uint uh ;
      uh=55-a;
      while (uh--)
       {
        {
          {
          uchar i,t; t=0xf7;
         for(i=0;i<4;i++)
            {
               P0=t;
               delay(20);
               t=_cror_(t,1);
            }
           }  
         }
      }
   }
  
if(a<40)   
        {
     uchar i,t;
             {   
               t=0xf7;      
               for(i=0;i<4;i++)
               {
                 P0=t;
                 delay(20);  t=_cror_(t,1);
                 alarm();
   }  
             }
         }
     }      

仿真了下18b20,都显示出来了,也正常,加了4个模块(根据不同的温度调试电机的转速)后,也正常,按钮也正常,一段时间后,温度反应异常了 。void motor() ,void motor1(),void  alarm(),void rotate()。前三个也没事,就是void rotate()出问题了,哪位大神看见后,帮忙分析下 怎么回事啊 ,小弟先在此谢谢了。还有就是刚开始就显示85,怎么一开始就显示正确呢  

不同温度调转速.gif (142.8 KB, 下载次数: 0)

不同温度调转速.gif
此帖出自单片机论坛

最新回复

应该是时序吧,或者在硬件上看看, proteus怎么说是个虚物。   详情 回复 发表于 2014-9-7 23:53
点赞 关注
 

回复
举报

106

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
好长,void rotate()里的 while (1)   做什么用的?为什么没跳出语句?   刚开始就显示85,那应该没什么事。
此帖出自单片机论坛

点评

首先先谢谢了, while(1) 也确实是个问题,但主要问题,在下面的 图片上,我把while改成if 好多了 但是还是存在点问题 就是显示温度是很稳定,偶尔会出现其他的温度值,我怀疑是不是串口速度问  详情 回复 发表于 2014-9-7 13:25
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
多机18b20是可以串接的软件改动下就行.
此帖出自单片机论坛

点评

我的18b20就一个呀,哥,不是很清楚你的意思  详情 回复 发表于 2014-9-7 13:27
 
 
 

回复

23

帖子

1

TA的资源

一粒金砂(中级)

4
 
刘W杰 发表于 2014-9-5 22:03
好长,void rotate()里的 while (1)   做什么用的?为什么没跳出语句?   刚开始就显示85,那应该没什么事 ...

首先先谢谢了,  while(1)  也确实是个问题,但主要问题,在下面的 图片上,我把while改成if  好多了   但是还是存在点问题    就是显示温度是很稳定,偶尔会出现其他的温度值,我怀疑是不是串口速度问题。

又不要.jpg (15.76 KB, 下载次数: 0)

又不要.jpg
此帖出自单片机论坛

点评

应该是时序吧,或者在硬件上看看, proteus怎么说是个虚物。  详情 回复 发表于 2014-9-7 23:53
 
 
 

回复

23

帖子

1

TA的资源

一粒金砂(中级)

5
 
huo_hu 发表于 2014-9-6 08:57
多机18b20是可以串接的软件改动下就行.

   我的18b20就一个呀,哥,不是很清楚你的意思
此帖出自单片机论坛
 
 
 

回复

106

帖子

0

TA的资源

一粒金砂(中级)

6
 
1322685712 发表于 2014-9-7 13:25
首先先谢谢了,  while(1)  也确实是个问题,但主要问题,在下面的 图片上,我把while改成if ...

应该是时序吧,或者在硬件上看看, proteus怎么说是个虚物。
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表