`
yunchow
  • 浏览: 328072 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

51系列单片机之串口通信

阅读更多
    单片机的串口通信看起来是很复杂的,主要是因为他用到了更多的寄存器,与前面的知识相比他更具综合能力,写起来考虑的问题自然也变多了.而前面学习过的定时器与中断将是单片机通信的基础.
     单片机的中断系统中第4个中断就是串口中断,要进行串口通信首先就要打开CPU总中断EA,还要打开串口通信中断ES,这是串口通信的前堤,而串口通信也跟计时器一样有很多的模式,因此我们还要设置SCON寄存器来指定采用哪一种方式进行通信,而在通信的过程中,我们还要设定通信的波特率,不然的话,单片机是没办法进行采样的,这样也不会得到正确的结果了.我在实验过程中用到的是1号定时器来设定的波特率,用到了计时器方式2,也就是8位自动重装,这样可以简化编程,她的实现思想就是将常数放入TH,而TL中则是初始化参数,当溢出时,单片机会自动将TH中的常数装入TL中.



    再来说说波特率,我们为什么要设定波特率,因为单片机会以16倍波特率的速度进行采样,而在实验中我们用的是10位异步收发方式,因此要将SM0置0,SM1置1.而其中的10位有8位数据位,第一位和最后一位是发送数据的起始与结束.采用高的皮特率就不会出错啦.而波特率是有一个公式的:
方式0的波特率 =  fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
T1 溢出率 = fosc /{12×[256 -(TH1)]}
根据公式我们很容易就算出当晶振为110592HZ时,要达到9600的波特率,我们只需要将TL1置FDH即可,如下图:

  除此之外,你还要将SCON中的REN位置1,不然的话,单片机是不会接收数据的.
  还有不要忘了选择定时器的工作方式,设置TMOD为0x20既是工作方式2,8位自动重装定时器.
  这样一来,初始批工作算是差不多了.而串口通信分为中断方式,和查询方式,如果你想用查询方式你也不用设置IE寄存器了.
   在串口通信中,还有一个很重要的寄存器SBUF,其实也不是一个,是两个,只是它们共用同一个地址,再热气表达式的不同,单片机会自动选择使用哪一个SBUF.
   下面是我写的一个例子程序,产生的效果是:向单片机发送任一个0~255之间的数,将会被显示到数码管上.并且单片机还会自动把刚才传过去的数又发送回来 ,实验过程中用到了几个工具如下:
    串口调试助手V2.1.exe,51串口波特率计算器.exe(我已打包在附件中)还有一些必用的就不说了.
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit sda = P1^0;
sbit clk = P1^1;
sbit dig1 = P1^2;
sbit dig2 = P1^3;
sbit dig3 = P1^4;
sbit dig4 = P1^5;
uchar r,flag;
uchar code table[]={0x7e,0x0c,0xb6,0x9e,
					0xcc,0xda,0xfa,0x0e,
					0xfe,0xde,0xef,0xf9,
					0x72,0xb8,0xf2,0xe2};
void init();
void write(uchar);
void display(uchar);
void delay(uchar);

void main()
{
	init();
	while(1)
	{
		//查询方式通信
	 	//if(RI==1)  //RI为1表示收到一字节数据
		//{
		// 	RI = 0;//此步必不可少,因为硬件不能将其置0
		//	r = SBUF;
		//}
		display(r);	  //中断方式通信
		delay(10);
		if(flag==1)
		{
				flag = 0;
				ES = 0;
				SBUF = r;   //放送数据
				while(!TI);
				TI = 0;
				ES = 1;
		}

	}
}
/** 串口中断 **/
void ser() interrupt 4
{
	RI = 0;
	r = SBUF;
	flag = 1;	
}
/** 延迟函数 **/
void delay(uchar t)
{
	uchar x,y;
	for(x=t;x>0;x--)
		for(y=101;y>0;y--);
}
/** 初始化 **/
void init()
{
	dig1 = 1;
	dig2 = 1;
	dig3 = 1;
	dig4 = 1;

	r = 0xff;

	TMOD = 0x20;
	TH1 = 0xfd;
	TL1 = 0xfd;
	TR1 = 1;	//启动定时器1,从而设定了串口通信的波特率
	SM0 = 0;
	SM1 = 1;  //设定串口通信方式为十位异步收发器
	REN = 1;  //打开串口通信
	EA = 1;
	ES = 1;
}
/** 向数据码管写入一个字节数据 **/
void write(uchar u)
{
    uchar i;
	for(i=0;i<8;i++)
	{
		clk = 1;
		sda = u&0x80;
		clk = 0;
		u = u<<1;	
	}
}
/** 显示一个3位的整数 **/
void display(uchar num)
{
	uchar bai,shi,ge;
	bai = num/100;
	shi = num%100/10;
	ge = num%10;
	/* 显示个位 */
	dig4 = 0;
	write(table[ge]);
	delay(10);
	dig4 = 1;
	/* 显示百位 */
	if(bai!=0)
	{
		dig2 = 0;
		write(table[bai]);
		delay(10);
		dig2 = 1;

		/* 显示十位 */
		dig3 = 0;
		write(table[shi]);
		delay(10);
		dig3 = 1;
	}
	else
	{
		if(shi==0)
		{
	 		dig3 = 1;
			//delay(10);
		}
		else
		{
			/* 显示十位 */
			dig3 = 0;
			write(table[shi]);
			delay(10);
			dig3 = 1;
		}
	}
}


  • 大小: 94.3 KB
  • 大小: 34 KB
分享到:
评论
3 楼 yunchow 2009-04-06  
agurick 写道
恩那,同楼上,单片机有千万种,发贴请注明类型和芯片名称。

是有这个问题,马上改
2 楼 agurick 2009-04-06  
恩那,同楼上,单片机有千万种,发贴请注明类型和芯片名称。
1 楼 rubynroll 2009-04-05  
单片机=51...一个很奇特的现象.

相关推荐

    基于51单片机的串口通信(12864,汉字)proteus、原理图、流程图、物料清单、仿真图、源代码

    基于51单片机的串口通信(12864,汉字)proteus、原理图、流程图、物料清单、仿真图、源代码 基于51单片机的串口通信(12864,汉字) 单片机和PC机间的串口通信 1、甲乙单片机采用奇偶校验,进行方式3串行通信; 2、...

    51系列单片机开发宝典 (附盘)

    第15章 串行通信 第16章 LED及其应用 第17章 液晶显示 第18章 A/D转换 第19章 D/A转换 第20章 单片机与CPLD接口 第21章 单片机与I2C总线 第22章 AT指令与短信收发 第23章 步进电机控制 第24章 红外线接口 第25章 ...

    51单片机与串口通讯

    本节将详细介绍51单片机串口通信的实现方法,包括发送、接收和定时发送等功能。 ##### 1. 发送功能实现 在51单片机中,发送数据通常有两种方式:中断方式和查询方式。本例程采用了查询方式,这种方式虽然简单,但在...

    113-串口通讯(51单片机C语言实例Proteus仿真和代码)

    113-串口通讯(51单片机C语言实例Proteus仿真和代码)113-串口通讯(51单片机C语言实例Proteus仿真和代码)113-串口通讯(51单片机C语言实例Proteus仿真和代码)113-串口通讯(51单片机C语言实例Proteus仿真和代码)113-串口...

    51单片机 串口通信—数码管实验

    51单片机是微控制器领域中非常经典的一款芯片,主要应用于嵌入式...通过这个实验,我们可以学习如何利用51单片机进行串行通信,以及如何将接收到的信息在硬件层面进行处理和反馈,对嵌入式系统开发有着重要的实践意义。

    51单片机串行通信

    串行通信是51单片机中一个重要的功能模块,用于设备间的数据交换,尤其是在距离较远或者需要节省硬件资源的情况下。本文将深入探讨51单片机的串行通信,包括USART/UART接口的原理、配置方法以及如何实现双机通信。 ...

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

    在C51单片机中,串口通信是其重要的通信接口之一,它支持两种串行通信方式。C51单片机的串口(UART)硬件上实现串行数据的发送和接收功能,软件上需要根据通信协议编写相应的代码来设置通信参数(比如波特率、校验位...

    51单片机利用串口发送汉字

    ### 51单片机利用串口发送汉字 #### 知识点概述 本文将详细介绍如何使用51单片机通过串口发送汉字,并解析给定的代码示例。...该示例代码简洁明了,适合初学者学习理解51单片机串口通信的基本原理和技术要点。

    基于51单片机的双机串行通信设计

    本项目聚焦于“基于51单片机的双机串行通信设计”,旨在通过两个51系列单片机之间的数据交换,实现信息的传递与处理。这种通信方式对于小型化、低功耗系统的开发具有重要意义。 首先,我们来看“51单片机”。51系列...

    C51单片机和电脑串口通信电路图.pdf

    串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接。 五、实验步骤 将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。然后,在电脑端打开串口调试...

    51单片机串口通信C++源程序

    在“keil C下51单片机串口通信源程序”中,我们可以期待找到实现51单片机串口通信的C++代码示例。Keil μVision是一款常用的51单片机开发工具,集成了编译器、调试器和IDE。在Keil环境下编写C++程序,可以方便地进行...

    51单片机的串行通信485程序

    本程序涉及的是51单片机的串行通信技术,具体是使用RS-485通信协议。RS-485是一种工业标准,用于实现多点通信,它允许在长距离和噪声环境中进行数据传输,特别适合于传感器网络和远程控制应用。 串行通信相对于并行...

    51单片机串口通信实验

    《51单片机串口通信实验详解》 在电子技术领域,51单片机是一种广泛应用的微控制器,以其简单易用、成本低廉而深受工程师喜爱。串口通信是51单片机与外界设备交换数据的重要方式,特别是在与个人计算机(PC)进行...

    51单片机对51单片机的串口通信仿真

    通过这个51单片机串口通信仿真的学习,不仅可以掌握串口通信的基本原理,还能熟悉Proteus的使用方法,提升实际动手能力。对于初学者来说,这是一个很好的起点,为后续更复杂的嵌入式系统开发打下坚实基础。

    51单片机串口通信计算器

    总之,51单片机串口通信计算器结合了嵌入式系统的基本原理和串行通信技术,提供了在51单片机平台上实现数据交换和计算的解决方案。了解和掌握这些知识对于进行51单片机相关的开发工作至关重要。

    51系列单片机串口缓存

    在51系列单片机中,串口通常通过UART(通用异步收发传输器)实现,它允许单片机与外部设备进行串行通信。然而,在高数据速率或中断频繁的情况下,传统的串口处理方式可能会丢失数据,因为中断服务程序可能无法及时...

    单片机单片机课程设计-双机串行通信.doc

    在本文档中,我们讨论了基于51单片机的双机串行通信课程设计,主要涉及的关键技术包括51单片机、串行通信以及RS232接口。51单片机,尤其是89C51型号,是单片机领域的经典选择,其串行接口具有重要的应用价值。 串行...

    基于51单片机的串口通信

    51单片机支持串行通信,主要通过其内部的串行接口——UART(通用异步收发传输器)来实现。UART允许51单片机与其他设备进行串行数据交换,如显示器、键盘、其他单片机或计算机等。 首先,了解51单片机的串口结构。51...

    51系列单片机的功能和结构翻译

    - **汇编语言编程**:51单片机的指令集以汇编语言为主,掌握汇编语言可以更好地理解和优化程序。 - **中断系统**:了解如何配置和处理中断,能够提高单片机对外部事件的响应速度。 - **I/O端口操作**:学习如何利用...

    单片机_51单片机串口通信_

    "LESSON7_串口通信.ppt"则可能是一个详细的串口通信教程,其中涵盖了串口通信的基本概念、51单片机串口的硬件结构、初始化设置、数据传输流程、以及可能遇到的问题和解决方案。通过查阅这个PPT,可以得到更加系统和...

Global site tag (gtag.js) - Google Analytics