| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 438 人关注过本帖, 1 人收藏
标题:如何将两个程序(主副两个程序)合并到一起呢 如果方便的话 可以帮忙改一下 ...
只看楼主 加入收藏
小雨学编程
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2018-4-15
结帖率:0
  已结贴   问题点数:20  回复次数:1   
如何将两个程序(主副两个程序)合并到一起呢 如果方便的话 可以帮忙改一下吗?不方便讲讲就可以了 谢谢大神们
#include <reg51.h>                          //主系统仿真程序
#include <intrins.h>   
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long  uint32;
typedef char int8;
typedef int int16;
typedef long int32;
// LCD1602  
sbit RS = P1^3;
sbit RW = P1^4;
sbit EN = P1^5;
sbit BUSY = P0^7;
// KEYS  
sbit Key1 = P3^4;
sbit Key2 = P3^5;
sbit Key3 = P3^6;
sbit Key4 = P3^7;  
sbit BUZZ = P1^2;
//BUZZER //LED  
sbit LED1 = P1^0;
sbit LED2 = P1^1;  
#define KEY_DELAY 5 // 按键扫描延时
//键值  
#define K_ALARM 1
#define K_TL 2
#define K_ADD 3
#define K_SUB 4
/* LCD1602显示*/  
void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{  unsigned int i,j;   
     for(i=0;i<ms;i++)     
      for(j=0;j<100;j++); }  
/* 等待繁忙标志*/
void wait(void)
{  P0 = 0xFF;   
   do{   
       RS = 0;   
       RW = 1;   
       EN = 0;   
       EN = 1;
       }while (BUSY == 1);  
       EN = 0; }  
/* 写数据*/  
void w_dat(uint8 dat)
{  delay1ms(1);   
   RS=1;   
   RW=0;   
   EN=0;   
   P0=dat;     
   delay1ms(1);   
   EN=1;     
   delay1ms(1);   
   EN=0;  }  
/* 写命令*/  
void w_cmd(uint8 cmd)
{  delay1ms(1);   
   RS=0;   
   RW=0;   
   EN=0;   
   P0=cmd;     
   delay1ms(1);   
   EN=1;     
   delay1ms(1);   
   EN=0; }  
/* 发送字符串到LCD*/  
void w_string(uint8 addr_start, uint8 *p)
{  w_cmd(addr_start | 0x80);  
   while (*p != '\0')  
   { w_dat(*p++);} }  
/* 发送数字到LCD(00~99)*/  
void w_data(uint8 addr_start, uint8 dat)  
{   w_cmd(addr_start | 0x80);  
    w_dat(dat%100/10 + '0');  
    w_dat(dat%10 + '0'); }  
/* 初始化1602*/  
void LCD1602_init(void)
{   delay1ms(15);
    w_cmd(0x38);
    delay1ms(5);   
    w_cmd(0x08);
    delay1ms(5);   
    w_cmd(0x01);
    delay1ms(5);   
    w_cmd(0x06);
    delay1ms(5);   
    w_cmd(0x0c);
    delay1ms(5); }  
void rece_init(void)  
{   EA=1;    /*CPU开放所有中断*/     
    ES=1;   /*允许串行口中断*/      
    TMOD=0x20; /*定时器/计时器T1为定时器模式,工作于方式2*/     
    TH1=0xfd; /*向T1置初值*/     
    TL1=0xfd;      
    PCON=0x00; /*SMOD=0*/      
    SCON=0x50; /*数据串行传输工作于方式1,波特率9600bit/s,允许接收*/     
    TR1=1;/*启动定时器T1*/   }     
int8  receive(void)  
{   while(!RI);   /*等待等待数据接受*/  
    RI=0;   
    return SBUF; }  
/* 远程温度控制*/
uint32 Count=0;  
uint8 Rev_dat[16]=0, Alarm=0, Tl=0;
int8 k_val=0,Top=40, Low=10;
void delay(uint16 n)
{   while (n--); }  
void delay_ms(uint16 m)
{   uint16 n;   
    for (; m>0; m--)   
     for (n=125; n>0; n--); }  
/*  按键扫描*/  
uint8 scan_key(void)
{   uint8 val=0;  
    if (Key1 == 0)   
    { delay_ms(KEY_DELAY);   
      if (Key1 == 0)   
        val = K_ALARM;   
      while (Key1 == 0);  }   
      if (Key2 == 0)   
      { delay_ms(KEY_DELAY);   
        if (Key2 == 0)   
        { val = K_TL;     
            if (Tl == 0) // 上下限切换     
              w_string(0x4A, " ");   
            else      
              w_string(0x43, " ");   }   
        while (Key2 == 0);  }   
    if (Key3 == 0)   
      { delay_ms(KEY_DELAY);   
        if (Key3 == 0)   
          val = K_ADD;   
        while (Key3 == 0);  }   
    if (Key4 == 0)   
      { delay_ms(KEY_DELAY);   
        if (Key4 == 0)   
          val = K_SUB;   
        while (Key4 == 0);  }   
    return val; }  
