两个单片机之间的简单异步串行通信
两个单片机之间的简单异步串行通信
2009-9-1 21:13
提问者:feitian_001|悬赏分:10|浏览次数:898次
我在proteus中用两个AT89C52单片机做了一个小设计,想以来来验证两个单片之间异步串行通信功能的实现。下位机的TXD和上位机的RXD相连。下位机发送0x07给上位机,然后上位机接受0x07这个数,并将收到的这个数赋给P1口(P1口连着八个发光二极管(共阴极)),按理说如果是正常通信的话,上位机收到下位机的数据应该是0x07,也就是说P1口连接着的八个发光二极管会点亮后三个,但是我编写程序加载到proteus中的单片机中运行程序,发现数码管亮的很乱,不是预期的那种亮法,实在是找不到问题出在了哪里。下面我把程序贴一下,希望大家对异步串行通信比较懂的给我指点一下。
下位机(发送数据的单片机):
#include
#define uchar unsigned char
#define uint unsigned int
voiduart_init()
{
TMOD=0x20; //T1 方式2
TH1=0xFD; //baud rate 9600bit/s
TL1=0xFD;
TR1=1;
REN=1; //允许接收
SM0=0; //串口方式1
SM1=1;
TI=0;
}
void delay(uint z)
{
uintx,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void main()
{
uart_init();
while(1)
{
SBUF=0x07;
while(!TI);
TI=0;
delay(5000);
}
}
上位机(接收发过来的数据的单片机):
#include
#define uchar unsigned char
#define uint unsigned int
voiduart_init()
{
TMOD=0x20;
TH1=0xFD; //baud rate 9600bit/s
TL1=0xFD;
TR1=1;
REN=1;
SM0=0; //串口方式1
SM1=1;
}
void delay(uint z)
{
uintx,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void main()
{
uart_init();
while(1)
{
if (RI)
{
RI=0;
P1=SBUF;
delay(3000);
}
}
}
问题补充:
我的这个设计很简单的,就是两个AT89C52单片机异步串行端口交叉相连,然后上位机P1口接八个发光二极管,就这些东西
最佳答案
因为你是用查询方式进行通信的,而程序没有中没有设置两机通信的联络信号,即接受机接收到的第一位数据不一定是发送机发送的第一位数据,而有可能是第二、第三位数据,这样接受到的八位数据就可能是发送机发送多次数据中截取的八位数据,又因两机延时时间不同,因此接受到的第一位数据不可能固定不变的。
所以就会出现你说的现象。如果采用的是查询方式进行串行通信,两机之间需要建立握手信号,告知接受机发送机开始发送地位数据,接受机才开始接受数据。
#include
#define uchar unsigned char
#define uint unsigned int
voiduart_init()
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void delay(uint z) {
uintx,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--); }
void main()
{
uart_init();
do
{
SBUF=0x01; while(TI==0);
TI=0;
while(RI==0);
REN=0;
}
while(SBUF!=0x02) ;
while(1)
{
SBUF=0x07; while(TI==0);
TI=0;
delay(500) ;
SBUF=0x00; while(TI==0);
TI=0;
delay(500) ;
}
#include
#define uchar unsigned char #define uint unsigned int voiduart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SM0=0; //串口方式1 SM1=1;
REN=1;
}
void main()
{
uart_init();
do
{
SBUF=0x02;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
P2=SBUF;
}
while(P2!=0x01);
while(1)
{
while(RI==0);
P1=SBUF;
RI=0;
}
}
串行通信控制
2010-11-18 16:46
关于双单片机串口通讯的问题。
要求如下:
1,如果下位机的P1.0口输入低电平,就发出0x01,上位机在自己的P1.0口输出高电平;
2,如果下位机的P1.1口输入低电平,就发出0x03,上位机在自己的P1.1口输出高电平;
3,只有下位机两个口都变成高电平,才发送0x07,上位机在P1.0和P1.1口都输出低电平。
悬赏分:10-解决时间:2010-11-1909:51
//-----------------------------------------------------------
最佳答案:
根据要求,绘制P R O T E U S仿真电路图如下:
图片连接:h t t p://h i.b a i d u.c o m/%D7%F6%B6%F8%C2%D B%B5%C0/a l b u m/i t e m/d9581a5108d990171238c
图中的上位机,是完成串行接收、并根据收到的数据,输出高低电平。使用的程序如下:
//================================================
#i n c l u d e
#d e f i n e X T A L11059200//C P U晶振频率
#d e f i n e b a u d r a t e9600//通信波特率
#d e f i n e u c h a r u n s i g n e d c h a r
#d e f i n e u i n t u n s i g n e d i n t
s b i t K1=P1^0;//定义端口
s b i t K2=P1^1;
v o i d i n i t(v o i d)
{
S C O N=0x50;//设定串行口工作方式
P C O N&=0x00;//波特率不倍增
T M O D=0x20;//定时器1工作于8位自动重载模式,用于产生波特率T H1=(u n s i g n e d c h a r)(256-(X T A L/(32L*12L*b a u d r a t e)));
T L1=(u n s i g n e d c h a r)(256-(X T A L/(32L*12L*b a u d r a t e)));//T1赋初值T R1=1;//启动定时器1
I E=0x00;//禁止任何中断
//E A=1;//中断总允许
}
//-----------------------------------------------------------
v o i d m a i n(v o i d)
{
i n i t();
w h i l e(1){
w h i l e(R I==0);
R I=0;
i f(S B U F==0x01)K1=1;
i f(S B U F==0x03)K2=1;
i f(S B U F==0x07){
K1=0;
K2=0;
}}}
//================================================
图中的下位机,要完成输入的检测,并发送不同的串行数据。使用的程序如下:
//================================================
#i n c l u d e
#d e f i n e X T A L11059200//C P U晶振频率
#d e f i n e b a u d r a t e9600//通信波特率
#d e f i n e u c h a r u n s i g n e d c h a r
#d e f i n e u i n t u n s i g n e d i n t
s b i t K1=P1^0;//定义端口
s b i t K2=P1^1;
//-----------------------------------------------------------
v o i d i n i t(v o i d)
{
S C O N=0x50;//设定串行口工作方式
P C O N&=0x00;//波特率不倍增
T M O D=0x20;//定时器1工作于8位自动重载模式,用于产生波特率T H1=(u n s i g n e d c h a r)(256-(X T A L/(32L*12L*b a u d r a t e)));
T L1=(u n s i g n e d c h a r)(256-(X T A L/(32L*12L*b a u d r a t e)));//T1赋初值T R1=1;//启动定时器1
I E=0x00;//禁止任何中断
//E A=1;//中断总允许
}
//-----------------------------------------------------------
v o i d m a i n(v o i d)
{
b i t T_1=0,T_2=0,T_3=0;
i n i t();
//--------------------------------------------------
w h i l e(1){
i f((K1==0)&&(T_1==0)){
T_1=1;
T_3=0;
S B U F=0x01;
w h i l e(T I==0);
T I=0;
}
//-------------------------------------
i f((K2==0)&&(T_2==0)){
T_2=1;
T_3=0;
S B U F=0x03;
w h i l e(T I==0);
T I=0;
}
//-------------------------------------
i f((K1==1)&&(K2==1)&&(T_3==0)){
T_1=0;
T_2=0;
T_3=1;
S B U F=0x07;
w h i l e(T I==0);
T I=0;
}}}
//================================================
程序运行的画面,已经在插图中显示,符合楼主要求。
原题网址:h t t p://z h i d a o.b a i d u.c o m/q u e s t i o n/198788419.h t m l?f r=i m100008提问者对于答案的评价:谢谢太有帮助了!
单片机双机之间的串行通信设计
专业方向课程设计报告 题目:单片机双机之间的串行通信设计
单片机双机之间的串行通信设计 一.设计要求: 两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。 二、方案论证: 方案一:以两片51单片机作为通信部件,以4*4矩阵键盘作为数据输入接口,通过16个不同键值输入不同的信息,按照51单片机的方式3进行串口通信,从机采用中断
方式接收信息并按照通信协议改变波特率或者用I/O口输出、CD4511译码、数码管显示相关数据,整个系统的软件部分采用C语言编写。 方案二:整个系统的硬件设计与方案一样,但是通信方式采用方式一进行通信,主从机之间的访问采用查询方式,数据输出直接由单片机的译码程序输出译码数据,同时软件编写采用汇编语言。 两种方式从设计上来说各有特色,而且两种方式都应该是可行的。方案一中按照方式三通信可以输出九位数据而方式一只能输出八位数据,但就本题的要求来说方式一就可以了。主从机之间的交流采用中断方式是一种高效且保护单片机的选择,但是相比之下本人对查询方式的理解更好一些。数码管的显示若采用CD4511译码则直接输出数据就可以了,但是这样会增加硬件陈本,而且单片机的资源大部分都还闲置着,所以直接编写一段译码程序是比较好的做法。另外在软件编写上,采用C语言在后续设计中对硬件的考虑稍少一些,换言之采用汇编可以使自己对整个通信过程及单片机的部分结构有更清晰地认识所以综合考虑采用方案二。 三、理论设计: 采用AltiumDesigner绘制的原理图(整图)
本系统主要包括五个基本模块:单片机最小系统(包括晶振电路、电源、复位电路及相关设置电路)、4*4矩阵键盘、功能控制电路、数据显示电路、波特率更改指示电路。 本设计的基本思路是通过控制口选择将要实现的功能,然后矩阵键盘输入数据,单片机对数据进行处理(加校验码、设置功能标志位),然后与从机握手,一切就绪之后后就开始发送数据,然后从机对接收数据校验,回发校验结果,主机根据校验结果进行下一步动作,或者重发,或者进入下一 数据的发送过程,然后按照此过程不段循环,直到结束。 晶振电路提供脉冲,加上复位电路,将 EA接入高电电平选择片内程序存储器。 这是一个单片机能够工作的最低设置。
8251串行通讯实验
安徽师范大学数计学院实验报告 专业名称11计科 课程微机原理 实验名称串行通信实验姓名 学号110704012
8251 可编程串行口与PC 机通讯实验 一、实验目的 (1) 掌握8251 芯片的结构和编程,掌握微机通讯的编制。 (2) 学习有关串行通讯的知识。 (3) 学习PC 机串口的操作方法。 二、实验说明 1、8251 信号线 8251 是CPU 与外设或Mode 之间的接口芯片,所以它的信号线分为两组:一组是用于与CPU 接口 的信号线,另一组用于与外设或Mode 接口。 (1)与CPU 相连的信号线: 除了双向三态数据总线(D7~D0)、读(RD)、写(WR)、片选(CS)之外,还有: RESET:复位。通常与系统复位相连。 CLK:时钟。由外部时钟发生器提供。 C/D:控制/数据引脚。 TxRDY:发送器准备好,高电平有效。
TxE:发送器空,高电平有效。 RxRDY:接收器准备好,高电平有效。 SYNDET/BRKDET:同步/中止检测,双功能引脚。 (2)与外设或Mode 相连的信号线: DTR:数据终端准备好,输出,低电平有效。 DSR:数据装置准备好,输入,低电平有效。 RTS:请求发送,输出,低电平有效。 CTS:准许传送,输入,低电平有效。 TxD:发送数据线。 RxD:接收数据线。 TxC:发送时钟,控制发送数据的速率。 RxC:接收时钟,控制接收数据的速率。 2、8251 的初始化编程和状态字 8251 是一个可编程的多功能串行通信接口芯片,在使用前必须对它进行初始化编程。初始化编 程包括CPU 写方式控制字和操作命令字到8251 同一控制口,在初始化编程时必须按一定的顺序。如 下面的流程图:
两个单片机之间的串行通信
两个单片机之间的串行通信 一、设计要求 在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。 二、实验所需元器件 三、电路原理图: 两个单片机之间的串行通信电路图
四、程序设计 这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。因此,需编写两个不同的程序,其程序流程图如下所示:
五、C语言程序: U1的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char void send(uchar state) { SBUF=state; while(TI==0); TI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; TI=0; TR1=1; ES=1; } void main() { P1=0xff; SCON_init(); while(1) { send(P1); } } U2的C语言程序: #include "reg51.h" #define uint unsigned int #define uchar unsigned char uchar state; void receive() { while(RI==0) state=SBUF; RI=0; } void SCON_init(void) { SCON=0x50; TMOD=0x20; PCON=0x00; TH1=0xfd; TL1=0xfd; RI=0; TR1=1; } void main() { SCON_init(); while(1) { receive(); P1=state; } } 六、调试与仿真:
基于单片机的串口通信模块设计
1 绪论 1.1 研究背景 通信是指不同的独立系统利用线路互相交换数据,它的主要目的是将数据从一端传送到另一端,实现数据的交换。在现代工业控制中,通常采用计算机作为上位机与下层的实时控制与监测设备进行通讯。现场数据必须通过一个数据收集器传给上位机,同样上位机向现场设备发命令也必须通过数据收集器。串行通信因其结构简单、执行速度快、抗干扰能力强等优点,已被广泛应用于数据采集和过程控制等领域。 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度快,串行通信的距离可以从几米到几千米。 随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行监测和控制。PC机具有强大的监控和管理能力,而单片机则具有快速及灵和的控制特点,通过PC 机的RS-232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。而随着USB接口技术的成熟和使用的普及,由于USB 接口有着 RS-232(DB-9)串口无法比拟的优点,RS-232(DB-9)串口正在逐步地为USB 接口所替代。而在现在的大多数笔记本电脑中,出于节省物理空间和用处不大等原因,RS-232(DB-9)串口已不再设置,这就约束了基于RS-232(DB-9)串口与PC 机联络的单片机设备的使用围。当前USB接口逐步取代RS-232(DB-9)串口已是大势所趋,单片机同计算机的USB通信在实际工作中的应用围也将越来越广。本文所介
51单片机串口通信,232通信,485通信,程序
51单片机串口通信,232通信,485通信,程序代码1:232通信 #include
while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {
RI=0; a=SBUF; flag=1; } 代码2:485通信 #include
} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.
串口通信实验讲解
课程名称:Zigbee技术及应用实验项目:串口通信实验指导教师: 专业班级:姓名:学号:成绩: 一、实验目的: (1)认识串口通信的概念; (2)学习单片机串口通信的开发过程; (3)编写程序,使单片机与PC通过串口进行通信。 二、实验过程: (1)根据实验目的分析实验原理; (2)根据实验原理编写C程序; (3)编译下载C程序,并在实验箱上观察实验结果。 三、实验原理: 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,此时只需要一条数据线,外加一条公共信号地线和若干条控制信号线。因为一次只能传送一位,所以对于一个字节的数据,至少要分8位才能传送完毕,如图3-1所示。 图2-1串行通信过程 串行通信制式: (1)单工制式 这种制式是指甲乙双方通信时只能单向传送数据,发送方和接收方固定。 (2)半双工制式 这种制式是指通信双方都具有发送器和接收器,即可发送也可接收,但不能同时接收和发送,发送时不能接收,接收时不能发送。
(3)全双工制式 这种制式是指通信双方均设有发送器和接收器,并且信道划分为发送信道和接收信道,因此全双工制式可实现甲乙双方同时发送和接收数据,发送时能接收,接收时能发送。 三种制式分别如图3-2所示 图3-2串行通信制式 3.1硬件设计原理 CC2530有两个串行通信接口USART0和USART1,两个USART具有同样的功能,可已分别运行于UART模式和同步SPI模式。 CC2530的两个串行通信接口引脚图分布如表3-1所示 表3-1 CC2530串行通信口引脚图分布 本实验CC2530模块使用的是USART1的位置2,P1_6和P1_7。
单片机与PC机串口通讯设计
第一章串口通讯的系统组成与原理 1.1 系统组成及通讯原理 1.1.1 系统构成 一、MSP430F149功能简介: 本设计选用的主要芯片为MSP430F149,该单片机属于德州仪器公司MSP430F14X/16X FLASH 系列。该系列是一组工业级超低功耗的微控制器,运行环境温度为-40~+85 摄氏度工作电压范围 1.8~3.6V,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。由于具有16位RISC(精简指令集)结构,16位寄存器和常数寄存器,MSP430 达到了最大的代码效率。数字控制的振荡器提供快速从所有低功耗模式苏醒到活动模式的能力时间少于6ms。MSP430F149有较高的处理速度,在8MHz 晶体驱动下指令周期为125 ns。另外它带有两个16 位定时器(带看门狗功能)、速度极快的8 通道12 位A/D 转换器(ADC)(带内部参考电压、采样保持和自动扫描功能)、一个内部比较器和两个通用同步/异步发射接收器、48个I/O口(均可独立控制)的微处理器结构。硬件乘法器提高了单片机的性能并使单片机在编码和硬件上可兼容[3]。这些特点保证了可编制出高效率的源程序。 二、系统构成 1、系统框图 系统构成如图1-1所示,由上位机(即工业控制计算机)、通讯接口和下位机3部分组成。上位机选用的是工控机,智能终端由单片机MSP430F149和外围传感器放大电路等构成(本设计部涉及该部分的设计)。单片机与PC 机之间通信方式为串行异步方式(UART),下位机采用中断方式进行与上位机的数据交换,上位机采用按时查询方式对各串口进行读写操作。单片机MSP430要想与PC 串口连接或者其它带有串口的终端设备连接,接口电路部分必须要进行EIA-RS-232-C 与MSP430 电平和逻辑关系的转换[4]。本设计将采用MAX3221芯片,完成3V~5V 电平与串口电平的双向转换。
第06章单片机串行通信系统习题解答
第6章单片机串行通信系统习题解答 一、填空题 1.在串行通信中,把每秒中传送的二进制数的位数叫波特率。 2.当SCON中的M0M1=10时,表示串口工作于方式 2 ,波特率为 fosc/32或fosc/64 。 3.SCON中的REN=1表示允许接收。 4.PCON 中的SMOD=1表示波特率翻倍。 5.SCON中的TI=1表示串行口发送中断请求。 6.MCS-51单片机串行通信时,先发送低位,后发送高位。 7.MCS-51单片机方式2串行通信时,一帧信息位数为 11 位。 8.设T1工作于定时方式2,作波特率发生器,时钟频率为,SMOD=0,波特率为时,T1的初值为 FAH 。 9.MCS-51单片机串行通信时,通常用指令 MOV SBUF,A 启动串行发送。 10.MCS-51单片机串行方式0通信时,数据从引脚发送/接收。 二、简答题 1.串行口设有几个控制寄存器它们的作用是什么 答:串行口设有2个控制寄存器,串行控制寄存器SCON和电源控制寄存器PCON。其中PCON中只有的SMOD与串行口的波特率有关。在SCON中各位的作用见下表: 2.MCS-51单片机串行口有几种工作方式各自的特点是什么 答:有4种工作方式。各自的特点为:
3.MCS-51单片机串行口各种工作方式的波特率如何设置,怎样计算定时器的初值 答:串行口各种工作方式的波特率设置: 工作方式O :波特率固定不变,它与系统的振荡频率fosc 的大小有关,其值为fosc/12。 工作方式1和方式3:波特率是可变的,波特率=(2SMOD/32)×定时器T1的溢出率 工作方式2:波特率有两种固定值。 当SM0D=1时,波特率=(2SM0D/64)×fosc=fosc/32 当SM0D=0时,波特率=(2SM0D/64)×fosc=fosc/64 计算定时器的初值计算: 4.若fosc = 6MHz ,波特率为2400波特,设SMOD =1,则定时/计数器T1的计数初值为多少并进行初始化编程。 答:根据公式 N=256-2SMOD ×fosc /(2400×32×12)= ≈243 =F3H TXDA: MOV TMOD,#20H ;置T1定时器工作方式2 MOV TL1,#0F3H ;置T1计数初值. MOV TH1,#0F3H B f B f N OSC SMOD OSC SMOD ??-=???-=384225612322256
单片机串行通信实验
单片机实验报告 实验名称:串行通信实验 姓名:高知明 学号:110404320 班级:通信3 实验时间:2014-6-11 南京理工大学紫金学院电光系
一、实验目的(四号+黑体) 1、理解单片机串行口的工作原理; 2、学习使用单片机的TXD\RXD口; 3、了解MAX232芯片的作用; 二、实验原理 MCS-51单片机内部集成有一个UART,用于全双工方式的串行通信,可以发送、接收数据。他有两个相互独立的接收、发送缓冲器,这两个缓冲器同名(SBUF),共用一个地址号(99H)。发送缓冲器只能写入,不能读出,接受缓冲器只能读出,不能写入。要发送的字节数据直接写入发送缓冲器。SBUF=a;当UART接收到数据后,CPU从接收缓冲器中读取数据,a=SBUF;串行口内部有两个移位寄存器,一个用于串行发送,一个用于串行接收。定时器T1作为波特率发生器,波特率发生器的溢出信号昨接受或发送移位寄存器的位移时钟。TI与RI分别为发送完数据的中断标志,用来想CPU发中断请求。 三、实验内容 1、发送信号 1)C51程序: #include