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] 纯文本查看 复制代码
# 整体语言代码结构


------------
## 编程语言
### 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
|