《两个单片机之间的简单异步串行通信.docx》由会员分享,可在线阅读,更多相关《两个单片机之间的简单异步串行通信.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、两个单片机之间的简单异步串行通信 2009-9-1 21:13 提问者:feitian_001 | 悬赏分:10 | 浏览次数:898次我在proteus中用两个AT89C52单片机做了一个小设计,想以来来验证两个单片之间异步串行通信功能的实现。下位机的TXD和上位机的RXD相连。下位机发送0x07给上位机,然后上位机接受0x07这个数,并将收到的这个数赋给P1口(P1口连着八个发光二极管(共阴极),按理说如果是正常通信的话,上位机收到下位机的数据应该是0x07,也就是说P1口连接着的八个发光二极管会点亮后三个,但是我编写程序加载到proteus中的单片机中运行程序,发现数码管亮的很乱,不是预
2、期的那种亮法,实在是找不到问题出在了哪里。下面我把程序贴一下,希望大家对异步串行通信比较懂的给我指点一下。下位机(发送数据的单片机):#include #define uchar unsigned char#define uint unsigned intvoid uart_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) uint x,y; for(x=z;x0;x-) for(y
3、=125;y0;y-); void main() uart_init(); while(1) SBUF=0x07; while(!TI); TI=0; delay(5000); 上位机(接收发过来的数据的单片机):#include #define uchar unsigned char#define uint unsigned intvoid uart_init() TMOD=0x20; TH1=0xFD; /baud rate 9600bit/s TL1=0xFD; TR1=1; REN=1; SM0=0; /串口方式1 SM1=1;void delay(uint z) uint x,y;
4、for(x=z;x0;x-) for(y=125;y0;y-); void main() uart_init(); while(1) if (RI) RI=0; P1=SBUF; delay(3000); 问题补充: 我的这个设计很简单的,就是两个AT89C52单片机异步串行端口交叉相连,然后上位机P1口接八个发光二极管,就这些东西最佳答案 因为你是用查询方式进行通信的,而程序没有中没有设置两机通信的联络信号,即接受机接收到的第一位数据不一定是发送机发送的第一位数据,而有可能是第二、第三位数据,这样接受到的八位数据就可能是发送机发送多次数据中截取的八位数据,又因两机延时时间不同,因此接受到的第
5、一位数据不可能固定不变的。所以就会出现你说的现象。如果采用的是查询方式进行串行通信,两机之间需要建立握手信号,告知接受机发送机开始发送地位数据,接受机才开始接受数据。#include #define uchar unsigned char#define uint unsigned intvoid uart_init() TMOD=0x20; TH1=0xFD; TL1=0xFD; PCON=0x00; TR1=1; SCON=0x50; void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=125;y0;y-); void main() uart_
6、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 intvoid uart_init() TMOD=0x20; TH1=0xFD; TL1=0xFD; PCON=0x00; TR1=
7、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
8、,只有下位机两个口都变成高电平,才发送0x07,上位机在P1.0和P1.1口都输出低电平。悬赏分:10 - 解决时间:2010-11-19 09:51/-最佳答案:根据要求,绘制PROTEUS仿真电路图如下:图片连接:图中的上位机,是完成串行接收、并根据收到的数据,输出高低电平。使用的程序如下:/=#include #define XTAL / CPU晶振频率#define baudrate 9600 / 通信波特率#define uchar unsigned char#define uint unsigned intsbit K1 = P10; / 定义端口sbit K2 = P11;voi
9、d init(void) SCON = 0x50; / 设定串行口工作方式 PCON &= 0x00; / 波特率不倍增 TMOD = 0x20; / 定时器1工作于8位自动重载模式, 用于产生波特率 TH1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate); TL1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate); / T1赋初值 TR1 = 1; / 启动定时器1 IE = 0x00; / 禁止任何中断/ EA = 1; / 中断总允许/-void main(void)
10、 init(); while(1) while(RI = 0); RI = 0; if (SBUF = 0x01) K1 = 1; if (SBUF = 0x03) K2 = 1; if (SBUF = 0x07) K1 = 0; K2 = 0; /=图中的下位机,要完成输入的检测,并发送不同的串行数据。使用的程序如下:/=#include #define XTAL / CPU晶振频率#define baudrate 9600 / 通信波特率#define uchar unsigned char#define uint unsigned intsbit K1 = P10; / 定义端口sbit
11、 K2 = P11;/-void init(void) SCON = 0x50; / 设定串行口工作方式 PCON &= 0x00; / 波特率不倍增 TMOD = 0x20; / 定时器1工作于8位自动重载模式, 用于产生波特率 TH1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate); TL1 = (unsigned char)(256 - (XTAL / (32L * 12L * baudrate); / T1赋初值 TR1 = 1; / 启动定时器1 IE = 0x00; / 禁止任何中断/ EA = 1; / 中断总允许/-
12、void main(void) bit T_1 = 0, T_2 = 0, T_3 = 0; init();/- while(1) if (K1 = 0) & (T_1 = 0) T_1 = 1; T_3 = 0; SBUF = 0x01; while(TI = 0); TI = 0; /- if (K2 = 0) & (T_2 = 0) T_2 = 1; T_3 = 0; SBUF = 0x03; while(TI = 0); TI = 0; /- if (K1 = 1) & (K2 = 1) & (T_3 = 0) T_1 = 0; T_2 = 0; T_3 = 1; SBUF = 0x07; while(TI = 0); TI = 0; /=程序运行的画面,已经在插图中显示,符合楼主要求。原题网址:提问者对于答案的评价:谢谢 太有帮助了!