⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多点测量.txt

📁 能测试温度并显示出来
💻 TXT
字号:
           #include <REG52.H>    
#include <INTRINS.H>    
#include <STRING.H>    
#include <STDIO.H>    
   
#define uchar unsigned char    
#define uint unsigned int    
   
   
/////////////////////////    
// 函数声明区    
void  init(void);         //复位    
void  delay(uchar t);     //延时time=(t+2)*5*Tm    
void  delay_ms(uchar t);       
void  write(uchar dat);   //写18b20 子程序    
uchar read(void);         //读18b20 子程序    
void  ck(uchar *s, uchar len);           //串口发送程序    
uchar readtemp(uchar n);    // 参数是DS18B20的序号    
void  display(uchar num);    // 显示一个整数    
void  initTimer(void);   
void  timerInt(void);      // 中断服务程序    
   
////////////////////////    
// 变量定义区    
sbit P07 = P0^7;   
sbit P10 = P1^4;   
   
   
sbit P24 = P2^4;   
sbit P25 = P2^5;   
sbit P26 = P2^6;   
sbit P27 = P2^7;   
   
sbit P34 = P3^4;   
static uchar rom[8];   
uchar nowdsp=0;    // 当前显示温度所对应的传感器编号    
uchar timer=0;      // 全局时钟    
uchar *out;   
uchar  xiaoshu;   
uchar  displayvalue[4]={'1','2','3','4'};   
static uchar temp[3];   
uchar code RomCode[4][8]={40,69,62,167,0,0,0,137 ,40,120,50,194,0,0,0,30,40,134,186,194,0,0,0,138,0x28,0xbb,0x13,0xdf,0x00,0x00,0x00,0x48};     
                              //3个传感器的64为序列号    
uchar ledcode[]={0xC0,0xF9,0xA4,0xB0,    
                0x99, 0x92, 0x82, 0xF8,      
                0x80, 0x90, 0x88, 0x83,   
                0xC6,0xA1,0x86, 0x8E};     // LED显示    
      
///////////////////////    
// 主函数    
main()   
{   
    uchar i;   
    init();   
    write(0x33);   
    for(i=0;i<8;i++)   
       rom[i]=read();   
    ck(rom ,8);              //读序列号    
   
/*  initTimer();  
    while(1)  
    {  
        init();   
          
        write(0xcc);     // 跳过ROM  
          
        write(0x44);      // 启动温度转换  
      
        temp[0]=readtemp(nowdsp);  
      
        display(temp[0]);  
  
      
        displayvalue[0]=temp[0]/10+0x30;  
        displayvalue[1]=temp[0]%10+0x30;  
        displayvalue[2]=xiaoshu+0x30;  
        displayvalue[3]=nowdsp+0x31;  
          
        ck(displayvalue,4);  
          
      
  
  
          
    }         
   
  
*/     
   
}   
   
   
   
   
///////////////////////    
// 函数定义区    
void init(void)       // 复位    
{   
    //display(temp[0]);    
    EA=0;       // 关闭中断    
    P10=0;           //总线为低电平    
    delay(94);      //总线复位电平保持500us    
    P10=1;          //释放总线    
    delay(12);      //保持60us    
    while(1)   
    {   
        if(P10==0)  // 等于说明存在    
          {   
               
            break;   
          }   
           
        else   
          {   
            P0=0x99;   
            P2=0x00;   
          }   
    }   
    /// 检测到后的处理    
    delay(80);   
    P10=1;    
    EA=1;       // 完成任务后允许中断    
   
}   
void write(uchar dat)      //写一个字节子程序    
{   
    uchar i=0;   
    bit b;   
    EA=0;       // 关闭中断    
   for(i=8;i>0;i--)   
   {   
     //display(temp[0]);    
     b=dat&0x01;   
     if(b==1)   
     {   // 写1    
         P10=0; // 拉低总线6us    
         _nop_();   
         _nop_();   
         _nop_();   
         _nop_();   
         _nop_();   
         _nop_();   
         P10=1;   
         delay(11);//64us    
      }   
      else   
      {   
        // 写0    
        P10=0;         //拉低60us    
        delay(10);   
        P10=1;   
        delay(0);      //10us    
      }   
     dat>>=1;   
   }    
    EA=1;       // 完成任务后允许中断    
    
}   
   
