蓝桥杯学习笔记 单片机CT107D 串口通信

本文详细介绍了串口通信的基本概念,特别是在CT107D中的串口1工作模式1使用,包括寄存器设置、波特率计算、中断处理以及字符串发送与接收。还给出了一个实际应用示例,如LED控制系统通过串口接收指令进行操作。
一.串口通信简介:
  • 串口是串行接口(serial port)的简称,也称为 串行通信接口 或 COM接口。

  • 串口通信是指采用串行通信协议(serial communication)在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式

  • 在串行通信中,数据在1位宽的单条线路上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。(但接受和发送不在一条线上进行)

二.CT107D中串口通信的使用: 

对照数据手册:我们一般使用串口1的工作模式一(8位UART,波特率一般使用9600)

1.工作模式1介绍

7965d348535a44a3ac69461aa112fa4c.png

2.寄存器介绍

2659e0c3b4e54d4cbc42075e9e04c868.png

SM0.SM1:工作模式设定(一般是01设定为工作模式1)

SM2:多机通信控制位,模式1位单机模式,置0即可

REN:置1允许串口接收

TB8,RB8:置0即可

TI,RI:初始化时置0即可

附:若使用reg52.h头文件则需要将AUXR寄存器设为0x00.

总结一下流程:

  • 接收:数据有效后内部硬件将RI置1并触发中断,此时数据再SBUF寄存器内,读取即可,同时不能忘记用软件将RI置1.
  • 发送:将要发送的数据放入SBUF中,等待硬件把TI置1,发送完成,之后用软件将TI置0

 3.波特率选择

串口通信需要使用计时器1来实现波特率的定义

ced6354953974de6bdcd4d48c9ac8675.png

参考手册,设为0xfd即可

4.示例

 初始化:

//如果使用reg52.h头文件需要提前定义AUXR寄存器 (地址为0x8e)
void UART_Init()
{
	TH1=0xFD;//波特率定义
	TL1=0xFD;
	TMOD=0x20;//计时器模式设定
	AUXR=0x00;
	SCON=0x50;//串口初始化
	TR1=1;//打开计时器1
	ES=1;//打开串口中断
	EA=1;//打开总中断
}

接收(在中断函数中实现)

void UART_Service() interrupt 4
{
	if(RI==1)
	{
		Command=SBUF;
		RI=0;
	}
}

发送:

void UART_SendByte(unsigned char databyte)
{
	SBUF=databyte;
	while(TI==0);
	TI=0;
}

字符串发送:

利用指针的移位,一个字节一个字节的发送,直到结束为'\0'

void UART_Sendstring(unsigned char *str)
{
	while(*str!='\0')
	{
		UART_SendByte(*str++);
	}
}

字符串接收+判断

void UART_Service() interrupt 4//字符串接收
{
	unsigned char temp=0;
	if(RI==1)
	{
		temp=SBUF;
		RI=0;
		Receive[len++]=temp;
	}
}
void UART_deal()//判断,以接收Retur为例子n
{
	if(len==6)
	{
		if(Receive[0]=='R'&&Receive[1]=='e'&&Receive[2]=='t'&&Receive[3]=='u'&&Receive[4]=='r'&&Receive[5]=='n')
		{
			//执行一定操作
			len=0;
		}
		else{
			len=0;
		}
	}
}
三.练习:

这里借用一些小蜜蜂老师的题目

7400a0889a2b474e9b00ce4b64a24808.png

为图方便,我这里使用了stc15f2k60s2头文件,这样就不用自己去定义AUXR寄存器了

#include <STC15F2K60S2.H>
unsigned char Command=0x00;
unsigned char LED_Mode;
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P0=dat;
	switch(channel)
	{
		case 4:
			P2=(P2&0x1f)|0x80;
		break;
		case 5:
			P2=(P2&0x1f)|0xa0;
		break;
		case 6:
			P2=(P2&0x1f)|0xc0;
		break;
		case 7:
			P2=(P2&0x1f)|0xe0;
		break;
		case 0:
			P2=(P2&0x1f)|0x00;
		break;
	}
	P2=(P2&0x1f)|0x00;
}
void UART_Init()
{
	TH1=0xFD;
	TL1=0xFD;
	TMOD=0x20;
	AUXR=0x00;
	SCON=0x50;
	TR1=1;
	ES=1;
	EA=1;
}
void UART_Service() interrupt 4
{
	if(RI==1)
	{
		Command=SBUF;
		RI=0;
	}
}
void UART_SendByte(unsigned char databyte)
{
	SBUF=databyte;
	while(TI==0);
	TI=0;
}
void UART_Sendstring(unsigned char *str)
{
	while(*str!='\0')
	{
		UART_SendByte(*str++);
	}
}
void LED_Control()
{
	if(Command!=0x00)//判断是否有指令过来
	{
		switch(Command&0xF0)
		{
			case 0xA0:
				LED_Mode=((~Command)|0xf0)&(0x0f|LED_Mode);//取出Cmooand低四位,将LED_Moded低四位置1
				SelectHC573(4,LED_Mode);
			break;
			case 0xB0:
				LED_Mode=((~Command<<4)|0x0f)&(0x0f|LED_Mode);//取出Command第四位放在高四位上
				SelectHC573(4,LED_Mode);
			break;
			case 0xc0:
				UART_Sendstring("The system is runnig...\r\n");
		}
	}
	Command=0x00;
}
void Sys_Init()
{
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	UART_Init();
	UART_Sendstring("Welcome to XMF system!\r\n");
}

void main()
{
	Sys_Init();
	while(1)
	{
		LED_Control();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值