找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7830|回复: 1
收起左侧

单片机串口通行与多机通信程序源码

[复制链接]
ID:435708 发表于 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();                //延时
}
}



回复

使用道具 举报

ID:495287 发表于 2020-6-29 12:58 | 显示全部楼层
言简意赅多机往,
恍然大悟细思量;
往返BUF带命名;
地址参量见真章。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表