找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 182|回复: 0

串口通信

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-3-24 10:01:12 | 显示全部楼层 |阅读模式

main.c
[C] 纯文本查看 复制代码
// 编译前,请务必阅读   README.md
#include "config.h"
#include "uart.h"
/*
*----------------------------------------------------------------------------------------------
* 函数名称:main()
* 函数功能:单片机编程框架
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/25 22:01:57
* 作者:t176#qq.com
* 创建时间:2023/03/25 22:01:57
* 框架说明:
		执行流程:
				1.数据定义
				(执行1次)
				---------------------

				2.Sys_Init()
				(执行1次)
				---------------------

				3,4,5
				(循环执行)
				3.Sys_Draw()数据绘制
				4.User_Updata()用户干预更新数据
				5.Sys_Updata()系统自动更新数据

-----------------------------------------------------------------------------------------------
*/
//  1.定义数据

void main()

{

	Sys_Init(); // 初始化
	while (1)
	{

		Sys_Draw();
		User_Updata();
		Sys_Updata();
	}
}
// 系统式编程框架-----------------------------------------------

/*
*----------------------------------------------------------------------------------------------
* 函数名称:Sys_Init()
* 函数功能:通常用于初始化一些参数
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/25 22:07:24
* 作者:t176#qq.com
* 创建时间:2023/03/25 22:07:24
-----------------------------------------------------------------------------------------------
*/
void Sys_Init()
{
	EAXFR = 1;	  // 使能访问 XFR
	CKCON = 0x00; // 设置外部数据总线速度为最快
	WTST = 0x00;  // 设置程序代码等待参数,
				  // 赋值为 0 可将 CPU 执行程序的速度设置为最快
	/*IO口初始化*/
	P0M0 = 0x00;
	P0M1 = 0x00;
	P1M0 = 0x00;
	P1M1 = 0x00;
	P2M0 = 0x00;
	P2M1 = 0x00;
	P3M0 = 0x00;
	P3M1 = 0x00;
	P4M0 = 0x00;
	P4M1 = 0x00;
	P5M0 = 0x00;
	P5M1 = 0x00;
	UartInit();
	ES = 1;
	EA = 1;
	UartSendStr("Use uart1 \r\n");
}
/*
*----------------------------------------------------------------------------------------------
* 函数名称:Sys_Draw()
* 函数功能:数据显示,比如数码管,LED灯,TFT 用于数据展示
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/25 22:08:05
* 作者:t176#qq.com
* 创建时间:2023/03/25 22:08:05
-----------------------------------------------------------------------------------------------
*/
void Sys_Draw()

{
	UartRev();
	

}

/*
*----------------------------------------------------------------------------------------------
* 函数名称:User_Updata()
* 函数功能:在程序运行中,通常有很多用户需要干预的过程,比如键盘输入
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/25 22:09:12
* 作者:t176#qq.com
* 创建时间:2023/03/25 22:09:12
-----------------------------------------------------------------------------------------------
*/
void User_Updata()
{
}

/*
*----------------------------------------------------------------------------------------------
* 函数名称: Sys_Updata()
* 函数功能:通常用于系统自动维护执行的数据(无需用户干预)
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/25 22:10:37
* 作者:t176#qq.com
* 创建时间:2023/03/25 22:10:37
-----------------------------------------------------------------------------------------------
*/
void Sys_Updata()
{
}
/*----------------用户自定义的函数----------------*/


uart.c
[C] 纯文本查看 复制代码
#include "uart.h"

bit g_busy; 
char g_wptr;//写指针(即下一个要写入缓冲区的位置)
char g_rptr;//读指针(即下一个要读取缓冲区中数据的位置)
char g_buffer[16];//缓冲区。在串口接收中断中,当接收到数据时,将其存储在缓冲区中,并更新写指针

/*
*----------------------------------------------------------------------------------------------
* 函数名称:UartInit()
* 函数功能:串口1初始化
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/26 09:39:01
* 作者:t176#qq.com
* 创建时间:2023/03/26 09:39:01
-----------------------------------------------------------------------------------------------
*/
void UartInit()
{
    SCON = 0x50;
    T2L = BRT;
    T2H = BRT >> 8;
    S1BRT = 1;
    T2x12 = 1;
    T2R = 1;
    g_wptr = 0x00;
    g_rptr = 0x00;
    g_busy = 0;
}
/*
*----------------------------------------------------------------------------------------------
* 函数名称:UartIsr() interrupt 4
* 函数功能:串口中断
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/26 09:56:19
* 作者:t176#qq.com
* 创建时间:2023/03/26 09:56:19
-----------------------------------------------------------------------------------------------
*/
void UartIsr() interrupt 4
{
    if (TI)
    {
        TI = 0;
        g_busy = 0;
    }
    if (RI)
    {
        RI = 0;
        g_buffer[g_wptr++] = SBUF;
        g_wptr &= 0x0f;
    }
}
/*
*----------------------------------------------------------------------------------------------
* 函数名称: UartSend(char dat)
* 函数功能:发送一个字节
* 入口参数:@dat:需要发送的字节
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/26 09:57:08
* 作者:t176#qq.com
* 创建时间:2023/03/26 09:57:08
-----------------------------------------------------------------------------------------------
*/
void UartSend(char dat)
{
    while (g_busy)
        ;
    g_busy = 1;
    SBUF = dat;
}
/*
*----------------------------------------------------------------------------------------------
* 函数名称:void UartSendStr(char *p)
* 函数功能:发送字符串
* 入口参数:@p 字符串的指针
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/26 09:57:47
* 作者:t176#qq.com
* 创建时间:2023/03/26 09:57:47
-----------------------------------------------------------------------------------------------
*/
void UartSendStr(char *p)
{
    while (*p)
    {
        UartSend(*p++);
    }
}

/*
*----------------------------------------------------------------------------------------------
* 函数名称:void UartRev()
* 函数功能:串口接收数据
* 入口参数:@
* 函数返回:@
* 当前版本: Ver1.0
* 修改时间:2023/03/26 10:00:29
* 作者:t176#qq.com
* 创建时间:2023/03/26 10:00:29
-----------------------------------------------------------------------------------------------
*/
void UartRev()
{
    if (g_rptr != g_wptr)
    {
        UartSend(g_buffer[g_rptr++]);
        g_rptr &= 0x0f;
    }
}



config.h
[C] 纯文本查看 复制代码
/*
*----------------------------------------------------------------------------------------------
* 作者:t176
* 邮箱:t176#qq.com
* 说明:config.h头文件
* 备注:单片机专用框架
       :null
* 当前版本: Ver1.0
* 最后维护时间:2023/03/25 21:59:39
*----------------------------------------------------------------------------------------------
*/



#ifndef __CONFIG_H__
#define __CONFIG_H__
#include <STC32G.H>


#define OPEN_VSCODE_DEBUG //注释该行,将不进入VSCODE调试,为了VSCODE代码编写兼容keil,在烧录前务必注释该行
#ifdef OPEN_VSCODE_DEBUG
#include "../debug/debug.h"
#endif



/*--------------宏定义--------------*/
#define ULONG unsigned long/*无符号整数类型(宏定义)*/


/*--------------变量定义--------------*/



/*--------------函数声明--------------*/

void Sys_Init();
void Sys_Draw();
void User_Updata();
void Sys_Updata();


#endif


uart.h

[C] 纯文本查看 复制代码
/*
*----------------------------------------------------------------------------------------------
* 作者:t176
* 邮箱:t176#qq.com
* 说明:uart.h头文件
* 备注:
       :null
* 当前版本: Ver1.0
* 最后维护时间:2023/03/26 09:22:33
*----------------------------------------------------------------------------------------------
*/

#ifndef __UART_H__
#define __UART_H__
#include "config.h"

/*--------------宏定义--------------*/
#define FOSC 11059200UL                       // 定义为无符号长整型,避免计算溢出
#define BRT (65536 - (FOSC / 115200 + 2) / 4) // 加 2 操作是为了让 Keil 编译

/*--------------变量定义--------------*/



/*--------------函数声明--------------*/
void UartRev();
void UartSendStr(char *p);
void UartSend(char dat);
void UartInit();

#endif


README.md

[C] 纯文本查看 复制代码
# 整体语言代码结构
![English badge]([url]https://img.shields.io/badge/%E8%8B%B1%E6%96%87-English-blue[/url])
![简体中文 badge]([url]https://img.shields.io/badge/%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87-Simplified%20Chinese-blue[/url])


------------



## 编程语言
###	C语言           (The C Programming Language)
------------


## 硬件环境
### STC降龙棍

------------



## 编译环境

### Keil uVision5 C251

------------


# 代码维护环境
### Visual Studio Code

------------
# 框架式编程
这是框架式编程?

这是一种从整个软件系统的高层次全局视角观察和理解代码的方式。通过代码的上帝视角,开发者可以深入了解软件系统的整体架构、各个部分之间的关系,以及整个系统所解决的问题。这种视角需要开发者具备丰富的知识和经验,熟练掌握各种设计模式和架构模式,并能够在全局范围内做出有利于系统演化和扩展性的设计决策。通过代码的上帝视角,开发者能够更好地理解和优化整个系统,从而提高软件质量和开发效率。


## 框架说明:
		执行流程:
				1.数据定义
				(执行1次)
				---------------------

				2.Sys_Init()
				(执行1次)
				---------------------

				3,4,5
				(循环执行)
				3.Sys_Draw()数据绘制
				4.User_Updata()用户干预更新数据
				5.Sys_Updata()系统自动更新数据


------------


# 代码风格约定
<font color="#dd00dd">**本代码严格遵循微软代码风格约定</font>
```c
局部变量:   小写可(加下划线)
    float sum = 0.0f;
    float sum_count = 0;


全局变量:  g_开头加小驼峰(可加下划线)
    int g_maxStudents = 100;
    float g_averageScore = 0.0f;


函数:    大驼峰(可加下划线)
int CalculateSum(int x, int y);
int Calculate_Sum(int x, int y);


宏定义:  全大写
#define PI 3.14159265358979323846
```

------------


# 关于Visual Studio Code调试维护说明
由于keil C251 和VSCode 2个环境的不兼容性,比如使用bit sfr bdata interrupt 时,语法高亮将会失效,为了解决这个问题

特别编写了一个debug.h的头文件来兼容维护环境,以保持VSCode下的语法高亮显示.

需要注意的是,在keil编译时一定注释掉OPEN_VSCODE_DEBUG宏定义,否则编译将会报错

## config.h
<font color="#dd00dd">如果在维护环境下请放开,在keil环境中编译时必须注释该行</font>
####define OPEN_VSCODE_DEBUG ,在编译环境中请注释这行
```c
#define OPEN_VSCODE_DEBUG //注释该行,将不进入VSCODE调试,为了VSCODE代码编写兼容keil,在烧录前务必注释该行
#ifdef OPEN_VSCODE_DEBUG
#include "../debug/debug.h"
#endif

```

## License

作者:t176
------------
MCU_STC License


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-5 19:15 , Processed in 0.087164 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表