STC8H8K64U 学习笔记 - 与上位机通信

与上位机通信

在天问中编程,通过分支判断来接收 PyQt 的传递的信号,进而控制单片机的点灯操作。

环境说明

该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。

  • 芯片:STC8H8K64U
  • 烧录软件:stc-isp-v6.92G
  • 编码工具:天问

引脚说明

  • P0_0:蜂鸣器,按频率发音,1:高,0:低
  • P0_1:电动马达,0:停,1:动
  • P5_3:小蓝灯,0:灭,1:亮
  • P2_7:1 号 LED 灯,0:亮,1:灭
  • P2_6:2 号 LED 灯,0:亮,1:灭
  • P1_5:3 号 LED 灯,0:亮,1:灭
  • P1_4:4 号 LED 灯,0:亮,1:灭
  • P2_3:5 号 LED 灯,0:亮,1:灭
  • P2_2:6 号 LED 灯,0:亮,1:灭
  • P2_1:7 号 LED 灯,0:亮,1:灭
  • P2_0:8 号 LED 灯,0:亮,1:灭
  • P5_1:1 号按键,0:按下,1:弹起
  • P5_2:2 号按键,0:按下,1:弹起
  • P5_3:3 号按键,0:按下,1:弹起
  • P5_4:4 号按键,0:按下,1:弹起
  • P3_4:矩阵键盘第 1 行引脚
  • P3_5:矩阵键盘第 2 行引脚
  • P4_0:矩阵键盘第 3 行引脚
  • P4_1:矩阵键盘第 4 行引脚
  • P0_3:矩阵键盘第 1 列引脚
  • P0_6:矩阵键盘第 2 列引脚
  • P0_7:矩阵键盘第 3 列引脚
  • P1_7:矩阵键盘第 4 列引脚

天问代码

#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/UART.h"
#include "lib/wmath.h"
#include <stdio.h>#define SIZE 8int8 incr = 1;
uint8 rec = 0;
uint8 index = 0;
uint8 isLoop = 0;
uint32 INTERVAL = 800;void putchar(char c) {if (c == '\n') {uart_putchar(UART_1, 0x0d);uart_putchar(UART_1, 0x0a);} else {uart_putchar(UART_1, (uint8)c);}
}void switchOffAll() {// 1:P2_7// 2:P2_6// 3:P1_5// 4:P1_4// 5:P2_3// 6:P2_2// 7:P2_1// 8:P2_0P2_7 = 1, P2_6 = 1, P1_5 = 1, P1_4 = 1;P2_3 = 1, P2_2 = 1, P2_1 = 1, P2_0 = 1;
}void setup() {twen_board_init();//天问51初始化uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1);//初始化串口P1M1=0x00;P1M0=0xff;//推挽输出P2M1=0x00;P2M0=0xff;//推挽输出randomSeed(1);switchOffAll();
}// 需求6:
// 
// 随机点亮1, 2, 3, 4, 5, 6, 7, 8任意一个LED灯
void randomSwitchOn6() {index = random(0, 7 + 1); // 生成[0, 7] 内的整数printf_small("index = :%d", index);switch(index) {case 0: P2_7 = 0; break; case 1: P2_6 = 0; break;case 2: P1_5 = 0; break; case 3: P1_4 = 0; break;case 4: P2_3 = 0; break; case 5: P2_2 = 0; break;case 6: P2_1 = 0; break; case 7: P2_0 = 0; break;    }delay(INTERVAL);switchOffAll();delay(INTERVAL);
}// 需求7:
// 
// 随机点亮1, 3, 5, 7任意一个LED灯
void randomSwitchOn7() {// 0 1 2 3// 1 3 5 7index = random(0, 3 + 1);// 生成[0, 3] 内的整数printf_small("index = :%d", index);switch(index) {case 0: P2_7 = 0; break; case 1: P1_5 = 0; break;case 2: P2_3 = 0; break; case 3: P2_1 = 0; break;  }delay(INTERVAL);switchOffAll();delay(INTERVAL);
}// 需求8:
// 
// 如果串口接收到0x1: 1, 2, 3, 4, 5, 6, 7, 8 走马灯亮
// 则调用 marquee(0, 1, 0);
// 如果串口接收到0x2: 8, 7, 6, 5, 4, 3, 2, 1 走马灯亮
// 则调用 marquee(7, -1, 0);
// 如果串口接收到0x3:1, 3, 5, 7 号灯依次流水点亮
// 则调用 marquee(0, 2, 1);
// 如果串口接收到0x4:8, 6, 4, 2 号灯依次流水点亮
// 则调用 marquee(7, -2, 1);
void marquee8(uint8 start, int incr, uint8 isFlowing) {switchOffAll();delay(INTERVAL);index = start;while(index < SIZE && index > -1) {if(isFlowing == 0) {switchOffAll();}switch(index) {case 0: P2_7 = 0; break; case 1: P2_6 = 0; break;case 2: P1_5 = 0; break; case 3: P1_4 = 0; break;case 4: P2_3 = 0; break; case 5: P2_2 = 0; break;case 6: P2_1 = 0; break; case 7: P2_0 = 0; break;    }index += incr;delay(INTERVAL);}if(isFlowing == 0) {switchOffAll();}
}// 需求9:
// 
// 如果串口接收到0x1: 1, 2, 3, 4, 5, 6, 7, 8 走马灯亮
// 则调用 marquee(0, 1, 0);
// 如果串口接收到0x2: 8, 7, 6, 5, 4, 3, 2, 1 走马灯亮
// 则调用 marquee(7, -1, 0);
// 如果串口接收到0x3:1, 3, 5, 7 号灯依次流水点亮
// 则调用 marquee(0, 2, 1);
// 如果串口接收到0x4:8, 6, 4, 2 号灯依次流水点亮
// 则调用 marquee(7, -2, 1);
void marquee9(uint8 start, int incr, uint8 isFlowing) {switchOffAll();delay(INTERVAL);index = start;while(index < SIZE && index > -1) {if(isFlowing == 0) {switchOffAll();}switch(index) {case 0: P2_7 = 0; break; case 1: P2_6 = 0; break;case 2: P1_5 = 0; break; case 3: P1_4 = 0; break;case 4: P2_3 = 0; break; case 5: P2_2 = 0; break;case 6: P2_1 = 0; break; case 7: P2_0 = 0; break;    }index += incr;delay(INTERVAL);}switchOffAll();
}// 自定义相遇灯
void meetYou() {int i = 0;while(i < 30) {switchOffAll();switch(index) {case 0: P2_7 = 0; P2_0 = 0; break;case 1: P2_6 = 0; P2_1 = 0; break;case 2: P1_5 = 0; P2_2 = 0; break;case 3: P1_4 = 0; P2_3 = 0; break;}if(index > 2) {incr = -1;} else if(index < 1) {incr = 1;}index += incr;delay(INTERVAL);if(isLoop) {// 如果需要死循环,则手动置零,默认跑 30 次i = 0;}i++;}switchOffAll();
}void loop() {if(UART1_GET_RX_FLAG) {UART1_CLEAR_RX_FLAG;rec = SBUF;// uart_putchar(UART_1, rec);//串口单个字符输出// uart_putstr(UART_1, rec);//字符串输出// printf_small("rec = :%d", rec);if(rec == 0x00) {// 0x00 专用于用于测试通路uart_putstr(UART_1, "OK");} // ==自定义相遇灯=================================else if(rec == 0x01) {uart_putstr(UART_1, "meet you");meetYou();}// ==需求9的分支=================================else if(rec == 0x5B) {uart_putstr(UART_1, "需求9的0x1");marquee9(0, 1, 1);} else if (rec == 0x5C) {uart_putstr(UART_1, "需求9的0x2");marquee9(1, 1, 1);} else if (rec == 0x5D) {uart_putstr(UART_1, "需求9的0x3");marquee9(2, 1, 1);} else if (rec == 0x5E) {uart_putstr(UART_1, "需求9的0x4");marquee9(3, 1, 1);} else if (rec == 0x5F) {uart_putstr(UART_1, "需求9的0x5");marquee9(4, 1, 1);} else if (rec == 0x60) {uart_putstr(UART_1, "需求9的0x6");marquee9(5, 1, 1);} else if (rec == 0x61) {uart_putstr(UART_1, "需求9的0x7");marquee9(6, 1, 1);} else if (rec == 0x62) {uart_putstr(UART_1, "需求9的0x8");marquee9(7, 1, 1);}// ==需求8的分支=================================else if (rec == 0x51) {uart_putstr(UART_1, "需求8的0x1");marquee8(0, 1, 0);} else if (rec == 0x52) {uart_putstr(UART_1, "需求8的0x2");marquee8(7, -1, 0);} else if (rec == 0x53) {uart_putstr(UART_1, "需求8的0x3");marquee8(0, 2, 1);} else if (rec == 0x54) {uart_putstr(UART_1, "需求8的0x4");marquee8(7, -2, 1);// ==需求7的分支=================================} else if (rec == 0x46) {uart_putstr(UART_1, "需求7");randomSwitchOn7();// ==需求6的分支=================================} else if (rec == 0x3C) {uart_putstr(UART_1, "需求6");randomSwitchOn6();} else {uart_putstr(UART_1, "unknown command!");}}
}void main(void) {setup();while(1){loop();}
}

上位机代码


from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
import sys
import serial
from serial.tools import list_portsBUTTONS = [("需求9的0x1", lambda : send(91)), ("需求9的0x2", lambda : send(92)),("需求9的0x3", lambda : send(93)), ("需求9的0x4", lambda : send(94)),("需求9的0x5", lambda : send(95)), ("需求9的0x6", lambda : send(96)),("需求9的0x7", lambda : send(97)), ("需求9的0x8", lambda : send(98)),("需求8的0x1", lambda : send(81)), ("需求8的0x2", lambda : send(82)),("需求8的0x3", lambda : send(83)), ("需求8的0x4", lambda : send(84)),("需求7", lambda : send(70)), ("需求6", lambda : send(60)),("我的相遇灯", lambda : send(1))
]"""
发送 int 数据到串口
num 的取值如下所示:
0x5B:需求9的0x1
0x5C:需求9的0x2
0x5D:需求9的0x3
0x5E:需求9的0x4
0x5F:需求9的0x5
0x60:需求9的0x6
0x61:需求9的0x7
0x62:需求9的0x8
0x51:需求8的0x1
0x52:需求8的0x2
0x53:需求8的0x3
0x54:需求8的0x4
0x46:需求7
0x3C:需求6
0x01:我的相遇灯
"""
def send(num:int = 0):ports =  [(p.device, p.description) for p in list_ports.comports()]port = [x[0] for x in ports if 'USB-SERIAL' in x[1]]port = port[0] if len(port) else Noneif not port:print("找不到 USB 串口")exit()ser = serial.Serial(port=port, baudrate=115200, timeout=1200)if not ser or not ser.is_open:print("Serial port is not open.")ser.write(num.to_bytes(length=8, byteorder='little', signed=False))ser.flush()info = ser.read(2)ser.close()if(info):print(info)# 1.创建应用程序
app = QApplication(sys.argv)# 2.创建窗口
w = QWidget()
y = 0
# 修改窗口标题
w.setWindowTitle('串口信号发送客户端')
for bs in BUTTONS:btn = QPushButton()btn.move(0, y)btn.setText(bs[0])btn.clicked.connect(bs[1])btn.setParent(w)y += 30# 3.显示窗口
w.show()
sys.exit(app.exec())

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 让类只在堆或栈上分配

1. 让类只在栈上或堆上分配内存 在C中&#xff0c;类的对象建立分为两种&#xff1a; 一种是静态建立&#xff0c;如A a&#xff1b; 另一种是动态建立&#xff0c;如A* ptrnew A&#xff1b;这两种方式是有区别的。 1、静态建立类对象&#xff1a;是由编译器为对象在栈空间…

掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)

在Go语言中&#xff0c;类型转换指的是将一个数据类型的值转换为另一个数据类型的过程。Go语言中的类型转换通常用于将一种数据类型转换为另一种数据类型&#xff0c;以满足特定操作或需求。 类型转换的基本语法 在Go语言中&#xff0c;类型转换的基本语法为&#xff1a; ne…

Redis Stack 安装部署

参考&#xff1a;Run Redis Stack on Docker | Redis Redis-stack 初体验_redis stack-CSDN博客 【docker】运行redis_docker run redis-stack-server requirepass-CSDN博客 Redis Stack 是一组软件套件&#xff0c;它主要由三部分组成。 一个是 Redis Stack Server&#x…

艺术点亮新乡村--博罗县“村ART“乡村艺术创作大赛圆满落幕

三月的博罗大地春意盎然,处处洋溢着勃勃生机。在这万物复苏、欣欣向荣的美好时节,一场由农民自编自演、自导自绘的乡村文化盛宴在古朴幽静的徐田村徐徐拉开帷幕。由博罗县委宣传部倾情指导,县文联、文广旅体局、文明办通力合作,泰康保险集团鼎力承办的"村ART"乡村艺术…

AI技术创业:探索无限商机与创新之路

AI技术创业在当前数字化时代呈现出蓬勃发展的态势&#xff0c;为创业者提供了广阔的机会和无限的可能性。随着AI技术的不断进步和应用领域的拓展&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗健康到金融服务&#xff0c;几乎每一个行业都在积极拥抱AI&#xff0c;寻求创…

多功能知识付费源码下载-实现流量互导多渠道变现(带详细安装教程)

资源变现类产品的许多优势&#xff0c;并剔除了那些无关紧要的元素&#xff0c;使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持&#xff1a;视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线…

MySQL DBA 需要了解一下 InnoDB Online DDL 算法更新

在 MySQL 8.0.12 中&#xff0c;我们引入了一种新的 DDL 算法&#xff0c;该算法在更改表的定义时不会阻塞表。第一个即时操作是在表格末尾添加一列&#xff0c;这是来自腾讯游戏的贡献。 然后在 MySQL 8.0.29 中&#xff0c;我们添加了在表中任意位置添加&#xff08;或删除&…

14种建模语言(UML)图形

前言 UML 中有四种关系&#xff1a;依赖、关联、泛化和实现。这四种关系是 UML 模型中可以包含的基本关系事物。这里介绍14种UML图形:类图&#xff0c;对象图&#xff0c;包图&#xff0c;构件图&#xff0c;组合结构图&#xff0c;部署图&#xff0c;制品图&#xff0c;用例图…

sql之每日五题day02--多表联查/聚合函数/多值判断/函数

sql之每日五题day01--多表联查/聚合函数 where和group by同时出现分别查看&结果不去重--union allunion all细节别名case when多值判断数据处理函数 where和group by同时出现 SQL24 统计每个用户的平均刷题数 仅查看山东大学的用户在不同难度下的每个用户的平均答题题目数…

DNDC模型对所有处理的土壤温度和湿度模拟效果良好,但有时土壤湿度模拟存在偏差

使用 DNDC 模型评估加拿大多样化作物轮作系统对产量和 N2O 排放的影响 原名&#xff1a;Assessing the impacts of diversified crop rotation systems on yields and nitrous oxide emissions in Canada using the DNDC model 译名&#xff1a;使用 DNDC 模型评估加拿大多样…

爬虫逆向实战(39)-某某兔装修网登陆(RSA)

一、数据接口分析 主页地址&#xff1a;某某兔装修网 1、抓包 通过抓包可以发现登陆是表单提交 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块&#xff0c;可以发现有一个val和password的加密参数 请求头是否加密&#xff1f; 无响应是否加密…

vue 实现自定义分页打印 window.print

首先这里是我自定义了打印界面才实现的效果&#xff0c;如果不用自定义界面实现&#xff0c;应该是一样的吧。具体可能需要自己去试试看 我的需求是界面有两个表格&#xff0c;点击全部打印&#xff0c;我需要把第一表格在打印是第1页&#xff0c;第二个表格是第二页 如图&…

大宋咨询(深圳舆情监控)政府舆情调查介绍

公众舆论调查旨在收集和分析普通大众对各种主题和问题的观点、态度和意见&#xff0c;它可以帮助政府部门了解公众的意见和情绪&#xff0c;为政策制定和决策提供参考。这些调查旨在了解人群的集体情绪和偏好&#xff0c;并提供公众舆论的见解。 公众舆论调查可以涵盖广泛的主…

SmartChart的部署以及可能遇见的报错解决方案

简介 数据可视化是一种将数据转化为图形的技术&#xff0c;可以帮助人们更好地理解和分析数据。但是&#xff0c;传统的数据可视化开发往往需要编写大量的代码&#xff0c;或者使用复杂的拖拽工具&#xff0c;不仅耗时耗力&#xff0c;而且难以实现个性化的需求。有没有一种更…

pytorch中的while for 循环 导出onnx的问题

问题&#xff1a; for执行次数不跟据输入而改变。 解决方案&#xff1a; torch.jit.script 例如&#xff1a; class LoopAdd(torch.nn.Module):def __init__(self):super().__init__()def forward(self, x):h xfor i in range(x.size(0)):h h 1return h input_1 torch…

Sora是什么 Sora怎么使用OpenAI最新文字转视频AI模型Sora,一句子生成60秒超逼画面

1. 背景介绍 随着人工智能技术的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;技术已经取得了显著的进步。近年来&#xff0c;将文本转换为视频的技术逐渐成为研究的热点。OpenAI最新推出的文字转视频AI模型Sora&#…

983. 最低票价 C++

class Solution { public:int mincostTickets(vector<int>& days, vector<int>& costs) {// 状态定义&#xff1a; f[i] 表示 i 天及之后 旅行所需的最小花费int f[366]{};// 标注哪些天 出门for (int v: days) f[v] 1;// 由于状态转移是逆向的 所以倒序 …

号称史上最全的PostgreSQL备份恢复,送给有缘人...

&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; 中国DBA联盟(ACD…

ftp在linux部署及其安装

安装ftp服务 yum install -y vsftpd 查看一下是否安装成功 rpm -qa |grep ‘vsftpd’ ftp的配置文件主要有三个&#xff0c;位于/etc/vsftpd/目录下&#xff0c;分别是&#xff1a; ftpusers&#xff1a;用来指定哪些用户不能访问ftp服务器 user_list:&#xff1a;这个文…

java的Math类,System类,Runtime类和BigDemical类常用的API

Math类&#xff1a; 代表数学&#xff0c;是一个工具类&#xff1b; public static int abs(int a) Returns the absolute value of an int value. If the argument is not negative, the argument is returned. If the argument is negative, the negation of the argument i…