【51单片机】串口通信进阶应用案例解析

一、题目

二、编程

2.1 经常需要添加的AUXR辅助寄存器

用到串口就要对辅助寄存器AUXR进行操作,只有两步,首先在开头加上sfr AUXR =0x8e,然后在串口初始化函数中对AUXR赋0x00

2.2 初始化系统函数

InitSystemLED灯是低电平有效,Y5C控制的元器件是低电平有效,因为从HC573寄存器出来后接了一个达林顿管,取反了,所以给高电平有效。

2.3 和中断有关的函数

初始化串口 InitUart 函数,首先设置定时器的模式,利用TMOD模式控制寄存器

经常给TMOD赋值0x20.

然后设置波特率9600,因为是用的自动重装的8位定时器,参考下图,给TH1和TL1赋0xfd。这也是最常见的情况之一。

然后给串口控制寄存器SCON赋值。这也是很常见的情况,8位的UART,允许接收,SCON = 0x50 ;

2.4 如何给上位机发送字符串

void SendByte(unsigned char dat)
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}


------------------------------------------------------------------
void SendString(unsigned char *str) 
{
	while(*str != '\0')
	{
		SendByte(*str++);
	}
}

发送一个字符串其实就是不断地调用SendByte,字符串实际上可以看成是一个数组,用字符型的指针一个一个发,因为数组最后一个数据是'\0',可以用循环判断,把整个字符串一个字符一个字符发送。在发送或者接收过程中,应该注意在完成发送或者接收后标志位的初始化。

三、代码

#include "reg52.h"

sfr AUXR = 0x8e;

void SendByte(unsigned char dat);

void SelectHC573(unsigned char channel)
{
	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;
	}
}


void InitSystem()
{
	SelectHC573(5);     //Y5C控制STEPA、STEPB、STEPC、STEPD、继电器RELAY、马达、蜂鸣器。注意,这里只有7个口,第八个口P07没有连接达林顿管,直接连接N_SPK。
	P0 = 0x00 ;					//连接了达林顿管,取了反的,所以是高电平有效,全部位赋零关闭。
  SelectHC573(4);     //Y4C控制LED灯,低电平有效,给P0全部位赋1,关闭所有灯。
	P0 = 0xff;
}

//***********和中断有关的函数*****************
void InitUart()
{
	TMOD = 0x20;  //TMOD模式控制寄存器
	TH1 = 0xfd;
	TL1 = 0xfd;
	TR1 = 1 ;
	
	SCON = 0x50 ; //串口控制寄存器SCON,模式1,八位UART,允许接收
	
	ES = 1;
	EA = 1;
	
	AUXR = 0x00;
	
}

unsigned char command = 0x00;


void ServiceUart() interrupt 4   //串口中断,4号中断
{
	if(RI == 1)
	{
		command = SBUF ; 
		RI = 0;
	}
	
}




//*******************************************


//***************发送函数********************


void SendString(unsigned char *str)   //实际上数组,用字符型的指针一个一个发,数组最后一个是'\0'.
{
	while(*str != '\0')
	{
		SendByte(*str++);
	}
}


void SendByte(unsigned char dat)
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}


//*******************************************

void Working()
{
	if(command != 0x00)
	{
		switch(command & 0xf0)
		{
			case 0xa0:
				P0 = (P0 | 0x0f) & (~command | 0xf0);
			command = 0x00;
			break;
			case 0xb0:
				P0 = (P0 | 0xf0) & ((~command <<4 )  | 0x0f);
			command = 0x00;
			break;
			case 0xc0:
				SendString("The System is Running...\r\n");
			  command = 0x00;
			break;
		}
	}
}


void main()
{
	InitSystem();
	InitUart();
	SendString("Welcome to XMF System!\r\n");
	while(1)
	{
		Working();
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答关于51单片机串口通信的问题。下面是关于51单片机串口通信模板的详细介绍以及通信实例。 1. 51单片机串口通信模板 51单片机与外部设备进行串口通信,需要设置串口的一些参数,包括波特率、数据位、校验位和停止位等。以下是51单片机串口通信模板的代码: ```c #include <reg52.h> #include <stdio.h> #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; sbit LED = P1^0; void UART_Init(); void SendData(BYTE dat); void SendString(char *s); void main() { UART_Init(); while(1) { LED = ~LED; SendString("Hello, world!\r\n"); delay(1000); } } void UART_Init() { TMOD &= 0x0F; TMOD |= 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; SCON = 0x50; ES = 1; EA = 1; } void SendData(BYTE dat) { SBUF = dat; while(TI == 0); TI = 0; } void SendString(char *s) { while(*s) { SendData(*s++); } } ``` 在上面的代码中,我们定义了一个LED灯,在主函数中通过串口发送“Hello, world!”字符串,并控制LED灯闪烁。在UART_Init()函数中,我们设置了串口的一些参数,包括波特率、数据位、校验位和停止位等。 2. 51单片机串口通信实例 以下是一个简单的51单片机串口通信实例,它通过串口接收PC机发送的数据,并将其原封不动地发送回去: ```c #include <reg52.h> #include <stdio.h> #define FOSC 11059200L #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD; sbit LED = P1^0; void UART_Init(); void SendData(BYTE dat); void SendString(char *s); void main() { BYTE c; UART_Init(); while(1) { if(RI) { c = SBUF; RI = 0; SendData(c); LED = ~LED; } } } void UART_Init() { TMOD &= 0x0F; TMOD |= 0x20; TH1 = TL1 = -(FOSC/12/32/BAUD); TR1 = 1; SCON = 0x50; ES = 1; EA = 1; } void SendData(BYTE dat) { SBUF = dat; while(TI == 0); TI = 0; } void SendString(char *s) { while(*s) { SendData(*s++); } } ``` 在上面的代码中,我们定义了一个LED灯,在主函数中通过串口接收PC机发送的数据,并将其原封不动地发送回去。同时,每当接收到数据时,LED灯会闪烁一次。 以上就是关于51单片机串口通信模板和通信实例的介绍,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值