51单片机(V51)学习——串口通讯

导读:本篇文章讲解 51单片机(V51)学习——串口通讯,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、串口通讯的概念和用到的寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、简单使用

头文件:

/*********************************************************************
 *
 *                          bstv51.h
 *
 *********************************************************************
 * 文件名: bstv51.h
 * 描  述: BST-V51开发板头文件
 ********************************************************************/

#ifndef bstv51_H
#define bstv51_H

/*变量类型标识的宏定义,通常做法*/
#define uchar unsigned char //8 0-255
#define uint unsigned int   //16  0-65535
#define ON 1
#define OFF 0

/*定义晶振频率(单位 Hz)*/
#define FOSC  11059200 
//#define FOSC  12000000 
//#define FOSC  22118400 


/* BST-V51 引脚定义 */
sbit L0  = P1^0; //LED0引脚
sbit L1  = P1^1;
sbit L2  = P1^2;
sbit L4  = P1^4;
sbit L5  = P1^5;
sbit L6  = P1^6;
sbit L7  = P1^7;

sbit RS  = P1^0;   //RS为寄存器选择,1=数据寄存器、0=指令寄存器。
sbit RW  = P1^1;   //RW为读写信号线,1=读操作,0=写操作。
                   //当RS=RW=0可以写入指令或者显示地址,
                   //当RS=0,RW=1可以读忙信号,
                   //当RS=1,RW=0可以写入数据。

sbit SDI  = P1^5;  //DS1302
sbit SDO  = P1^6;  //DS1302
sbit SCK  = P1^7;  //DS1302


sbit EN	 = P2^5;   //当EN端由高电平跳变成低电平时,液晶模块执行命令。
sbit CS  = P2^6;
sbit RST = P2^7;   //DS1302时钟
sbit RX  = P3^0;
sbit TX  = P3^1;
sbit IR  = P3^2;
sbit B20 = P2^4;
sbit FM =  P2^3;

sbit DU=P2^6;
sbit WE=P2^7;

/*为方便使用,部分管脚的多重定义*/

#define CLK SW0
#define DAT SW1




//系统初始化函数
void bstv51_init(void);/*BST-V51开发板主板初始化*/


#endif

(1)不使用倍增下:

#include<reg52.h>
#include "bstv51.h"

void initData()
{
	TMOD = 0x20;   //	0010 0000 来启动计时器1的工作方式2
	TH1  = 0xfd;   //	设置计时器1 的波特率 fd = 9600
	TL1  = 0xfd;	//	fd 对应 波特率9600
	PCON = 0x00;   //	0x80表示 让波特率开启倍增  0x00 表示不倍增,正常值
	SCON = 0x50;   //	设置工作方式为1下,开启接受允许
	EA  = 1;	   //	开启全局中断
	ES  = 1;	   //	开启串口中断
	TR1 = 1;	   //	让计时器1开始启动,也就是开始计时
}

void main()
{
	bstv51_init(); //   初始化一些端口
	initData();	   //	初始化配置的计时器
	while(1) 
	{
		;
	}
}

void uarttime()interrupt 4
{
	uchar date;
	date=SBUF;        //	取出接受到的数据
	RI=0;			  //	清除接受中断标志位	  RI = 1的时候就是接受数据完毕
	SBUF=date;		  //	接收到的数据放入发送缓存器发送
	while(!TI);       //	等待发送数据完成  , 没有完成下 TI 都为 0
	TI=0;			  //	清除发送完成标志位
}

在这里插入图片描述

(2)用倍增下:

#include<reg52.h>
#include "bstv51.h"

void initData()
{
	TMOD = 0x20;   //	0010 0000 来启动计时器1的工作方式2
	TH1  = 0xfd;   //	设置计时器1 的波特率 fd = 9600
	TL1  = 0xfd;	//	fd 对应 波特率9600
	PCON = 0x80;   //	0x80表示 让波特率开启倍增  0x00 表示不倍增,正常值
	SCON = 0x50;   //	设置工作方式为1下,开启接受允许
	EA  = 1;	   //	开启全局中断
	ES  = 1;	   //	开启串口中断
	TR1 = 1;	   //	让计时器1开始启动,也就是开始计时
}

void main()
{
	bstv51_init(); //   初始化一些端口
	initData();	   //	初始化配置的计时器
	while(1) 
	{
		;
	}
}

void uarttime()interrupt 4
{
	uchar date;
	date=SBUF;        //	取出接受到的数据
	RI=0;			  //	清除接受中断标志位	  RI = 1的时候就是接受数据完毕
	SBUF=date;		  //	接收到的数据放入发送缓存器发送
	while(!TI);       //	等待发送数据完成  , 没有完成下 TI 都为 0
	TI=0;			  //	清除发送完成标志位
}

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68454.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!