#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "sys.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "delay.h"
#include "Key.h"
#include "led.h"
#include "oled.h"
#define TASK_NUM_MAX (sizeof(g_tcb_tab) / sizeof(g_tcb_tab[0]))
#define current_aj 3.86554 //电流增益系数 电流值不对改这个数
int str_num(uint8_t *buff);
int Dis_get(uint8_t *buff);
uint8_t Rx_buff[256]; // 接收缓冲区
uint8_t Rx_index[4]; // 接收缓冲区索引
uint32_t ADC_SUM; // ADC采集的总值 用于均值滤波
int ADC_index; // ADC采集索引 用于均值滤波
int ADC_COJ;
int adc_real; // 均值滤波后的ADC值
int adcx1,adcx2,adcx3,adcx4; //AD转换的结果
float adc1,adc2,adc3,adc4;
uint8_t stay_flag;
float adc_out; //电流值
void usart1_send(void);
void Led(void);
char send_buff[256];
char Dis_buff[6];
char R_buff[6];
char T_buff[6];
char Q_buff[6];
u8 buff1 = 0;
uint8_t TTS_FLAG[3];
float dis_data;
uint8_t KeyNum;
float R_data;
float T_data;
float Q_data;
typedef struct
{
uint8_t run; // 调度标志,1:调度,0:挂起
uint16_t time_count; // 时间片计数值
uint16_t time_reload; // 时间片重载值
void (*p_task_callback)(void); // 函数指针变量,用来保存业务功能模块函数地址
} st_tcb_t;
static st_tcb_t g_tcb_tab[] =
{
{0,500,500,Led},
{0,200,200,usart1_send},
/* 添加业务功能模块 */
};
/*******测试用*******/
int i;
typedef enum{
D_flag,
Q_flag,
R_flag,
T_flag,
mnot,
}Rx_flag;
typedef enum {
SHAPE_RECTANGLE, // 矩形
SHAPE_TRIANGLE, // 三角形
SHAPE_CIRCLE // 圆形
} Shape_Type;
enum {
jichu = 0xE1,
fahui = 0xE2,
xuanzhan= 0xE3,
zuixiao = 0xE4,
basic,
};
uint8_t page = jichu;
Shape_Type myShape;
Rx_flag rx_flag = mnot;
void Led(){
buff1 = 0;
}
void task_handler(void)
{
for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
{
if (g_tcb_tab[i].run) // 判断时间片标志
{
g_tcb_tab[i].run = 0; // 标志清零
g_tcb_tab[i].p_task_callback(); // 执行调度业务功能模块
}
}
}
void task_schedule_callback(void)
{
for (uint8_t i = 0; i < TASK_NUM_MAX; i++)
{
if (g_tcb_tab[i].time_count)
{
g_tcb_tab[i].time_count--;
if (g_tcb_tab[i].time_count == 0)
{
g_tcb_tab[i].run = 1;
g_tcb_tab[i].time_count = g_tcb_tab[i].time_reload;
}
}
}
}
static float last_dis_data = -1.0f;
static float last_Q_data = -1.0f;
static int last_adc_real = -1;
void usart1_send(void)
{
if (fabsf(dis_data - last_dis_data) < 0.1f &&
fabsf(Q_data - last_Q_data) < 0.1f &&
abs(adc_real - last_adc_real) < 5) {
return;
}
last_dis_data = dis_data;
last_Q_data = Q_data;
last_adc_real = adc_real;
switch(page) {
case jichu:
sprintf(send_buff, "%.1f CM", dis_data);
printf("t2.txt=\"%s\"\xFF\xFF\xFF", send_buff);
sprintf(send_buff, "%.1f CM", Q_data);
printf("t4.txt=\"%s\"\xFF\xFF\xFF", send_buff);
if (rx_flag == R_flag) {
printf("t6.txt=\"SHAPE_CIRCLE\"\xFF\xFF\xFF");
} else if (rx_flag == T_flag) {
printf("t6.txt=\"SHAPE_TRIANGLE\"\xFF\xFF\xFF");
} else if (rx_flag == Q_flag) {
printf("t6.txt=\"SHAPE_RECTANGLE\"\xFF\xFF\xFF");
}
sprintf(send_buff, "%.1f W", (float)adc_real * current_aj * 5.0f / 1000.0f);
printf("t6.txt=\"%s\"\xFF\xFF\xFF", send_buff);
sprintf(send_buff, "%.2f mA", (float)adc_real * current_aj);
printf("t8.txt=\"%s\"\xFF\xFF\xFF", send_buff);
break;
case zuixiao:
case xuanzhan:
sprintf(send_buff, "%.1f CM", dis_data);
printf("t10.txt=\"%s\"\xFF\xFF\xFF", send_buff);
sprintf(send_buff, "%.1f CM", Q_data);
printf("t11.txt=\"%s\"\xFF\xFF\xFF", send_buff);
sprintf(send_buff, "%.1f W", (float)adc_real * current_aj * 5.0f / 1000.0f);
printf("t12.txt=\"%s\"\xFF\xFF\xFF", send_buff);
sprintf(send_buff, "%.2f mA", (float)adc_real * current_aj);
printf("t13.txt=\"%s\"\xFF\xFF\xFF", send_buff);
break;
default:
break;
}
}
/**
* @brief 串口1接收中断服务函数
*
*/
u8 buff;
int aa;
void usart1_Rx_IRQ(uint8_t c)
{
switch(c)
{
case 0xC1 :
page = jichu;
break;
case 0xC2 :
page = fahui;
break;
case 0xA1 :
page = zuixiao;
USART_printf(USART2,"detectminQuad");
break;
case 0xA2 :
page = xuanzhan;
USART_printf(USART2,"tilt");
break;
case 0xC5 :
page = basic;
USART_printf(USART2,"basic");
break;
default:
break;
}
}
// 全局变量(用于临时拼接数字)
int temp_value = 0; // 临时存储解析出的数值
int digit_count = 0; // 记录接收到了几位数字
void usart2_Rx_IRQ(uint8_t c)
{
static Rx_flag current_flag = mnot; // 当前接收的数据类型
static Shape_Type current_shape = SHAPE_RECTANGLE;
// ===== 1. 检测数据类型标志 =====
if (c == 'D') {
current_flag = D_flag;
temp_value = 0;
digit_count = 0;
return;
} else if (c == 'R') {
current_flag = R_flag;
current_shape = SHAPE_CIRCLE;
temp_value = 0;
digit_count = 0;
// 立即播报
USART_printf(USART3, "圆形");
return;
} else if (c == 'T') {
current_flag = T_flag;
current_shape = SHAPE_TRIANGLE;
temp_value = 0;
digit_count = 0;
USART_printf(USART3, "三角形");
return;
} else if (c == 'Q') {
current_flag = Q_flag;
current_shape = SHAPE_RECTANGLE;
temp_value = 0;
digit_count = 0;
USART_printf(USART3, "矩形");
return;
}
// ===== 2. 接收数字字符(0-9)=====
if (c >= '0' && c <= '9') {
temp_value = temp_value * 10 + (c - '0');
digit_count++;
return;
}
// ===== 3. 遇到换行符 \n,表示一帧数据结束,开始处理 =====
if (c == '\n' && digit_count > 0) {
float final_value = (float)temp_value / 10.0f; // 转换为带一位小数的值
// ===== 根据当前 flag 更新对应变量并刷新屏幕 =====
switch (current_flag) {
case D_flag:
dis_data = final_value;
// 直接刷新串口屏 t2
sprintf(send_buff, "%.1f CM", dis_data);
printf("t2.txt=\"%s\"\xFF\xFF\xFF", send_buff);
break;
case Q_flag:
case R_flag:
case T_flag:
Q_data = final_value;
// 刷新形状文本
const char* shape_str =
(current_shape == SHAPE_CIRCLE) ? "SHAPE_CIRCLE" :
(current_shape == SHAPE_TRIANGLE) ? "SHAPE_TRIANGLE" :
"SHAPE_RECTANGLE";
printf("t6.txt=\"%s\"\xFF\xFF\xFF", shape_str);
// 刷新边长/直径
sprintf(send_buff, "%.1f CM", Q_data);
printf("t4.txt=\"%s\"\xFF\xFF\xFF", send_buff);
break;
default:
break;
}
// ===== 重置状态 =====
temp_value = 0;
digit_count = 0;
current_flag = mnot;
}
}
int main(void)
{
delay_init(); // 延时函数初始化
LED_Init(); // 初始化与外设连接的硬件接口
uart1_init(9600); // 串口初始
uart3_init(9600); // 串口初始
uart2_init(115200); // 串口初始化
Adc_Init(); // ADC转换初始化
tim2_init(100-1,72-1); // 定时器初始化
tim4_init(1000-1,72-1); // 定时器初始化
Key_Init();
// 设置初始页面为 jichu
page = jichu;
// 发送页面切换指令给串口屏
printf("page jichu\xFF\xFF\xFF");
sprintf(send_buff,"%.1f CM",0.00);
printf("t2.txt=\"%s\"\xFF\xFF\xFF",send_buff);
sprintf(send_buff,"%.1f CM",0.00);
printf("t4.txt=\"%s\"\xFF\xFF\xFF",send_buff);
printf("t5.txt=\"%s\"\xFF\xFF\xFF","功率:");
while(1)
{
task_handler();
KeyNum = Key_GetNum();
if (KeyNum == 1)
{
page = basic;
USART_printf(USART2, "basic");
printf("page page1\xFF\xFF\xFF");
sprintf(send_buff, "%.1f CM", dis_data);
printf("t2.txt=\"%s\"\xFF\xFF\xFF", send_buff); // 更新文本控件 t2
// sprintf(send_buff, "%.1f CM", Q_data);
// printf("t4.txt=\"%s\"\xFF\xFF\xFF", send_buff);
if (rx_flag == R_flag) {
printf("t4.txt=\"SHAPE_CIRCLE\"\xFF\xFF\xFF");
} else if (rx_flag == T_flag) {
printf("t4.txt=\"SHAPE_TRIANGLE\"\xFF\xFF\xFF");
} else if (rx_flag == Q_flag) {
printf("t4.txt=\"SHAPE_RECTANGLE\"\xFF\xFF\xFF");
}
sprintf(send_buff, "%.1f W", (float)adc_real * current_aj * 5.0f / 1000.0f);
printf("t6.txt=\"%s\"\xFF\xFF\xFF", send_buff);
sprintf(send_buff, "%.2f mA", (float)adc_real * current_aj);
printf("t8.txt=\"%s\"\xFF\xFF\xFF", send_buff);
break;
// LED1_Turn();
}
if (KeyNum == 2)
{
printf("page page0\xFF\xFF\xFF");
// LED2_Turn();
}
}
}
void tim4_IRQ(void) //中断函数入口,从tim.c里面调用的这个函数
{
task_schedule_callback();
}
void tim2_IRQ(void) //中断函数入口,从tim.c里面调用的这个函数
{
adcx1 = GET_ADC_PA1; //获取ADC偏移量
adcx2 = GET_ADC_PA0; //获取ADC采集量
ADC_COJ = adcx2 - adcx1;
ADC_index++;
if(ADC_index > 1000){
ADC_index = 0;
adc_real = (ADC_SUM+500) / 1000; //四舍五入
ADC_SUM = 0;
}
else{
ADC_SUM += ADC_COJ;
}
}
int i,j;
int Dis_get(uint8_t *buff){
int a,b,c,d; //临时变量,记录千位百位十位个位数字
a = (buff[1] - '0')*1000;
b = (buff[2] - '0')*100;
c = (buff[3] - '0')*10;
d = buff[4] - '0';
return a+b+c+d;
}
int str_num(uint8_t *buff){
int a,b,c,d; //临时变量,记录千位百位十位个位数字
if(buff[3]!=0x00){
a = (buff[1] - '0')*100;
b = (buff[2] - '0')*10;
c = (buff[3] - '0')*1;
}
else {
a = (buff[1] - '0')*10;
b = (buff[2] - '0')*1;
c = 0;
}
return a+b+c+d;
}
最新发布