如何将两个程序(主副两个程序)合并到一起呢 如果方便的话 可以帮忙改一下吗?不方便讲讲就可以了 谢谢大神们
#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]);
}
}