void buzzer_sound(uint16 t) // 蜂鸣器发声
{   uint16 i;   
    for (i=0; i<t; i++)   
      { BUZZ = ~BUZZ;  // 电平反转   
        delay(100); // 延时   
        k_val = scan_key(); // 按键扫描   
        if (k_val) // 判断键值   
          break;  }   
    BUZZ = 1; //蜂鸣器不响
    }  
void key_action(uint8 val) // 按键处理
{   int8 tmp;  
    switch (val)   
      { case K_ALARM:  // 警报方式   
          if (Alarm >= 2)     
            Alarm = 0;   
          else      
            Alarm++;      
          if (Alarm == 0) // 声音和LED     
            w_string(0x40, "LS");
          else if (Alarm == 1) // LED     
            w_string(0x40, "L ");   
          else if (Alarm == 2) // 声音     
            w_string(0x40, " S");   
          break;   
        case K_TL:     
          if (Tl >= 1) // 上下限值加     
            Tl = 0;   
          else      
            Tl++;   
          if (Tl == 0)      
            w_string(0x43, "T"); //显示上限标志   
          else      
            w_string(0x4A, "L"); //显示下限标志   
          break;   
        case K_ADD:     
          if (Tl == 0)     
          { if (Top <= 50) // 上下限值减      
              Top++;     
            if (Top < 0)     
              { tmp = -Top;      
                w_string(0x45, "-");//显示负号      
                w_data(0x46, tmp);//显示数值   
                 }     
            else      
              { w_string(0x45, "+");//显示正号      
                w_data(0x46, Top);//显示数值     
                }    }   
          else     
          { if (Low < Top)      
              Low++;     
            if (Low < 0)     
             { tmp = -Low;      
               w_string(0x4C, "-");//显示负号      
               w_data(0x4D, tmp);//显示数值   
                }     
            else      
             { w_string(0x4C, "+");//显示正号      
               w_data(0x4D, Low);//显示数值     
               }    }     
              break;   
        case K_SUB:
          if (Tl == 0)     
          { if (Top > Low)      
            Top--;     
            if (Top < 0)     
            { tmp = -Top;      
              w_string(0x45, "-");//显示负号      
              w_data(0x46, tmp);//显示数值     
              }     
            else      
            { w_string(0x45, "+");//显示正号      
              w_data(0x46, Top);//显示数值     
              }    }   
            else     
            { if (Low >= -30)      
                Low--;     
              if (Low < 0)     
              { tmp = -Low;      
                w_string(0x4C, "-");//显示负号      
                w_data(0x4D, tmp);//显示数值     
                }     
              else      
              { w_string(0x4C, "+");//显示正号      
                w_data(0x4D, Low);//显示数值     
                }    }     
             break;   
        default: break;  }
         }  
main()  
{ uint8 k_val;   
  delay_ms(500); // 上电延时  
  LCD1602_init(); // LCD初始化   
  w_string(0x00, "   No signal!   "); // LCD显示  
  w_string(0x40, "LS T:+40C L:+10C"); // LCD显示  
  rece_init();  
  while (1)   
  { if (k_val == 0) // 判断是否按键   
    k_val = scan_key(); //扫描按键   
    if (k_val)   
    { key_action(k_val); //按键操作内容   
      k_val = 0;   }   
      Rev_dat[0]=receive();      
      w_string(0x00, "Temperature:   C");  //显示当前温度   
      if (Rev_dat[0] < 0) //负温度显示   
      {  Rev_dat[0] = -Rev_dat[0];     
         w_string(0x0C, "-");      
         w_data(0x0D, Rev_dat[0]);     }     
      else // 正温度显示        
      {  w_string(0x0C, "+");      
         w_data(0x0D, Rev_dat[0]);     }   
      if (Rev_dat[0] > Top) // 判断温度范围   
      { if (Alarm == 1) // LED     
        { LED1 = 0;      }           
          else if (Alarm == 2) // SOUND      
          { LED1 = 1;        
            buzzer_sound(300);      }      
        else //ALL      
        { LED1 = 0;        
          buzzer_sound(300);      }          }     
      else if (Rev_dat[0] < Low)     
      { if (Alarm == 1) // LED      
        { LED2 = 0;      }      
          else if (Alarm == 2) // SOUND      
          { LED2 = 1;        
            buzzer_sound(100);      }      
        else //ALL      
        { LED2 = 0;                     
          buzzer_sound(100);      }      }      
      else // 当前温度在正常范围     
      { LED1 = 1;      LED2 = 1;     }     
     }
  }

