编写代码使51单片机和 pc 端串 行输入输出,用单片机矩阵键盘 输入一个多位数,发送到 pc 端。 同时输入的数字在数码管显示。

时间: 2024-03-18 07:38:52 浏览: 20
好的,下面是一个简单的示例代码,实现了51单片机和PC端的串口通信,以及矩阵键盘输入和数码管显示功能。这个示例代码使用了P0口作为数码管的控制端口,使用P1口作为串口通信的引脚,使用P3口作为矩阵键盘的输入和输出端口。 ```c #include <reg51.h> #define BAUDRATE 9600 // 串口波特率 #define FOSC 11059200 // 晶振频率 #define TH1_RELOAD (256 - (FOSC / BAUDRATE) / 12) // 定时器1重装值 sbit D1 = P0 ^ 0; // 数码管 D1 sbit D2 = P0 ^ 1; // 数码管 D2 sbit D3 = P0 ^ 2; // 数码管 D3 sbit D4 = P0 ^ 3; // 数码管 D4 sbit LSA = P0 ^ 4; // 数码管段选A sbit LSB = P0 ^ 5; // 数码管段选B sbit LSC = P0 ^ 6; // 数码管段选C unsigned char code digit[] = { // 数码管段码表 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; unsigned char code keymap[] = { // 矩阵键盘键值表 '1', '2', '3', 'A', '4', '5', '6', 'B', '7', '8', '9', 'C', '*', '0', '#', 'D' }; unsigned char keyvalue = 0; // 矩阵键盘输入的键值 unsigned char buffer[10] = {0}; // 存储输入的多位数字 unsigned char bufcount = 0; // 当前输入数字的位数 void delay(unsigned int t) { // 延时函数 unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 120; j++); } void init_uart() { // 初始化串口通信 TMOD |= 0x20; TH1 = TH1_RELOAD; TL1 = TH1_RELOAD; TR1 = 1; SM0 = 0; SM1 = 1; REN = 1; TI = 0; RI = 0; } void init_keyboard() { // 初始化矩阵键盘 P3 = 0xff; } void scan_keyboard() { // 扫描矩阵键盘 unsigned char i, j; P3 = 0xfe; for (i = 0; i < 4; i++) { if (P3 != 0xfe) { delay(5); if (P3 != 0xfe) { for (j = 0; j < 4; j++) { P3 = 0xf7 ^ (1 << j); if (P3 != 0xf7) { delay(5); if (P3 != 0xf7) { keyvalue = keymap[i * 4 + j]; return; } } } } } P3 = (P3 << 1) | 0x01; } } void display(unsigned char num) { // 数码管显示 LSA = 0; LSB = 0; LSC = 0; P0 = digit[num / 1000]; delay(5); LSA = 1; P0 = digit[num % 1000 / 100]; delay(5); LSB = 1; P0 = digit[num % 100 / 10]; delay(5); LSC = 1; P0 = digit[num % 10]; delay(5); } void send_char(unsigned char ch) { // 发送一个字符到串口 SBUF = ch; while (!TI); TI = 0; } void main() { unsigned int num = 0; unsigned char i; init_uart(); init_keyboard(); while (1) { scan_keyboard(); if (keyvalue != 0) { // 如果有键值输入 if (keyvalue >= '0' && keyvalue <= '9') { // 如果是数字键 buffer[bufcount++] = keyvalue; // 存储数字 num = num * 10 + (keyvalue - '0'); // 计算数字 display(num); // 数码管显示 } else if (keyvalue == '#') { // 如果是结束键 for (i = 0; i < bufcount; i++) { // 发送数字到串口 send_char(buffer[i]); } send_char('\n'); // 发送换行符 num = 0; // 清零计数器 bufcount = 0; // 清空输入缓存 display(0); // 数码管清零 } keyvalue = 0; // 清空键值 } } } ``` 这个示例代码实现了矩阵键盘输入多位数字,将数字发送到PC端,同时在数码管上显示输入的数字。当输入结束时,按下#键可以将数字发送到PC端,并清空输入缓存和数码管显示。

相关推荐

最新推荐

recommend-type

51单片机IO口输入输出方式

传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路。
recommend-type

单片机C51串口中断接收和发送测试例程(含通信协议的实现)

这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
recommend-type

单片机系统的常用输入/输出电路设计

针时电气控制产品的特点,讨论了几种单片机常用输入/输出电路的设计方法,对合理地设计电气控制系统,提高电路的接口能力,增强系统稳定性和抗干扰能力有实际指导意义。
recommend-type

51单片机串口通信的发送与接收

51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI置 1。无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机...
recommend-type

基于51单片机实现74LS164串入并出移位寄存器

对于串入并出移位寄存器以下是我个人的理解和实际开发工程中得出的经验。一个8位串入数据输入, 8位并行输出。可以看出先移的是高位,就是第一个位进去的到最后会在最高位。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。