uchar read(void)           //读一个字节子程序      
{     
 uchar  dat=0 ;   
  uchar  i=0;   
    EA=0;       // 关闭中断    
  for(i=0;i<8;i++)   
    {   
     P10=0;      //拉低总线6us    
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
     P10=1;     // 释放总线9us    
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
      _nop_();   
        
     dat>>=1;   
     if(P10)   
     {   
       dat=dat|0x80;   
     }      
     delay(9);     
                 
    }   
    EA=1;       // 完成任务后允许中断    
  return(dat);   
}   
   
   
   
void ck(uchar  *s , uchar len)    //     串口初始化发送子程序    
{      
    uchar j;   
    TMOD=0x21;   
    SCON=0x50;   
//  PCON=0x80;    
    TH1=0xF3;   
    TL1=0xF3;   
    TR1=1;   
    if(len==0)len=strlen(s);   
    //display(temp[0]);    
    for(j=0;j<LEN;J++ i="0;" } temp[i]="read();" { for(i="0;i<t;i++)" 读入暂存 write(0xbe); write(RomCode[n][i]); 匹配rom write(0x55); init(); 关闭中断 EA="0;" uchar n) readtemp(uchar while(k--); k="165;" k; i, t) delay_ms(uchar void while(t--); 延时time="(t+2)*5*Tm" delay(uchar TI="0;" while(!TI); SBUF="s[j];" )>>4)|(temp[1]<<4));   
   
    temp[0]=temp[0]&0x0f;   
    switch(temp[0])   
      {    
         
        case 0  :  xiaoshu=0;break;   
        case 1  :  xiaoshu=0;break;   
        case 2  :  xiaoshu=1;break;   
        case 3  :  xiaoshu=1;break;   
        case 4  :  xiaoshu=2;break;   
        case 5  :  xiaoshu=3;break;   
        case 6  :  xiaoshu=3;break;   
        case 7  :  xiaoshu=4;break;   
        case 8  :  xiaoshu=5;break;   
        case 9  :  xiaoshu=5;break;   
        case 10 :  xiaoshu=6;break;   
        case 11 :  xiaoshu=6;break;   
        case 12 :  xiaoshu=7;break;   
        case 13 :  xiaoshu=8;break;   
        case 14 :  xiaoshu=8;break;   
        case 15 :  xiaoshu=9;break;                                                        
      }    
         
    EA=1;       // 完成任务后允许中断    
    return i;   
}   
   
void display(uchar num)   
{   
    P0=ledcode[nowdsp+1];   
    P27=0;   
    delay(5000);   
    P27=1;   
      
    P0=ledcode[num/10];   
    P26=0;   
    delay(5000);   
    P26=1;   
   
    P0=ledcode[num%10];   
    P07=0;   
    P25=0;   
    delay(5000);   
    P25=1;   
   
   
    P0=ledcode[xiaoshu];   
    P24=0;   
    delay(5000);   
    P24=1;     
}   
   
void initTimer(void)   
{   
    TMOD=0x21;   
    TH0=0x3c;   
    TL0=0xb0;   
    EA=1;   
    ET0=1;   
    TR0=1;   
}   
void timerInt(void) interrupt 1   
{   
    if(timer==20)   
    {   
        //每秒钟更换一次显示    
        nowdsp=(nowdsp==2)?0:(nowdsp+1);   
        timer=0;   
    }   
    TH0=0x3c;   
    TL0=0xb0;   
    TR0=1;   
    timer++;   
}   
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -