【中颖】SH79F9202 串口通信

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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


头文件 uart.h

#ifndef UART_H
#define UART_H

#include "SH79F9202.h"
#include "LCD.h"
#include "timer2.h"
#include "timer5.h"
#include "cpu.h"
#include "key.h"
#include "io.h"
#include "intrins.h"

extern volatile unsigned char RecBuf[8]; // 用于存储接收到的数据
extern volatile unsigned char UART0RecBytecount;        // 数据索引
extern volatile unsigned char UART0_Receive_OverTimer;

extern volatile unsigned char SendBuf[8];


void UART_Init(void);
unsigned char CheckSum(unsigned char *ptr,unsigned char len);
void UART0_Decode(void);


void UART0_SendByte(unsigned char byte);
void UART0_SendPacket(unsigned char* dat, unsigned char length);


#endif

源文件 uart.c



参考资料

  • [1] SH79F9202 10位ADC + LCD的增强型8051微控制器用户手册
  • [2] STM32入门笔记(02):USART串口通信注意事项笔记(SPL库函数版)

#include "uart.h"

#define SELBANK0		INSCON &= 0xBF  // INSCON (-0-- 11-1)  选择特殊功能寄存器页0
#define SELBANK1		INSCON |= 0x40  // INSCON (-1-- 11-1)  选择特殊功能寄存器页1

#define SYSCLK			24000000  // 系统时钟24M
#define BAUDRATE		9600      // 波特率为自带波特率发生器溢出率的1/16
#define SBRTHINIT   32768-(SYSCLK/16/BAUDRATE)    // 波特率发生寄存器
#define SFINE1INIT	SYSCLK/BAUDRATE-16*SBRTHINIT // 波特率微调

#define UARTOVERTIME 2						//这个常量是考虑用中断接收,接收的数据长度还不确定的情况。
																	//当检测到多长时间没有接收中断发生以后,就认为是接收数据结束,需要进行解码。
																	//一般在定时中断里面处理。因定时中断和UART中断同步问题,使用时需要留有余量,
																	//取值:当定时器的中断时间大于UART传送一个字节的时间最少是2。当定时器中断时间少于UART发送一个字节的时间时,取值最少因满足UART传送2个字节的时间

//定义UART接收数据的最大长度,当接收到数据达到此长度时意味着接收数据已经占满接收缓冲区,此时不管还有无数据接收到都需要进行解码。
//#define UARTRECLENGMAX0	 16				//意义同上


void UART_Init(void)
 {
		SELBANK0;						//切换到bank0
		UTOS = 0x00;		   // TTL逻辑选择寄存器(CMOS逻辑) RxD(P1.7/P4.0)
=====================串口UART1=====================================
//		P1CR &=0x7F;				//P1.7 input mode RxD1
//		P1CR|= 0x40;				//P1.6 TxD1 output mode
//		P1_7 = 1;
//		P1_6 = 1;
		P1PCR |= 0xC0;			//P1.7 P1.6 上拉打开
//		P1PCR |= 0x80;   // P1.7 输入 开启上拉
//		P1PCR &= 0xbf;   // P1.6 输出 关闭上拉
//		P1SS &= 0x3F;				//将P1.7(SEG5)和P1.6LCD(SEG6)的SEG功能关闭
=====================串口UART0=====================================
		P3CR |= 0x80;				// P3.7 output TxD0
		P3_7 = 1;           // 默认为高
//		P3PCR |= 0x80;
	  P3PCR &= 0x7f;  // 输出 关闭上拉
		P3SS &= 0x7F;				//将P3.7 LCD的SEG功能关闭
	 
		P4CR &= 0xFE;			//P4.0 input RxD0
	 	P4_0 = 1;
		P4PCR |= 0x01;  // 输入 开启上拉
		P4SS &= 0xFE;				//将P4.0 LCD的SEG功能关闭
//===========================UART0===============================

		//EUART0控制及状态寄存器 
		SCON = 0x50;				// 0101 0000 方式1(8位异步/可变波特率)|无法送冲突软件清零|允许接收|
		//EUART0 波特率发生寄存器
		SBRTH = (unsigned char)(SBRTHINIT>>8); // 取高8位 串口0和串口1采用同一波特率
		SBRTL = (unsigned char)(SBRTHINIT);    // 取低8位
//		SBRTL = (unsigned char)(SBRTHINIT) &= 0x00ff;  
		SFINE = SFINE1INIT;	     //SFINE[3:0]波特率发生器微调数据寄存器
		SBRTH |= 0x80; //打开 EUART0 波特率发生器(SBRTEN=1)
		
===========================UART1===============================
//		SELBANK1;						//切换到bank1,初始化UART1寄存器
//		//EUART1控制及状态寄存器 
//		SCON1 = 0x50;				//设置为方式1
//		
//		SBRTH1 = (unsigned char)(SBRTHINIT>>8);
//		SBRTL1 = (unsigned char)(SBRTHINIT);
//		
//		SFINE1 = SFINE1INIT;
//		SBRTH1 |= 0x80;
		
		SELBANK0;						//切回到bank0
		ES0 = 1;						//打开UART0中断
//		ES1 = 1;						//打开UART1中断
}
/****************************************************
* 函数名称: CheckSum
* 校验和:所有字节的相加和取低字节
*****************************************************/
unsigned char CheckSum(unsigned char *ptr,unsigned char len)
{
	unsigned char i;
	unsigned char Value = 0;
	for(i=0;i<len;i++)  //len
	{
		Value = Value + ptr[i];
	}
	return(Value);
}



// UART0数据解析
void UART0_Decode(void)
{
	unsigned char i;
  volatile unsigned char *Source;
	unsigned char RecCheckValue;
	
	Source = &RecBuf[0];
	
	if(gbUARTRecOK0)
		{
			gbUARTRecOK0 = 0;// 清标志
			if((*Source == 0xaa) && (*(Source+6) == 0x00))//帧头 帧尾判定 "aa 15 02 01 00 00 00 c2"、"aa 15 02 01 00 11 00 d3 "
				{
			    //头尾校验正确
					RecCheckValue = CheckSum(RecBuf,7);			//接收缓冲区7个字节的校验 
			
					if(RecCheckValue == (*(Source+7)))//校验和验证 c2  d3
					{//校验和验证正确
						for(i = 0; i < 8; i++)
						{
							SendBuf[i] = RecBuf[i];
//							SendBuf[i] = *(Source + i);
						}
						
					}
//					else{
//						//error_count ++;// 校验错误计数
//					}
				}
//				else{
//					//error_count ++;	// 校验错误计数
//				}
		}

}


void UART0_SendByte(unsigned char byte) {
    SBUF = byte;       // 将数据写入SBUF寄存器,开始发送
    while (TI == 0);   // 等待发送完成
    TI = 0;            // 清除发送完成标志
}

void UART0_SendPacket(unsigned char* dat, unsigned char length) {
    unsigned char i;
    for (i = 0; i < length; i++) {
        UART0_SendByte(dat[i]);
    }

}

// UART0 接收相关变量
#define UARTRECLENGMAX0	 8				//
volatile unsigned char RecBuf[8]; // 用于存储接收到的数据
volatile unsigned char UART0RecBytecount = 0;        // 数据索引
volatile unsigned char UART0_Receive_OverTimer;
unsigned char RecCount;
bit gbUARTRecOK0;

// UART0 发送相关变量
volatile unsigned char SendBuf[8];


void UART0_ISR(void) interrupt 4
{
	_push_(INSCON);
	
	INSCON &= 0xBF;

	if (RI) { 
		// 接收中断
			RI = 0;                 // 清除接收中断标志
		if(!gbUARTRecOK0){
			RecBuf[UART0RecBytecount++] = SBUF; // 读取接收到的数据
			UART0_Receive_OverTimer = UARTOVERTIME;
			if (UART0RecBytecount >= UARTRECLENGMAX0) {
					UART0RecBytecount = 0;          // 如果接收到8个字节,重置索引
				  gbUARTRecOK0 = 1;
			}
		}
	}
	_pop_(INSCON);
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

八股文系列Spark

为什么Spark 比 MapReduce 更快 DAG相比hadoop的mapreduce在大多数情况下可以减少磁盘I/O次数 因为mapreduce计算模型只能包含一个map和一个reduce,所以reduce完后必须进行落盘&#xff0c;而DAG可以连续shuffle的&#xff0c;也就是说一个DAG可以完成好几个mapreduce&#xf…

使用#sortablejs插件对表格中拖拽行排序#Vue3#后端接口数据

使用#sortablejs对表格中拖拽行排序#Vue3#后端接口数据 *效果&#xff1a; 拖动表格行排序 首先安装插件sortable npm install sortablejs --save代码&#xff1a; <template><!-- sortable.js 进行表格排序 --><!-- 演示地址 --><div class"dem…

【全开源】驾校练车管理系统源码(FastAdmin+ThinkPHP)

&#x1f698;驾校练车管理系统&#xff1a;让学车之路更顺畅&#xff01;&#x1f4c8; 一款基于FastAdminThinkPHP开发的驾校管理系统&#xff0c;驾校管理系统(DSS)主要面向驾驶学校实现内部信息化管理&#xff0c;让驾校管理者和工作人员更高效、更快捷的完成枯燥无味的工…

网球运动目标检测跟踪

基于yolo作为目标检测器实现目标检测&#xff0c;使用跟踪器进行跟踪&#xff0c;实现如下功能。 得到视频中的网球运动员&#xff0c;测量他们的速度、击球速度和平均值&#xff0c;方便球友。

我们离成功有多远呢?只要能完成自己阶段性的目标就算是一次成功

做起一个账号&#xff0c;带好一个团队&#xff0c;经营好一家公司&#xff0c;似乎这些都能叫成功&#xff0c;成功的定义可大可小&#xff0c;而我认为只要能完成自己阶段性的目标就算是一次成功&#xff0c;毕竟每个人学历、背景、阅历、资源、认知都不同&#xff0c;很难同…

RV32M指令集

RV32M指令集 1、乘法运算2、除法运算1、乘法运算 MUL 指令(得到整数32位乘积(64位中的低32位)) MUL 指令用于执行两个带符号或无符号整数之间的乘法运算。其语法如下: mul rd, rs1, rs2 它将寄存器 rs1 和 rs2 中的值相乘,并将结果写入寄存器 rd 中。如果 rs1 和 rs2 都是有…

Fiddler抓包工具详细使用教程

各位做测试的同学想必对抓包工具fiddler并不陌生&#xff0c;但是很多同学可能没有总结过它的用法&#xff0c;下面我总结了fiddler一些常用的用法。 Web端抓包配置 打开Fiddler&#xff0c;Tools -> Fiddler Options -> HTTPS 配置完后记得要重启Fiddler 选中Decrpt …

2024年智能制造行业CRM研究(附需求清单、市场格局、选型建议)

在国家大力鼓励智能制造行业与数字化转型这个大背景下&#xff0c;我们选择了2024年智能制造行业数字化的几个关键趋势做深入解读&#xff0c;并对智能制造行业核心的数字化系统CRM进行了全面评估与排名。本文不仅提供了详尽的需求清单&#xff0c;帮助企业明确自身对CRM系统的…

linux笔记8--安装软件

文章目录 1. PMS和软件安装的介绍2. 安装、更新、卸载安装更新ubuntu20.04更新镜像源&#xff1a; 卸载 3. 其他发行版4. 安装第三方软件5. 推荐 1. PMS和软件安装的介绍 PMS(package management system的简称)&#xff1a;包管理系统 作用&#xff1a;方便用户进行软件安装(也…

catia展开模型树

1 直接点号 2 选中零件&#xff0c;右击--命令--将图居中即可 一般都是上面这样有选择性的展开 如果要一次性都展开那

DDei在线设计器-DDeiCore-图形插件

DDei-Core-图形 DDei-Core-图形插件包含了基础绘图形状与基础流程形状两个分组&#xff0c;大约100来个图形&#xff0c;能够满足很基本的框图、架构图、流程图的绘制。 图形以分组的形式组织&#xff0c;一个分组中包含多个图形&#xff0c;一个图形也能够同时存在于多个分组。…

一张试卷

目录 问题 1: 1.时间 题目描述1 输入1 输出1 样例输入1 样例输出1 提示1 代码1 问题 2: 超酷的电话号码 题目描述2 输入2 输出2 样例输入2 样例输出2 提示2 代码2 问题 3:3.爸爸的数学题 题目描述3 输入3 输出3 样例输入3 样例输出3 提示3 代码3 问题 4: 4. 营养膳食 题目描述4…

几首音乐怎么合成一首?值得推荐的四个几首音乐合成一首的方法

几首音乐怎么合成一首&#xff1f;合成几首音乐成一首新的作品是一项创造性而充满挑战的任务。通过将不同的音乐元素融合在一起&#xff0c;可以创造出独特的音乐体验&#xff0c;展示多样化的音乐风格和个性。将多首音乐合成一首可以创造出独特的音乐体验&#xff0c;融合不同…

盲盒小程序开发:传统与当代的创新融合

谈起盲盒&#xff0c;许多人并不陌生。近几年&#xff0c;盲盒一直是年轻人首选的娱乐消费方式&#xff0c;小小的盲盒为消费者带来了极大的欢乐。 盲盒小程序是将传统的盲盒玩法与线上购物方式相融合&#xff0c;对拆盲盒进行创新&#xff0c;为盲盒消费者带来全新的盲盒体验…

DDD架构和微服务初步实现

本次记录的是微服务的初步认识和DDD架构的初步实现和思路&#xff0c;在之前的发布里&#xff0c;对Javaweb进行了一次小总结&#xff0c;还有一些东西&#xff0c;不去详细理解说明了&#xff0c;下面开始我对微服务的理解。 什么是微服务&#xff1f; 在刚刚开始学习的时候…

这三款思维导图工具,真的很好用

XMIND XMIND是优秀的国产思维导图和头脑风暴软件&#xff0c;非常符合国人的使用要求&#xff0c;旨在帮助用户理清思路、捕捉创意&#xff0c;并提高工作和生活效率。支持Linux、IOS、Android、MAC平台。 提供了非常多精美的结构图&#xff0c;例如鱼骨图、逻辑图、括号图、树…

【推荐收藏】2024年5款最佳 GPU 渲染引擎大盘点

2024年已经过半&#xff0c;对于从事3D渲染和数字内容创作的朋友来说&#xff0c;选择一款高效的GPU渲染引擎至关重要。今天&#xff0c;小编就来为大家盘点一下2024年5款最佳GPU渲染引擎。 1.V-Ray V-Ray是一款备受欢迎的3D GPU渲染引擎&#xff0c;被建筑、视觉特效、室内设…

Deep Freeze冰点还原8.57最新版软件安装包下载+详细安装步骤

​冰点还原精灵&#xff08;DeepFreeze&#xff09;是由Faronics公司出品的一款系统还原软件&#xff0c;能保留您的计算机配置&#xff0c;确保全面的端点保护。任何更改&#xff0c;无论是恶意更改还是无意更改&#xff0c;都会在重启时撤销。这就是“重启还原”&#xff0c;…

281 基于matlab的路径规划GUI交互

基于matlab的路径规划GUI交互。包括蚁量系统、蚁周系统、蚁密系统、蚁群系统、免疫混合算法。11种路径规划数据&#xff0c;最多225个规划点。蚁群和免疫算法的参数可进行设置&#xff0c;使得效果最佳。动态显示可视化规划结果。程序已调通&#xff0c;可直接运行。

【华为 ICT HCIA eNSP 习题汇总】——题目集21

1、OSPF协议中的hello报文不包括以下哪个字段&#xff1f; A、Priority&#xff08;优先级&#xff09; B、Neighbor&#xff08;邻居表&#xff09; C、Interval&#xff08;时间间隔&#xff09; D、Checksum&#xff08;校验和&#xff09; 考点&#xff1a;路由技术原理 解…