微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求前辈帮忙修改下程序

求前辈帮忙修改下程序

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
#include<intrins.h> //头文件
#define uint unsigned int    //宏定义
#define uchar unsigned char
/*******定义端口******************/
sbit DQ = P3^7;              //温度传送单总线
sbit led=P0^7;            //小数点显示的控制数据线
sbit wx1=P2^0;
sbit wx2=P2^1;
sbit wx3=P2^2;
sbit wx4=P2^3;
/************共阳LED段码表*****************/
uchar code tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};
/****************定义全局变量*******************/
float temperature;
uchar tempL=0; //临时变量低位
uchar tempH=0; //临时变量高位
/************DS18B20子程序************/
//DS18B20延迟子函数
void delay1us(uint k)
{  
while(k--)               
{;}
}
//数码管扫描延时函数
void delay1ms(uint m)
  {
     uint j;
     while(m--)
{
    for(j=125;j>0;j--);
  {;}
    }
  }
//DS18B20初始化函数
void Init_DS18B20(void)
{
  uchar j=0;
  DQ = 1;          //DQ置1
  delay1us(10);        //稍作延时
  DQ = 0;          //单片机将DQ拉低
  delay1us(90);       //精确延时大于480μs
  DQ = 1;          //拉高总线
  delay1us(20);
}
//读一位数据
bit Readonebit()
{

bit bt;
DQ = 0;
delay1us(2);
DQ = 1;
    delay1us(20);
bt = DQ;
delay1us(20);
return(bt);
}
//DS18B20读一个字节
uchar Read_DS18B20(void)
{      uchar i=0;
uint time;
  uchar dat;  //储存读出的一个字节数据
  for (i=0;i<8;i++)
   { DQ =1;       // 先将数据线拉高
     _nop_();     //等待一个机器周期  
     DQ = 0;      //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
   _nop_();     //等待一个机器周期     
     DQ = 1;     //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
     for(time=0;time<2;time++)  ;      //延时约6us,使主机在15us内采样
    dat>>=1;
     if(DQ==1)
        dat|=0x80;  //如果读到的数据是1,则将1存入dat
  else
  dat|=0x00;//如果读到的数据是0,则将0存入dat
     for(time=0;time<8;time++);  //延时3us,两个读时序之间必须有大于1us的恢复期
     }                     
  return(dat);    //返回读出的十六进制数据
}

/*uchar Read_DS18B20(void)
{
uchar i=0,j=0;          //定义无符号字符型变量
uchar bt = 0;
for (i=8;i>0;i--)    //DS18B20读取一个字节
  {
    DQ = 1;        //将单总线DQ拉高
    delay1us(2);
    DQ = 0;        // 给脉冲信号
    delay1us(6);
    DQ = 1;
    delay1us(4);
          j = Readonebit();
          bt = (j<<7)|(bt>>1);  //循环右移1位
    delay1us(30);
     return(bt);          //返回读取的数据
   }
}*/
//DS18B20写一个字节
Write_DS18B20(uchar dat)
{    uchar i=0;
uint time;
for (i=0; i<8; i++)
   {
    DQ =1;         // 先将数据线拉高
    _nop_();      //等待一个机器周期  
    DQ=0;          //将数据线从高拉低时即启动写时序      
    DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
                       //并将其送到数据线上等待DS18B20采样
   for(time=0;time<10;time++)
       ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
    DQ=1;          //释放数据线      
    for(time=0;time<1;time++)
     ;//延时3us,两个写时序间至少需要1us的恢复期
    dat>>=1;       //将dat中的各二进制位数据右移1位
   }
   for(time=0;time<4;time++)
               ; //稍作延时,给硬件一点反应时间
}
/*void Write_DS18B20(uchar bt)
{
  uchar i=0;
    bit testb;
  for (i=8; i>0; i--)
  {
    DQ = 0;           //拉低单总线DQ
   DQ = bt&0x01;    //将要写入的数据的1位传送到单总线上
     delay1us(15);    //延时一段时间
   bt>>=1;         //右移1位,传下1位数据
    if(testb!=0)
  {
   DQ=0;
   delay1us(4);
   delay1us(4);
   DQ=1;
   delay1us(50);                       
  }
  else
  {
   DQ=0;
   delay1us(50);                     
   DQ=1;
   delay1us(4);
   delay1us(4);
  }
}
  DQ = 1;          //释放单总线
delay1us(4);
}*/
//读取DS18B20当前温度
float ReadTemp(void)
{

Init_DS18B20();         //DS18B20芯片初始化
Write_DS18B20(0xCC);    // 跳过读序列号的操作
Write_DS18B20(0x44);  // 启动温度转换
delay1us(125);             //延时等待温度转化完毕
Init_DS18B20();         //重新对DS18B20芯片进行初始化
Write_DS18B20(0xCC);  //跳过读序列号的操作
Write_DS18B20(0xBE);    //读取温度寄存器中的数据,前两个数据就是所要的温度
delay1us(100);             //延时等待
tempL=Read_DS18B20();         //读取温度值低位
    tempH=Read_DS18B20();     //读取温度值高位   
temperature=((tempH*256)+tempL)*0.0625; //温度转换
    delay1us(200);
    return(temperature);
}
/************显示子程序************/
void display(int k)
  {
   wx1=1;
     P0=tab[k/100];
       delay1ms(1);
         P2=0x00;
   wx2=1;
     P0=tab[k%100/10];
   led = 0;
       delay1ms(1);
         P2=0x00;
   wx3=1;
     P0=tab[k%10];
       delay1ms(1);
         P2=0x00;
   wx4=1;
     P0=tab[12];
       delay1ms(1);
         P2=0x00;
}
/************主函数************/
void main()
{   float i;
// Init_DS18B20( );      //DS18B20初始化
   
while(1)
    {
      i=ReadTemp();
         display(i);
     }
}


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

网站地图

Top