#include <reg51.h>    //副程序
#include <intrins.h>   
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long  uint32;
typedef char int8;
typedef int int16;
typedef long int32;
sbit DQ=P1^0; //DS18B20
sbit LED=P1^1; //LED  
#define nops();  {_nop_(); _nop_(); _nop_(); _nop_();} //定义空指令
int8 read_temp(void);  
void start_temp_sensor(void);
void tran_init(void);
void send(int8 tem);
void delay(uint16 cnt);
/*18B20复位函数*/  
void DS18b20_reset(void)
{ bit flag=1;  
  while (flag)   
  {  while (flag)   
     {  DQ = 1;   
        delay(1);     
        DQ = 0;      
        delay(50); // 550us     
        DQ = 1;    //      
        delay(6);  // 66us      
        flag = DQ; // presence="0继续下一步"      
      }   
     delay(45);    //延时500us   
     flag = ~DQ;  
  }   
  DQ=1;
}  
/* 18B20写1个字节函数向1-WIRE总线上写一个字节*/
void write_byte(uint8 val)
{ uint8 i;   
  for (i=0; i<8; i++)  
  { DQ = 1;   
    _nop_();
    DQ = 0;   
    nops(); //4us   
    DQ = val & 0x01;      //最低位移出   
    delay(6);           //66us   
    val >>= 1;          //右移一位  
  }   DQ = 1;   
  delay(1);   
}
/*   * 18B20读1个字节函数从1-WIRE总线上读取一个字节 */  
uint8 read_byte(void)
{ uint8 i, value=0;  
  for (i=0; i<8; i++)  
  { DQ=1;   
    _nop_();   
    value >>= 1;   
    DQ = 0;   
    nops();   //4us   
    DQ = 1;   
    nops();   //4us   
    if (DQ)     
    value|=0x80;   
    delay(6);           //66us  
  }   DQ=1;   
  return(value);
}  
void start_temp_sensor(void)
{  DS18b20_reset();   
   write_byte(0xCC); // 发Skip ROM命令  
   write_byte(0x44); // 发转换命令
}  
/*读出温度*/  
int8 read_temp(void)  
{ uint8 temp_data[2]; // 读出温度暂放  
  int16 temp;   
  DS18b20_reset();  // 总线复位   
  write_byte(0xCC); // 发Skip ROM命令  
  write_byte(0xBE); // 发读命令   
  temp_data[0]=read_byte();  //温度低8位  
  temp_data[1]=read_byte();  //温度高8位  
  temp = temp_data[1];  
  temp <<= 8;   
  temp |= temp_data[0];  
  temp >>= 4;   
  return (int8)temp;
}  
/* 串口传输 */  
void tran_init(void)  
{  EA=1;          /*CPU开放所有中断*/   
   ES=1;        /*允许串行口中断*/   
   TMOD=0x20; /*定时器/计时器T1为定时器模式,工作于方式2*/   
   TH1=0xfd;   /*向T1置初值*/   
   TL1=0xfd;   
   PCON=0x00;    /*SMOD=0*/   
   SCON=0x50;   /*数据串行传输工作于方式1,波特率9600bit/s,允许接收*/   
   TR1=1;   
}      
void   send(int8 tem)
{  SBUF = tem;  
   while(!TI);  
   TI = 0;
}  
void delay(uint16 i)
{ while (i--);
}  
void delay_ms(uint16 m)
{  uint16 n;   
   for (; m>0; m--)   
     for (n=125; n>0; n--);
}  
main()  
{ int8 dataout[16];   
  LED = 0; // 上电LED亮         
  tran_init();     
  while (1)   
  {  start_temp_sensor(); // 初始化18B20   
     delay_ms(1000); // 延时1秒   
     dataout[0] = read_temp(); //读温度   
     LED = ~LED; // 重置LED指示灯   
     send(dataout[0]);  
  }
}  
   
2018-04-15 16:32
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
  得分:20 
int8  receive(void)
{
    while (!RI);  /*等待等待数据接受*/
    RI=0;
    return SBUF;
}

把上面的改成下面的试试


/*读出温度*/
int8 read_temp(void)
{
    uint8 temp_data[2]; // 读出温度暂放
    int16 temp;
    DS18b20_reset();  // 总线复位
    write_byte(0xCC); // 发Skip ROM命令
    write_byte(0xBE); // 发读命令
    temp_data[0]=read_byte();  //温度低8位
    temp_data[1]=read_byte();  //温度高8位
    temp = temp_data[1];
    temp <<= 8;
    temp |= temp_data[0];
    temp >>= 4;
    return (int8)temp;
}
2018-04-15 19:17







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029308 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved