标题:
单片机串口通行与多机通信程序源码
[打印本页]
作者:
1339337425
时间:
2019-3-10 21:30
标题:
单片机串口通行与多机通信程序源码
(一)1号机通信程序设计
1、1号机初始化函数
1号机采用定时发送命令,等待接收数据的方式,使用初始化函数对串行口、定时器进行初始化。
void csh1()
{
SM0 = 0; //串行口通信方式1,8位异步通信
SM1 = 1;
REN = 1; //允许接收
PCON = 0x80; //波特率加倍
TMOD = 0x20; // T1作波特率发生器,方式2
TH1 = 0xd0; //选定波特率
TL1 = 0xd0;
TR1 = 1; //起动定时器
}
2、1号机发送程序
两台机器之间约定一个命令字节格式,假设2号机接收到该命令字节,就向1号机发送温度数据,1号机接收到该温度数据后显示在数码管上。1号机定时发送请求命令字节。
1号机的主程序:
Void main()
{
csh1(); //初始化串行口、定时器
while(1)
{
delay(); //延时
SBUF = 0xa5; //发送给1号机请求数据命令
while(~TI){ ; } //等待串行发送结束
TI = 0; //发送标志清零
while(~RI) //等待接收2号机发来的数据
{ ; }
RI = 0; //接收标志清零
wendu = SBUF; //保存接收的数据到wendu单元,供显示使用
}
}
(二)2号机通信程序设计
2号机接收命令后发送数据,2号机的初始化函数如下。
2号机采用接收命令后,中断发送数据到1号机的方式,使用初始化函数对串行口、定时器、中断进行初始化。
void csh2()
{
SM0 = 0; //串行口通信方式1,8位异步通信
SM1 = 1;
REN = 1; //允许接收
PCON = 0x80; //波特率加倍
TMOD = 0x20; // T1作波特率发生器,方式2
TH1 = 0xd0; //选定波特率
TL1 = 0xd0;
TR1 = 1; //起动定时器
EA = 1; //开中断
ES = 1; //开串行口中断
}
2号机串行通信中断服务函数
Void tongxin( ) interrupt 4
{
If( TI == 1 ) TI = 0; //如果是发送中断,清发送中断标志
else //否则是接收中断,判断接收数据是否是命令
{RI = 0; //清除接收中断标志
If( SBUF == 0xa5 ) SBUF = wendu; } //接收的来自1号机的命令字节,则发送温度数据
}
2号机的主程序:
Void main()
{
csh2(); //初始化串行口、定时器
while(1)
{
wdjc(); //温度检测函数
delay(); //延时
}
}
作者:
Jeff_BlindCat
时间:
2020-6-29 12:58
言简意赅多机往,
恍然大悟细思量;
往返BUF带命名;
地址参量见真章。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1