两个80c51单片机之间怎样进行串行通信
以前以为串行通信只能是单片机和PC机之间进行通信,昨天无意之中看到一个程序,是单片机和单片机之间进行通信。。这小东西真是神奇啊!昨天弄了很长时间没弄出来,今天在大神的帮助下终于拨开云雾见天日了。
案例介绍:
利用单片机a将一段流水灯控制程序发送到单片机b,来控制单片机b的P1口,点亮8位LED灯。
案例分析:
a完成发送,b完成接收。编写程序设置a,令SM0=0,SM1=1(串行口工作方式1)。设置b,令SM0=0,SM1=1,REN=1,使接收允许。
源程序
1)数据发送程序
#include<reg51.h>
unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水灯控制码
void send(unsigned char dat) //数据发送程序
{
SBUF=dat; //将要发送的数据存入发送缓冲器中
while(TI==0); //若发送中断标志位没有置1(正在发送数据),就等待
TI=0; //若发送完成,TI自动置1,这里把它清零
}
void delay(void) //延时函数
{
unsigned char m,n;
for(m=0;m<200;m++) //延时约50ms
for(n=0;n<250;n++);
}
void main(void)
{
unsigned char i;
TMOD=0x20; //定时器T1工作于方式2(可自动重装的8位定时器)
SCON=0x40; //串口工作方式1,不允许接收
PCON=0x00; //波特率不倍增
TH1=0xf4; //波特率为2400b/s
TL1=0xf4;
TR1=1; //启动定时器T1(T1作波特率的发生器)
while(1)
{
for(i=0;i<8;i++) //一共8位的流水灯控制码
{
send(tab[i]); //发送数据
delay(); //每50ms发送一次数据
}
}
}
2)数据接收程序
#include<reg51.h>
unsigned char receive(void) //数据接收函数
{
unsigned char dat; while(RI==0); //数据没有接收完毕时等待接收
RI=0; //接收完毕时清零
dat=SBUF; //将接收缓冲器中的数据存入dat
return dat; //将接收到的数据返回
}
void main(void)
{
TMOD=0x20; //设置定时器T1工作于方式2
SCON=0x50; //串口工作方式1,允许接收数据
PCON=0x00; //波特率不倍增
TH1=0xf4; //波特率为2400b/s
TL1=0xf4;
TR1=1; //启动定时器T1
REN=1; //允许接收数据
while(1)
{
P1=receive(); //将接收到的数据送到P1口显示
}
}
把这两个程序分别烧写到两块板子上,然后用连接线分别连接两个板子的发送引脚和接收引脚,然后效果就出来了。这只是一个发送一个接受的情况。
两个80c51单片机之间怎样进行串行通信的更多相关文章
- 80C51单片机介绍
80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点. 增加了如乘(MUL).除(DIV).减(SUBB).比较(CMP).16位数据指针.布 ...
- 两台Linux主机之间文件的复制
使用scp命令可以实现两台Linux主机之间的文件复制,基本格式是: scp [可选参数] file_source file_target 1. 复制文件 命令格式: scp local_file r ...
- Android消息机制之实现两个不同线程之间相互传递数据相互调用
目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...
- 使用<input>标签做了两个按钮, 按钮之间间距如何去掉
遇到的问题: 使用<input>标签做了两个按钮, 按钮之间有个间距不知道怎么去掉. 如下图: 问题解决: <input>是内联块状元素(inline-block); 内联元素 ...
- 两台Linux机之间传送文件
最近实验室里接管了一台服务器,经常需要用到服务器与自己主机之间进行文件传输,因此,在此介绍一下两台Linux主机之间的一些操作,方便后来者. 1. Linux.Windows主机远程访问Linux服务 ...
- 一些80C51单片机支持双DPTR,C编译器是如何使用它的?
在C51中,C编译器并不利用双DPTR来优化用户所写的程序,只有一些库例程使用了双数据指针.当在两个存储器块之间进行数据复制或比较时,以下库例程会使用双数据指针: memmovememcpymemcm ...
- 让上下两个DIV块之间有一定距离或没有距离
1.若想上下DIV块之间距离,只需设定:在CSS里设置DIV标签各属性参数为0div{margin:0;border:0;padding:0;}这里就设置了DIV标签CSS属性相当于初始化了DIV标签 ...
- 两个java工程之间的相互调用方法
如果你有两个java项目的话,如何向他们之间进行信息的通信前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径.其实两个java项目之间的通信还是使用HTTP的请求.主要有两种 ...
- C#基础第八天-作业答案-设计类-面向对象方式实现两个帐户之间转账
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- leetcode -day31 Subsets I II
1. Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a ...
- testNg自动化,读取excel的数据
自己写了一个testng执行excel用例的小程序,主要是运行.xlsx的,需要支持xls可以自己扩展,分享一下.下载地址:http://yun.baidu.com/share/link?sharei ...
- ACM-光滑最小生成树project——hdu1863
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- 记一次内存泄漏DUMP分析
自从进入一家创业公司以后,逐渐忙成狗,却无所收获,感觉自身的技术能力用武之地很少,工作生活都在业务逻辑中颠倒. 前些天线上服务内存吃紧,让运维把DUMP拿下来,分析一下聊以自慰. 先来统计一下大对象信 ...
- 在VirtualBox下安装CentOS教程(截图版)
http://blog.csdn.net/kobe_lzq/article/details/7894718 使用的软件: VirtualBox 4.1.2 CentOS 5.6 x86_64 刻录的 ...
- Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作
Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作 1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1. ...
- Fitnesse测试用例脚本自动生成设计
Fitnesse是通过wiki形式来展示.管理和执行测试用例,若要在Fitnesse上设计测试用例,前提是必须熟悉一定的wiki语法,虽然wiki语法简单,但是若要设计成百上千的测试用例还是有很大的工 ...
- SZU:D89 The Settlers of Catan
Judge Info Memory Limit: 65536KB Case Time Limit: 3000MS Time Limit: 3000MS Judger: Number Only Judg ...
- iOS基础 - NSURLSession
使用URLSession所有的网络访问都是有缓存的,缓存文件自动保存在tmp文件夹中,URLSession本身实现的时候,就是少量多次的! l 使用defaultSessionConfiguratio ...
- WordPress搭建Personal Blog【转】
早就想搭建一个专属于自己的博客了,用来记录自己生活.学习的点点滴滴.之所以选WordPress,主要是因为它可以支持Latex,而且特别喜欢其简约的风格. WordPress有个the famous ...