c51单片机串口通信的串口异步通信和同步通信的区别

stm32学习之路——USART 同步异步串行通信 - 狼来了e的博客 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
stm32学习之路——USART 同步异步串行通信
已有 731 次阅读 15:20
USART与UART(异步通信)相比增加了同步通信的功能,当然原来UART实现的异步通信USART是完全可以实现的。除了增加了同步通信外USART模块还增加了一些红外通信等功能,这里不做介绍。UART通信主要用到&RX数据接收信号线&和&TX&数据发送信号线。USART中当使用同步通信功能时需要另一个信号线CK&时钟信号线。UART与I2C相比,UART是双方之间的通信,而且有两条通信线路是全双工工作的,可以同时发送和接收;而I2C是一条总线上挂多个通信设备,每次发送方都要先指明和哪个设备通信,而且只有一条通信线路也就是说是单工双向的通信,通信的协议要比UART复杂。UART的通信:首先发送起始位,起始位就是和总线空闲状态相反的信号,比如总线空闲状态时为1,发送一个0将电平拉低表示将要开始发送数据。发送的数据可以是8位或9位,需要奇偶验证时往往定位9位,最后一位为奇偶验证位,不会写入数据寄存器中。发送数据前还需要设置好通信的频率,在USART_BRR波特率寄存器中设置,这个寄存器有12位整数位和4位小小数位,4位小数位在以前的单片机中是没有的,这提高了通信频率的精确度,通信准确度也大大提高。这个波特率寄存器是个分频寄存器,将总线上给的时钟信号分频成通信所需要的时钟信号,这里得到的时钟速率还要除16才是真正的通信的波特率,因为每来一个信号要16个脉冲来检测接收。然后可以开始发送数据位,接收端的波特率、数据的位数、停止位的位数等设置必须和接收端相同才可完成通信。数据位发送完成发送方会发送停止位。整个通信过程需要我们做的非常简单,把初始的参数配置好之后,将要发送的数据写入USART_DR寄存器中,然后等待USART_CR1寄存器的TC数据发送完成位(或者TXE发送数据寄存器空位),然后可以继续往USART_DR寄存器写数据了,直到发完为止。printf()&函数的重定向:掌握了USART的数据发送,我们可以对printf函数做一点改变,因为在单片机上printf是没有意义的,我们可以把printf()&改为向USART串口发送数据,其实非常简单,只需要重写fputc()函数的代码即可,代码如下:int&fputc(int&ch,FILE&*f){ USART_SendData(USART1,ch); while(USART_GetFlagStatus(USART1,&USART_FLAG_TC)==RESET); return&}然后在main()函数想要使用USART串口发送数据就变得简单了int&main(){print(“你想发送的数据”);return&1;}简单吧,呵呵。
作者的其他最新博客
评论 ( 个评论)
Powered by后使用快捷导航没有帐号?
查看: 5200|回复: 7
异步通信的区别
在线时间52 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 124, 距离下一级还需 76 积分
一粒金砂(中级), 积分 124, 距离下一级还需 76 积分
同步通信和异步通信的区别是什么&&我查到的是&&二者的差别在于&&所使用的时钟&&是不是严格同步的& &但是用户手册上&&谢了一大堆关于串口通信的& &我看了下& &一共 289页& &&&通读了一遍&&感觉&&同步通信和异步通信&&差别挺大的& &帮忙详细的说一下&&到底哪里不同啊&&??
在线时间888 小时
威望1080分
芯币1903枚
E金币305枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1080, 距离下一级还需 120 积分
纯净的硅(中级), 积分 1080, 距离下一级还需 120 积分
本帖最后由 sjtitr 于
22:12 编辑
可以举几个同步通信与异步通信&&在实际中的例子吗&&我用PC给单片机发送数据用的是异步通信& &别人在做液 ...
没有规定说控制屏幕显示一定是同步通信,和上位机通信一定是异步。
只是通常的讲,同步通信可以支持比较高的速率,而异步通信由于各自掐表,所以误差在所难免,如果速率太快就会容易产生错误。
和单片机通信使用异步通信,完全是因为它比较简单且历史悠久,好多PC上又具备现成的接口。简单这一点尤为重要,UART作为最简单的异步通信,通信双方是对等关系,不用为了调试而写一个复杂的通信协议。
和屏幕通信,用什么基本取决于屏幕支持什么通信。
同步通信和异步通信所用的借口一样吗??&
在线时间888 小时
威望1080分
芯币1903枚
E金币305枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1080, 距离下一级还需 120 积分
纯净的硅(中级), 积分 1080, 距离下一级还需 120 积分
同步通信和异步通信所用的借口一样吗??
说实话我实在不知道应该如何回答你这个问题。
通信通常的讲,就是用于两个CPU之间起到交换数据作用的一种方法,当然必不可少要用到Port相连接。
而同步通信和异步通信所说的只是两种通信类型,每种类型又各有若干种具体的通信方法,每种通信方法都各自定义了自己的port连接和使用方法。
在线时间888 小时
威望1080分
芯币1903枚
E金币305枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1080, 距离下一级还需 120 积分
纯净的硅(中级), 积分 1080, 距离下一级还需 120 积分
简单的讲,同步通信就是有一个时钟信号,大家根据这个时钟信号确定什么时候去采样数据信号。异步通信就是没有这个时钟信号,大家随时对数据信号采样,发现预订好的标志,就认为开始通信了,然后根据预订好的时间间隔,定期到数据线上采样通信数据。
可以举几个同步通信与异步通信
在实际中的例子吗
我用PC给单片机发送数据用的是异步通信
别人在做液晶显示的
时候用的是同步通信
做液晶显示为什么必须要用同步通信啊????&
在线时间13 小时
TA的帖子TA的资源
楼上说得很详细的说!!!
,的家园!51嵌入式官方QQ群,欢迎爱好者加入。
在线时间52 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 124, 距离下一级还需 76 积分
一粒金砂(中级), 积分 124, 距离下一级还需 76 积分
简单的讲,同步通信就是有一个时钟信号,大家根据这个时钟信号确定什么时候去采样数据信号。异步通信就是没 ...
可以举几个同步通信与异步通信&&在实际中的例子吗&&我用PC给单片机发送数据用的是异步通信& &别人在做液晶显示的&&时候用的是同步通信&&做液晶显示为什么必须要用同步通信啊????
没有规定说控制屏幕显示一定是同步通信,和上位机通信一定是异步。
只是通常的讲,同步通信可以支持比较高的速率,而异步通信由于各自掐表,所以误差在所难免,如果速率太快就会容易产生错误。
和单片机通信使用&
在线时间52 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 124, 距离下一级还需 76 积分
一粒金砂(中级), 积分 124, 距离下一级还需 76 积分
没有规定说控制屏幕显示一定是同步通信,和上位机通信一定是异步。
只是通常的讲,同步通信可以支持比较 ...
同步通信和异步通信所用的借口一样吗??
说实话我实在不知道应该如何回答你这个问题。
通信通常的讲,就是用于两个CPU之间起到交换数据作用的一种方法,当然必不可少要用到Port相连接。
而同步通信和异步通信所说的只是两种通信类型,每种类&
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
选择同步通信速度快
Powered by
逛了这许久,何不进去瞧瞧?51单片机串行口--同步移位寄存器
MCS-51单片机的串行口具有两条独立的数据线——发送端TXD和接收端RXD,它允许数据同时往两个相反的方向传输。一般通信时发送数据由TXD端输出,接收数据由RXD端输入。
MCS-51单片机的串行口既可以用于网络通信,亦可实现串行异步通信,还可以用作同步移位寄存器。如果在串行口的输入输出引脚上加上电平转换器,就可方便地构成标准的RS-232接口。
MCS-51单片机的串行接口是一个全双工通信接口,它有两个物理上独立的接收、发送缓冲器SBUF,可以同时发送和接收数据。但是发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。两个缓冲器共用一个地址(99H)。
数据通信的基本概念
常用于数据通信的传输方式有单工、半双工、全双工和多工方式。
单工方式:数据仅按一个固定方向传送。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。
半双工方式:数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实现收/发开关转换。
全双工方式:允许双方同时进行数据双向传送,但一般全双工传输方式的线路和设备较复杂。
多工方式:以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,即可实现在同一线路上资源共享功能。
根据同步方式,串行数据通信有两种形式,如图5-5所示。
异步通信。在这种通信方式中,接收器和发送器有各自的时钟,它们的工作是非同步的。异步通信用一帧来表示一个字符,其内容是一个起始位,紧接着是若干个数据位。
同步通信。同步通信格式中,发送器和接收器由同一个时钟源控制,在异步通信中,每传输一帧字符都必须加上起始位和停止位,占用了传输时间,若要求传送数据
量较大,速度就会慢得多。同步传输方式去掉了这些起始位和停止位,只在传输数据块时先送出一个同步头(字符)标志即可。
同步传输方式比异步传输方式速度快,这是它的优势。但同步传输方式也有其缺点,即它必须要用一个时钟来协调收发器的工作,所以它的设备也较复杂。
MCS-51的串行口控制寄存器
在完成串行口初始化后,发送数据时,采用MOV
SBUF,A指令,将要发送的数据写入SBUF,则CPU自动启动和完成串行数据的输出;接收数据时,采用MOV A,SBUF指令,CPU就自动将接收到的数据从SBUF中读出。
控制MCS-51单片机串行接口的控制寄存器有两个——特殊功能寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、数据传输率的大小,以及作为运行的中断标志等,其格式如下:
① 串行口控制寄存器SCON。SCON的字节地址是98H,位地址(由低位到高位)分别是98H一9FH。SCON的格式如下:
SM0、SMl:串行口工作方式控制位。
00——方式0;01——方式1;
10——方式2;11——方式3。
SM2:仅用于方式2和方式3的多机通信控制位。
发送机SM2=1(要求程控设置)。
当为方式2或方式3时:
SM2=1时,若RB8=1,可引起串行接收中断;若RB8=0,不引起串行接收中断。SM2=0时,若RB8=1,可引起串行接收中断;若RB8=0,亦可引起串行接收中断。
REN串行接收允许位:0——禁止接收;1——允许接收。
TB8:在方式2、3中,TB8是发送机要发送的第9位数据。
RB8:在方式2、3中,RB8是接收机接收到的第9位数据,该数据正好来自发送机的TB8。
TI:发送中断标志位。发送前必须用软件清零,发送过程中TI保持零电平,发送完一帧数据后,由硬件自动置1。如要再发送,必须用软件再清零。
RI:接收中断标志位。接收前,必须用软件清零,接收过程中RI保持零电平,接收完一帧数据后,由片内硬件自动置1。如要再接收,必须用软件再清零。
② 电源控制寄存器PCON。PCON的字节地址为87H,无位地址,其格式如下:
PCON是为在CMOS结构的MCS-51单片机上实现电源控制而附加的,对于HMOS结构的MCS-51系列单片机,除了第7位外,其余都是虚设的。与串行通信有关的也就是第7位,称作SMOD,它的用处是使数据传输率加倍。
SMOD:数据传输率加倍位。在计算串行方式1,2,3的数据传输率时;0表示不加倍;1表示加倍。
其余有效位说明如下。
GF1、GF2:通用标志位。
PD:掉电控制位,0表示正常方式,1表示掉电方式。
IDL:空闲控制位,0表示正常方式,1表示空闲方式。
除了以上两个控制寄存器外,中断允许寄存器IE中的ES位也用来作为串行I/O中断允许位。当ES=1,允许
串行I/O中断;当ES=0,禁止串行I/O中断。中断优先级寄存器IP的PS位则用作串行I/O中断优先级控制位。当PS=1,设定为高优先级;当PS
=0,设定为低优先级。
单片机可以通过软件设置串行口控制寄存器SCON中SM0(SCON.7)和SMl(SCON.6)来指定串行口的4种工作方式。串行口操作模式选择如表5-2所示。
表5-2 串行口操作模式选择表
同步移位寄存器
可变(T1溢出率)
fOSC/64或fOSC/32
可变(T1溢出率)
其中,fosc是振荡器的频率,UART为通用异步接收和发送器的英文缩写。下面对这4种工作模式作进一步介绍。
当设定SM1、SM0为00时,串行口工作于方式0,它又叫同步移位寄存器输出方式。在方式0下,数据从
RXD(P3.0)端串行输出或输入,同步信号从TXD(P3.1)端输出,发送或接收的数据为8位,低位在前,高位在后,没有起始位和停止位。数据传输
率固定为振荡器的频率1/12,也就是每一机器周期传送一位数据。方式0可以外接移位寄存器,将串行口扩展为并行口,也可以外接同步输入/输出设备。
执行任何一条以SBUF为目的的寄存器指令,就开始发送。
当设定SM1、SM0为01时,串行口工作于方式1。方式1为数据传输率可变的8位异步通信方式,由TXD发
送,RXD接收,一帧数据为10位,1位起始位(低电平),8位数据位(低位在前)和1位停止位(高电平)。数据传输率取决于定时器1或2的溢出速率
(1/溢出周期)和数据传输率是否加倍的选择位SMOD。
对于有定时器/计数器2的单片机,当T2CON寄存器中RCLK和TCLK置位时,用定时器2作为接收和发送的数据传输率发生器,而RCLK=TCLK=0时,用定时器1作为接收和发送的数据传输率发生器。两者还可以交叉使用,即发送和接收采用不同的数据传输率。
类似于模式0,发送过程是由执行任何一条以SBUF为目的的寄存器指令引起的。
当设定SM0、SM1二位为10时,串行口工作于方式2,此时串行口被定义为9位异步通信接口。采用这种方式 可接收或发送 11 位数据,以
11 位为一帧,比方式 1 增加了一个数据位,其余相同。第 9 个数据即 D8
位用作奇偶校验或地址/数据选择,可以通过软件来控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51
单片机串行口适用于多机通信。发送时,第9位数据为TB8,接收时,第9位数据送入RB8。方式 2
的数据传输率固定,只有两种选择,为振荡率的 1/64 或 1/32 ,可由 PCON 的最高位选择。
当设定SM0、SM1二位为11时,串行口工作于方式3。方式3与方式2类似,唯一的区别是方式3的数据传输率是可变的。而帧格式与方式2一样为11位一帧。所以方式3也适合于多机通信。
数据传输率的确定
串行口每秒钟发送(或接收)的位数就是数据传输率。
对方式0来说,数据传输率已固定成fosc/12,随着外部晶振的频率不同,数据传输率亦不相同。常用的fosc有12MHz和6MHz,所以数据传输率相应为0&103bit/s。在此方式下,数据将自动地按固定的数据传输率发送/接收,完全不用设置。
对方式2而言,数据传输率的计算式为2SMOD·fosc/64。当SMOD=0时,数据传输率为fm/64;当SMOD=1时,数据传输率为fosc/32。在此方式下,程控设置SMOD位的状态后,数据传输率就确定了,不需要再作其他设置。
对方式1和方式3来说,数据传输率和定时器1的溢出率有关,定时器1的溢出率为:
定时器1的溢出率=定时器1的溢出次数/秒
方式1和方式3的数据传输率计算式为:
2SMOD/32&T1溢出率
根据SMOD状态位的不同,数据传输率有Tl/32溢出率和T1/16溢出率两种。由于T1溢出率的设置是方便的,因而数据传输率的选择将十分灵活。
前已叙及,定时器Tl有4种工作方式,为了得到其溢出率,而又不必进入中断服务程序,往往使T1设置在工作方式2的运行状态,也就是8位自动加入时间常数的方式。
表5-3所示常用数据传输率的设置方法。
表5-3 常用数据传输率设置方法
数据传输率/Hz
重新装入值
方式0最大:1M
方式2最大:375k
方式1、3:62.5k
串行通信实例
这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收和查询发送。
#include &reg51.h&
#include &string.h&
#define length 4
//数据长度
unsigned char inbuf[length];
unsigned char checksum,
bit flag = 0;
//取数标记
init_serial();
//串行口初始化
if (flag!=0)
//如果取数标志已置位,就将读到的数从串口发出
//取数标志清0
send_string(inbuf,length);
//向串口发送字符串
void init_serial( void )
SCON = 0x50;
//串行工作方式1, 8位异步通信方式
TMOD |= 0x20;
//定时器1, 方式 2, 8位自动重装
PCON |= 0x80;
//SMOD=1,表示数据传输率加倍
TH1 = 0xF4;
//数据传输率:4800 fosc=11.0592MHz
IE |= 0x90;
//允许串行中断
//启动定时器1
void send_char( unsigned char x)
while (TI== 0 );
void send_string( unsigned char *s, unsigned int string_length)
unsigned int i= 0;
send_char(*(s + i));
//向串口发送一个字符
while ( i&string_length);
void serial () interrupt 4 using 3
//接收字符
if ( x& 127 )
counter= 0;
inbuf[counter]=x;
checksum= x- 128;
counter++;
inbuf[counter]=x;
checksum ^=
if ((counter==(length- 1)) && (!checksum))
//如果串口接收的数据达到length个,且校验没错,
//就置位取数标志
资料整理自:/mikenoodle/blog/item/53920ffaee908a.html
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C51单片机和电脑串口通信电路图与源码
& &&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&C51单片机和电脑串口通信电路图与源码51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 ;这是一个S51单片机实验开发板向PC机的串口单向发送数据AF的演示程序 ;采用MAX232专用芯片作RS232/TTL电平转换. ;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平) ;就发送一个16进制的AF字符 ORG 0000H MOV SCON,#50H;设置成串口1方式 MOV TMOD,#20H;波特率发生器T1工作在模式2上 MOV PCON,#80H;波特率翻倍为0BPS MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值) MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值) SETB TR1;启动定时器T1 ;以上完成通讯初始化设置 WRIT:JB P3.6,$;判断K1是否按下,如果没有按下就等待 ACALL DELAY10;延时10毫秒消触点抖动 JB P3.6,WRIT;去除干扰信号 JNB P3.6,$;等待按键松开 MOV A,#0AFH;将16进制的字符AF发送到串口去 MOV SBUF,A;将AF通过串口发送出去 AJMP WRIT ;10毫秒延时子程序 DELAY10:MOV R4,#20 D2:MOV R5,#248 DJNZ R5,$ DJNZ R4,D2 RET END ;=============两机串口通讯程序(主机)=====================; 功 能: 使用串行中断,接收数据并显示 ; 硬件环境: 自制单片机实验板 ; 软件环境: 伟福 V3.20 ; Create date:
; First Modify:
; second Modify: ; Last Modify:
; Author: Sujiande ; ;===========预定义===================LED0 EQU 40H ;预定义数码管 LED1 EQU 41H ;预定义数码管LED2 EQU 42H ;预定义数码管 LED3 EQU 43H ;预定义数码管 LED4 EQU 44H ;预定义数码管 LED5 EQU 45H ;预定义数码管 LED6 EQU 46H ;预定义数码管 LED7 EQU 47H ;预定义数码管 SDA BIT P0.1 ; 定义数据线引脚定义 SCL BIT P0.0 ; 定义时钟线引脚定义 ;--------------------------- ORG 0000H ;主程序入口 AJMP MAIN ;跳转到主程序 ORG 0100H ;主程序在ROM中存放位置 ;===============主程序=====================MAIN: MOV LED0,#00H ;赋初值 MOV LED1,#00H MOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭 MOV LED3,#16 MOV LED4,#16 MOV LED5,#16 MOV LED6,#16 MOV LED7,#16 ;-------------------- ;MOV DPTR,#TABLE ; 赋显示代码首地址 MOV R1,#00H ; 给R1赋初值00H ACALL DISPLAY ; 调显示子程序 MOV SP, #30H ; 给堆栈指针赋初值 ;-------------------------- ; 使用定时器1,作为波特率发生器,设定波特率=9600, ; 定时器初值为:FAH ; 串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0, ; RB8=0,TI=0,RI=0 即B ; 波特率加倍 ;----------------------------- MOV TMOD,#20H ;设置定时器1,工作方式2 MOV TH1,#0FA赋初值: FA MOV TL1,#0FA赋初值: FA MOV SCON, #50设置串行口控制寄存器 MOV PCON, #80设置电源控制寄存器, 让波特率加倍(2X) SETB TR1 ;启动定时 ;*****************主程序结束************************ LP8: MOV A,R1 ;将1的数据装到A中 ;----------------------- MOV SBUF,A ;将A的数据送到缓冲区 JNB TI,$ ;等待数据发送完毕 CLR TI ;清发送中断标志 ;----------------------- INC R1 CJNE R1,#99,LP3 MOV R1,#00H LP3: ACALL SEPERATE ;调拆分程序 ACALL DISPLAY ;调显示子程序 ACALL DELAY_1S ;调延时子程序 AJMP LP8 ;=================拆分程序=====================SEPERATE: ANL A,#0F与操作得到个位数据 MOV LED0,A ;个位送LED0 MOV A,R1 ANL A,#0F0H ;与操作得到十位数据 SWAP A MOV LED1,A ;十位送LED1 RET ;===============显示子程序=====================DISPLAY: MOV DPTR,#TABLE ; 赋显示代码首地址 MOV A,LED0 ;查表数据送A MOVC A,@A+DPTR ;查表,得到显示代码 ACALL SHIFT ;调移位子程序 MOV A,LED1 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED2 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED3 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED4 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED5 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED6 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED7 MOVC A,@A+DPTR ACALL SHIFT RET ;---------显示代码表--------- TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,灭,- ;================移位子程序============================SHIFT: PUSH A ; 进栈暂存A值 MOV R0,#8 ; 循环8次 CLR C ;清进位标志 CLR SCL ;时钟线,先钳位为0 LP2: RLC A MOV SDA,C NOP NOP SETB SCL NOPNOP CLR SCL NOP NOP DJNZ R0,LP2 POP A ; 出栈恢复A值 RET ;=============延时子程序===============DELAY_1S: MOV R7,#0ffH LOOP7: MOV R6,#0ffH LOOP6: NOP NOP NOP NOP NOP NOP DJNZ R6,LOOP6 DJNZ R7,LOOP7 RET ;------------------------------ END ;=============两机串口通讯程序(从机)=====================; 功 能: 使用串行中断,接收数据并显示 ; 硬件环境: 自制单片机实验板 ; 软件环境: 伟福 V3.20 ; Create date:
; First Modify:
; second Modify: ; Last Modify:
; Author: Sujiande ;===========预定义===================LED0 EQU 40H ;预定义数码管 LED1 EQU 41H ;预定义数码管 LED2 EQU 42H ;预定义数码管 LED3 EQU 43H ;预定义数码管 LED4 EQU 44H ;预定义数码管 LED5 EQU 45H ;预定义数码管 LED6 EQU 46H ;预定义数码管 LED7 EQU 47H ;预定义数码管 SDA BIT P0.1 ; 定义数据线引脚定义 SCL BIT P0.0 ; 定义时钟线引脚定义 ;--------------------------- ORG 0000H ;主程序入口 AJMP MAIN ;跳转到主程序 ORG 0023H ;中断入口地址 AJMP S_INT ;跳转到中断程序 ORG 0100H ;主程序在ROM中存放位置 ;==============主程序========================MAIN: MOV LED0,#00H ;赋初值MOV LED1,#00H MOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭 MOV LED3,#16MOV LED4,#16 MOV LED5,#16 MOV LED6,#16 MOV LED7,#16 ;------------------------------ MOV DPTR,#TABLE ; 赋显示代码首地址 ACALL DISPLAY ; 调显示子程序 MOV SP, #30H ; 给堆栈指针赋初值 ;-------------------------------------------- ; 使用定时器1,作为波特率发生器,设定波特率=9600, ; 定时器初值为:FAH ; 串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0, ; RB8=0,TI=0,RI=0 即B ; 波特率加倍 ;--------------------------------------------- MOV TMOD,#20H ;设置定时器1,工作方式2 MOV TH1,#0FA赋初值: FAMOV TL1,#0FA赋初值: FA MOV SCON, #50设置串行口控制寄存器 MOV PCON, #80设置电源控制寄存器, 让波特率加倍(2X) ;--------------------------------------- SETB EA ; 启动总中断 SETB ES ; 启动串行中断 SETB TR1 ;启动定时 AJMP $ ; 等待中断 ;*****************主程序结束************************ ;===============中断服务程序=============================S_INT: MOV R1, SBUF ;将缓冲区的数据送到R1 ACALL SEPERATE ;调拆分程序 ACALL DISPLAY ;调显示子程序 CLR RI ;清接收中断标志 RETI ;中断返回 ;=================拆分程序=====================SEPERATE: MOV A,R1 ANL A,#0F与操作得到个位数据 MOV LED0,A ;个位送LED0 MOV A,R1 ANL A,#0F0H ;与操作得到十位数据 SWAP A ; MOV LED1,A ;十位送LED1 RET ;===============显示子程序======================DISPLAY: MOV A,LED0 ;查表数据送A MOVC A,@A+DPTR ;查表,得到显示代码 ACALL SHIFT ;调移位子程序 MOV A,LED1 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED2 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED3 MOVC A,@A+DPTR ACALL SHIFTMOV A,LED4 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED5 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED6 MOVC A,@A+DPTR ACALL SHIFT MOV A,LED7 MOVC A,@A+DPTR ACALL SHIFT RET ;---------显示代码表--------- TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,灭,- ;================移位子程序============================SHIFT: PUSH A ; 进栈暂存A值 MOV R0,#8 ; 循环8次 CLR C ;清进位标志 CLR SCL ;时钟线,先钳位为0 LP2: RLC A MOV SDA,C NOP NOP SETB SCL NOP NOP CLR SCL NOP NOP DJNZ R0,LP2 POP A ; 出栈恢复A值 RET ;=============延时子程序===============DELAY_1S: MOV R7,#0ffH LOOP7: MOV R6,#0ffH LOOP6: NOP NOP NOP NOP NOP NOP DJNZ R6,LOOP6 DJNZ R7,LOOP7 RET ;------------------------------ END

我要回帖

更多关于 c51单片机串口通信 的文章

 

随机推荐