admin管理员组

文章数量:1591988

1.串口介绍

串口(是通讯接口)可以实现两个设备的互相通信,单片机与单片机,单片机与电脑,或与各式各样的模块进行通信,增强单片机系统的硬件实力。

STC89C52系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多人并行I/O口,或作串一并转换,或用于扩展串行外设等。

STC89C52系列单片机的串行口设有两个控制寄存器: 串行控制寄存器SCON和波特率选择特殊功能寄存器PCON,单片机内部自带UART,可实现单片机的串口通信。

STC89c52设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。两个缓冲器统称串行通信特殊功能寄存器SBUF。 

STC89C52有1个UART
STC89C52的UART有四种工作模式:
    模式0:同步移位寄存器
    模式1:8位UART,波特率可变(常用)
    模式2:9位UART,波特率固定
    模式3:9位UART,波特率可变

波特率:串口通信的速率(发送和接收各数据位的间隔时间) 


检验位:用于数据验证
停止位:用于数据帧间隔

2.源代码

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

unsigned char Sec;

void main()
{
	UART_Init();	//初始化调用函数
	while(1)
	{

	}
}

void UART_Routine() interrupt 4   //小尾巴interrupt跟谁后面谁就是中断函数
{
	if(RI==1)
	{
		P2=~SBUF;
		UART_SendByte(SBUF);
		RI=0;
	}
}

UART.c

#include <REGX52.H>

/**
  * @brief 串口初始化,//4800bps@11.0592MHz
  * @param 无
  * @retval 无
  */
void UART_Init()            //4800bps@11.0592MHz
{
	SCON=0x50;
	PCON |= 0x80;
	TMOD &= 0x0F;			//设置定时器模式
	TMOD |= 0x20;			//设置定时器模式
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	EA=1;               //使能,中断
	ES=1;               //允许接收
}

/**
  * @brief 串口发送一个字节数据
  * @param Byte要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;
}

/*  串口中断函数模板  用的时候放主函数main里
void UART_Routine() interrupt 4   //小尾巴interrupt跟谁后面谁就是中断函数
{
	if(RI==1)
	{

		RI=0;
	}
}
*/

UART.h

#ifndef __UART_H__
#define __UART_H__

void UART_Init();            

void UART_SendByte(unsigned char Byte);

#endif

用上面三个模块就可以使用电脑向单片机发送指令来控制LED。

如果想让电脑以一定的频率接收到单片机发来的指令那么还需要Delay函数。

Delay.c

#include <REGX52.H>

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器  
STC89C52系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。 

TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。

RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例情况见SM2说明),必须由软件复位,即RI=0。

【注】:串口通信初始化代码也可以从STC-ISP中获取:

 这里是基于晶振是11.0592MHz的单片机,像12MHz或其他频率的将系统频率进行更换即可。

最后在进行发送数据或接收数据时也需要注意STC-ISP是否调完好

这里的串口必须与扫描串口一致,波特率为4800。

HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
文本模式/字符模式:以原始数据编码后的形式显示
使用文本模式输出的数据会发生相应变化,这里多食用HEX模式保证数据无误。

3.效果图

 此时在电脑上发送的数据是FF,对应单片机所有的LED显示亮起来

本文标签: 串口单片机代码通信电脑