微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51 ds18b20的Proteus仿真为什么不正确,不知道哪错了,求助‘’

51 ds18b20的Proteus仿真为什么不正确,不知道哪错了,求助‘’

时间:10-02 整理:3721RD 点击:
  #include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //温度传感器信号线
sbit dula=P2^6;//数码管选段线
sbit wela=P2^7;//数码管选位线
sbit beep=P2^3;// 蜂鸣器
uint temp;//定义整形的温度数据
float f_temp; //定义浮点型的温度数据
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//不带小数点的0-9编码
                            0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点的0-9温度编码
void delay(uint z)//延时函数
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}                                       
void dsreset(void) //ds18b20的复位,初始化
{
  uint i;
  ds=0;
  i=103;
  while(i>0)i--;
  ds=1;
  i=4;
  while(i>0)i--;
}
bit tempreadbit(void)//读一位数据函数
{
  uint i;
  bit dat;
  ds=0;i++;
  ds=1;i++;i++;
  dat=ds;
  i=8;while(i>0)i--;
  return(dat);
}
uchar tempread(void)//读一个字节数据函数
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
     j=tempreadbit();
         dat=(j<<7)|(dat>>1);//读出的数据最低为在最前面
  }
  return(dat);
}
void tempwritebyte(uchar dat)//向ds18b20写一个字节函数
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
     testb=dat&0x01;
         dat=dat>>1;
         if(testb) //写1
         {
            ds=0;
                i++;i++;
                ds=1;
                i=8;while(i>0)i--;
         }
         else          //写0
         {
            ds=0;
                i=8;while(i>0)i--;
                ds=1;
                i++;i++;
         }
  }
}
void tempchange(void)//ds18b20获取温度并转换
{
  dsreset();
  delay(1);
  tempwritebyte(0xcc);//写跳过读ROM指令
  tempwritebyte(0x44);//写温度转换指令
}
uint get_temp()        //读取寄存器中存储的温度数据
{
  uchar a,b;
  dsreset();
  delay(1);
  tempwritebyte(0xcc);
  tempwritebyte(0xbe);//读暂存器
  a=tempread();        //读低八位
  b=tempread();         //读高八位
  temp=b;  
  temp<<=8;//两个字节组合为一个字节
  temp=temp|a;
  f_temp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625
  temp=f_temp*10+0.5; //乘以10表示小数点后取一位,0.5表示四舍五入
  f_temp=f_temp+0.05;
  return temp;
}
void display(uchar num,uchar dat)//数据显示程序
{                                                                 //num表示第几个数码管,dat表示要显示的数
   uchar i;
   dula=0;
   P0=table[dat];
   dula=1;
   dula=0;
   wela=0;
   i=0XFF;
   i=i&(~((0X01)<<(num)));//只有一位为零
   P0=i;
   wela=1;
   wela=0;
   delay(1);
}
void dis_temp(uint t)  //显示温度数值函数
{
    uchar i;
        i=t/100;         //温度的十位
        display(0,i);
        i=t%100/10;         //温度的个位
        display(i,i+10);
        i=t%100%10;         //温度的小数点位
        display(2,i);
}
void warn(uint s,uchar led)//蜂鸣器报警,灯闪烁
{                                                  //s控制音调,led控制灯
  uchar i;i=s;                         
  beep=0;                                  //响
  P1=~(led);                          //灯亮
  while(i--)
  {
    dis_temp(get_temp());  //起到延时作用
  }
  beep=0;
  P1=0XFF;
  i=s;
  while(i--)
  {
    dis_temp(get_temp());
  }
}
void deal(uint t)          //温度处理函数
{
  uchar i;
  if((t>warn_l2)&&(t<=warn_l1))
  {
     warn(40,0x01);
  }
  else if(t<=warn_l2)
  {
     warn(10,0x03);
  }
  else if((t<warn_h2)&&(t>=warn_h1))
  {
     warn(40,0x04);
  }
  else if(t>=warn_h2)
  {
     warn(10,0x0c);
  }
  else
  {
      i=40;
          while(i--)
          {
            dis_temp(get_temp());
          }
  }
}
void main()
{
  uchar buff[4],i;
  dula=0;
  wela=0;
  while(1)
  {
    tempchange();         //温度转换函数
        for(i=10;i>0;i--)
        {
          dis_temp(get_temp());          //获取温度并显示
        }
        deal(temp);                                  //温度处理
        sprintf(buff,"%f",f_temp); //将浮点型温度格式化为字符型
        for(i=10;i>0;i--)
        {
          dis_temp(get_temp());         //温度显示
        }
  }
}
                 


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top