合泰杯——合泰单片机工程5之串口通信

   日期:2021-03-07     浏览:127    评论:0    
核心提示:合泰杯——合泰单片机工程5之串口通信前言一、usat例程分析?二、编写程序1.发送定时1秒发送字符2.读入数据总结前言这一章更新的是关于合泰单片机串口通信的内容,用的是HT66F2390的芯片和板子,使用e-link下载程序来调试。程序是借助合泰官方usat的例程来更改调试。程序实现的效果预计为定时1秒向串口调试助手发送“广东工业大学MFT微流控团队合泰单片机HT66F2390串口通信实验调试”,串口调试助手发送字符相应,单片机并返回相应的字符给调试助手。再加上一个发送0x01点亮LED1.提示

合泰杯——合泰单片机工程5之串口通信

  • 前言
  • 一、usat例程分析?
  • 二、编写程序
  • 总结

前言

这一章更新的是关于合泰单片机串口通信的内容,用的是HT66F2390的芯片和板子,使用e-link下载程序来调试。程序是借助合泰官方usat的例程来更改调试。程序实现的效果预计为定时1秒向串口调试助手发送“广东工业大学MFT微流控团队合泰单片机HT66F2390串口通信实验调试”,串口调试助手发送字符相应,单片机并返回相应的字符给调试助手。再加上一个发送0x01点亮LED1.

提示:以下是本篇文章正文内容,下面案例可供参考

一、usat例程分析?

我们先来看一下程序,前面没什么好说,就是定义和声明数据计数、数据的长度等,重点看下面条件编译的那部分,也是我标注的那一部分。

这里使用了条件编译,功能如下
#if 常量表达式 程序段1
#else程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。
例程中的BRGH_0在uart.h中有进行了宏定义为1了。所以这里编译的是程序_u0cr2=0b11101100;

再来看U0CR2寄存器,它的主要功能是控制发送器、接收器以及各种 UART0中断源的使能或除能。这里就仔细解释了,感兴趣的可以在技术手册上看看他们选择的相应功能,以便让自己有一个更深的理解。

发送一个字节的函数,如果想发送一个数组可以定义一个字符串型数组,然后用for循环发送即可。

void UART_Send_Byte(unsigned char Data_byte)
{ 	
	_ur0e=0;
	while(_txif0==0);
	_txr_rxr0=Data_byte;
	_ur0e=1;
}

接收数据函数

// Receive serial data 接收一系列数据 
// 这里是一个中断函数
void __attribute((interrupt(0x3c))) UART_Receive(void)
{ 
	GCC_NOP();
	if(_ur0f==1)
	{ 
		if(_perr0==1||_oerr0==1||_nf0==1||_ferr0==1)
		{ 
			asm("lmov a,___txr_rxr0");	//read RXR0 register to clear RXIF0 bit
		}else
		{ 
			Rcv_Time_Counter=0;
			while(_rxif0==0);
			if(Data_Counter<16)
			{ 
				Rcv_Data[Data_Counter] = _txr_rxr0;	
				Data_Counter++;
			}else
			{ 
				Data_Counter=0;
				Rcv_Data[Data_Counter] = _txr_rxr0;	
			}
			
		}
		_ur0f=0;
	}
}

二、编写程序

主函数

#include "HT66F2390.h"
#include "delay.h"
#include "uart.h"
#include "LED.h"
#include "string.h" //调用strlen函数要引入字符串的头文件

void main()
{ 
	int t=0,i=0;    //用于计时
	char date[]="广东工业大学MFT团队合泰单片机串口实验";
	LED_Init();  //LED初始化
	UART_SET();   //串口函数初始化
	while(1)
	{ 
		GCC_CLRWDT();   //清除看门狗
		delay_ms(10);
		t++;
		if(RECEIVE_Finish_Flag==1)
		{ 
			if(Rcv_Data[0]==0x01)
			{ 
				LED1 =!LED1;
			}
			for(i=0;i<RCV_Data_Length;i++)UART_Send_Byte(Rcv_Data[i]);
			RECEIVE_Finish_Flag=0;   //清除接收标志位 
		}
		if(t==100)
		{ 
			for(i=0;i<strlen(date);i++)
			{ 
				UART_Send_Byte(date[i]);
			}
			LED2 =!LED2;    //LED2取反用来显示工作是否正常
			t=0;
		}
		GCC_CLRWDT();   //清除看门狗
	}

}

总结

串口通信的这一篇暂时到这里,因为还没有下载进去调试,所以可能会有出错的地方,之后会及时更改。下一篇是定时器部分。
工程文件等下载进去调试好之后再上传到这里。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服