STC12C5A60S2
主机
#include "master.H"
#define S2RI 0x01 //S2CON不能位寻址
#define S2TI 0x02
#define S2RB8 0x04
#define S2TB8 0x08
#define addr1 0x31 //从机地址1
#define addr2 0x32 //从机地址2
#define addr3 0x33 //从机地址3
extern u16 adc_P10;
//u8 rbuf;
//
extern u8 code number[];
//串口初始化
void MasterUART_init(void)
{
S2CON=0xF8; //模式3 允许多机通信 允许接受数据
BRT=0xBF; //波特率
AUXR=0x14; //使用独立波特率发生器 波特率不加倍S2MOD=0
EA=1;
IE2=0x01;
AUXR1=0x10; //串口2切换到P4
}
void send_data(u8 ddata) //发送数据
{
S2BUF=ddata; //发送数据
while(!(S2CON&S2TI)); //等待发送完毕
S2CON&=~S2TI; //软件复位TI
}
void recv( ) interrupt 8
{
u8 add=0;
S2CON&=~S2RI; //清零
add=S2BUF;
lcd_defcharacter8x16(1,0,1,add%10,number);
if(add==addr1)
{
lcd_defcharacter8x16(2,0,1,add/10,number);
S2CON&=~S2TB8;; //清地址标志
if(adc_P10<240)
{
send_data(0x10);
}
else send_data(0x20);
}
}
从机1 STC12C5A60S2
#define S2RI 0x01 //S2CON不能位寻址
#define S2TI 0x02
#define S2RB8 0x04
#define S2TB8 0x08
#define S2SM2 0x20
#define addr 0x31 //从机1地址
u8 rece_data;
void UART2_init(void)
{
S2CON=0xF0; //模式3 允许多机通信 允许接受数据
BRT=0xBF; //波特率
AUXR|=0x14; //使用独立波特率发生器 波特率不加倍S2MOD=0
EA=1;
IE2=0x01;
}
void send_data(u8 ddata) //发送数据,但此处由于与从机的协议,禁止发送0xff
{
S2BUF=ddata; //发送数据
while(!(S2CON&S2TI)); //等待发送完毕
S2CON&=~S2TI; //软件复位TI
}
void recv( ) interrupt 8
{
u8 add=0;
IE2=0x00;
S2CON&=~S2RI; //清零
add=S2BUF;
if(add==addr)
{
S2CON&=~S2SM2; //清零
send_data(addr);
S2CON|=S2TB8; //TB8置1
while(!(S2CON&S2RI));
S2CON&=~S2RI; //清零
rece_data=S2BUF;
}else S2CON|=S2SM2; //SM2置1
IE2=0x01;
}
|