51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)

这篇具有很好参考价值的文章主要介绍了51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标效果:

1、电脑发送任意小于<=8位数字(SUBF只有8位最大只能发送255,但是可以通过数组进行临时存储来实现传输多字节)数字,在数码管上显示对应的数字且同时满足高位是0可以不显示

 2、矩阵按键按下后,电脑接收所按下的按钮


实验器材:

1、普中51单片机。2、STC官方下载器自带的串口调试的功能


相关资料 (普中官方资料)

SCON寄存器的相关介绍51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)

51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)


最新的代码(可以实现一次性传输多字节也就是可以传输8位数字)

#include <REGX52.H>
 
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
#define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口
 
 
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
 
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
#define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口
 
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
u16 shuju[8]=0;
u32 a,key;//a用来接收收到的数字,key是接收到的按键
u8 num=0,flag=0;
void configuart(u16 baud);
 
void delay (u16 time)
{
	while(time--);
}
 
u8 anjian_scan(void)
{
	static u8 keyvalue=0;
	KEY_MATRIX_PORT=0x0f;
	if(KEY_MATRIX_PORT!=0x0f)
	{
		delay(1000);
		if(KEY_MATRIX_PORT!=0x0f)
		{
			KEY_MATRIX_PORT=0x0f;
			switch(KEY_MATRIX_PORT)//保存行为 0,按键按下后的列值
			{
				case 0x07: keyvalue=1;break;
				case 0x0b: keyvalue=2;break;
				case 0x0d: keyvalue=3;break;
				case 0x0e: keyvalue=4;break;
			}
			KEY_MATRIX_PORT=0xf0;
			switch(KEY_MATRIX_PORT)//保存列为 0,按键按下后的键值
			{
				case 0x70: keyvalue=keyvalue;break;
				case 0xb0: keyvalue=keyvalue+4;break;
				case 0xd0: keyvalue=keyvalue+8;break;
				case 0xe0: keyvalue=keyvalue+12;break;
			}
			while(KEY_MATRIX_PORT!=0xf0);
		}
	}
	else
		keyvalue=0;
	return keyvalue;
}
 
void smg_display(u32 b)
{
	u8 i=0,flag=0;
	shuju[0]=b%16;
	shuju[1]=b/16%16;
	shuju[2]=b/16/16%16;
	shuju[3]=b/16/16/16%16;
	shuju[4]=b/16/16/16/16%16;
	shuju[5]=b/16/16/16/16/16%16;
	shuju[6]=b/16/16/16/16/16/16%16;
	shuju[7]=b/16/16/16/16/16/16/16;
	for(i=7;i>=0;i--)
	{
		if(shuju[i]==0)
			shuju[i]=16;
		else if(shuju[i]!=0)//从高位开始检测是不是有0一旦检测到有0退出循环
			break;
	}
	for(i=0;i<8;i++)
	{
		switch(i)//位选
		{
			case 7: LSC=1;LSB=1;LSA=1;break;
			case 6: LSC=1;LSB=1;LSA=0;break;
			case 5: LSC=1;LSB=0;LSA=1;break;
			case 4: LSC=1;LSB=0;LSA=0;break;
			case 3: LSC=0;LSB=1;LSA=1;break;
			case 2: LSC=0;LSB=1;LSA=0;break;
			case 1: LSC=0;LSB=0;LSA=1;break;
			case 0: LSC=0;LSB=0;LSA=0;break;
		}
		SMG_A_DP_PORT=gsmg_code[shuju[i]];//传送段选数据
		delay(100);//延时一段时间,等待显示稳定
		SMG_A_DP_PORT=0x00;//消影
	}
}
 
void main()
{
	EA=1;
	configuart(9600);
	while(1)
	{
		smg_display(a);
		num=0;
		key=anjian_scan();
		if(key!=0)
			SBUF=key-1;
	}
}
 
void configuart(u16 baud)
{
	SCON=0x50;
	TMOD&=0x0f;
	TMOD|=0X20;
	TH1=256-(11059200/12/32/baud);
	TL1=TH1;
	ET1=0;
	TR1=1;
	ES=1;
}
 
void interruptUART() interrupt 4
{
	unsigned long int i,b,c;
	EA=0;
	if(RI==1)
	{
		RI=0;
		shuju[num]=SBUF;
		num++;
		flag=1;
	}
	EA=1;
	if(flag==1)               
	{
		a=0;
		for(i=0;i<num;i++)     
		{
			b=shuju[i]/16;
			c=shuju[i]%16;
			if(b!=0)
			{
				a=a*16*16+shuju[i];
			}else{
				a=a*16+c;
			}
		}
	}
	if(TI==1)
		TI=0;
}

代码(原先第一次写的旧代码只能实现传输<=255的数字)

#include <REGX52.H>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
#define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
u16 shuju[8]=0;
u16 a,key;//a用来接收收到的数字,key是接收到的按键

void configuart(u16 baud);

void delay (u16 time)
{
	while(time--);
}

u8 anjian_scan(void)
{
	static u8 keyvalue=0;
	KEY_MATRIX_PORT=0x0f;
	if(KEY_MATRIX_PORT!=0x0f)
	{
		delay(1000);
		if(KEY_MATRIX_PORT!=0x0f)
		{
			KEY_MATRIX_PORT=0x0f;
			switch(KEY_MATRIX_PORT)//保存行为 0,按键按下后的列值
			{
				case 0x07: keyvalue=1;break;
				case 0x0b: keyvalue=2;break;
				case 0x0d: keyvalue=3;break;
				case 0x0e: keyvalue=4;break;
			}
			KEY_MATRIX_PORT=0xf0;
			switch(KEY_MATRIX_PORT)//保存列为 0,按键按下后的键值
			{
				case 0x70: keyvalue=keyvalue;break;
				case 0xb0: keyvalue=keyvalue+4;break;
				case 0xd0: keyvalue=keyvalue+8;break;
				case 0xe0: keyvalue=keyvalue+12;break;
			}
			while(KEY_MATRIX_PORT!=0xf0);
		}
	}
	else
		keyvalue=0;
	return keyvalue;
}

void smg_display(u16 b)
{
	u8 i=0,flag=0;
	shuju[0]=b%10;
	shuju[1]=b/10%10;
	shuju[2]=b/100%10;
	shuju[3]=b/1000%10;
	shuju[4]=b/10000%10;
	shuju[5]=b/100000%10;
	shuju[6]=b/1000000%10;
	shuju[7]=b/10000000;
	for(i=7;i>=0;i--)
	{
		if(shuju[i]==0)
			shuju[i]=16;
		else if(shuju[i]!=0)//从高位开始检测是不是有0一旦检测到有0退出循环
			break;
	}
	for(i=0;i<8;i++)
	{
		switch(i)//位选
		{
			case 7: LSC=1;LSB=1;LSA=1;break;
			case 6: LSC=1;LSB=1;LSA=0;break;
			case 5: LSC=1;LSB=0;LSA=1;break;
			case 4: LSC=1;LSB=0;LSA=0;break;
			case 3: LSC=0;LSB=1;LSA=1;break;
			case 2: LSC=0;LSB=1;LSA=0;break;
			case 1: LSC=0;LSB=0;LSA=1;break;
			case 0: LSC=0;LSB=0;LSA=0;break;
		}
		SMG_A_DP_PORT=gsmg_code[shuju[i]];//传送段选数据
		delay(100);//延时一段时间,等待显示稳定
		SMG_A_DP_PORT=0x00;//消影
	}
}

void main()
{
	EA=1;
	configuart(9600);
	while(1)
	{
		smg_display(a);
		key=anjian_scan();
		if(key!=0)
			SBUF=key-1;
	}
}

void configuart(u16 baud)
{
	SCON=0x50;
	TMOD&=0x0f;
	TMOD|=0X20;
	TH1=256-(11059200/12/32/baud);
	TL1=TH1;
	ET1=0;
	TR1=1;
	ES=1;
}

void interruptUART() interrupt 4
{
	if(RI==1)//接收到字节
	{
		RI=0;
		a=SBUF;
	}
	if(TI==1)
		TI=0;
}

高位不显示的代码

原理:通过循环检测是否有0,如果检测到有0,则将该位赋值为16,对应数码管的就是0x00

注意的是我们数码管采用的是共阴数码管,所以0x00才是不显示。

for(i=7;i>=0;i--)
	{
		if(shuju[i]==0)
			shuju[i]=16;
		else if(shuju[i]!=0)//从高位开始检测是不是有0一旦检测到有0退出循环
			break;
	}

 注意还要在数码管数组那里补充一个0x00。

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

特别注意:

在传输大于4位的时候要使用long int数据类型,如果使用int会导致长度不够而储存不下


实验步骤:

1、首先要打开串口助手页面,并打开串口

2、选择合适的波特率,这里根据代码我选择9600

51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)

 3、在发送缓冲区选择hex模式,注意这里填入的数字是以16进制返回,这就意味着填入10,数码管显示的是16,(如果我们想要达到输入10返回也是10,则需要在用数组重新变回原数字的时候/16,%16处理)(最新代码已经实现)且因为SBUF寄存器只有8位,所以最大只能填入FF,对应的10进制就是255(但是可以通过数组的形式暂时储存数据,然后等所有数据也就是带个字节都接受过来再处理重新组合成原来的数字)(最新代码已经实现)

4、在发送缓冲区填入数字即可看到对应的结果

5、任意按下对应的按钮即可看到接收缓冲区收到的数据


实验现象:

电脑在发送缓冲区输入9,数码管显示9

51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)

旧版代码效果最大只能传输255 51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)

新版代码可以传输8位数下面是效果图(电脑端输入11223344)

51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)

 这是按钮0到7按下后收到的数据51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)文章来源地址https://www.toymoban.com/news/detail-433500.html

到了这里,关于51单片机的串口实验之数码管显示与按键实验(8位数字任意传输)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机数码管

    51单片机的数码管是一种常用的数字显示设备,用于在嵌入式系统中显示数字和一些特定的符号。数码管通常由七段LED组成,每个LED段可以显示数字0到9以及一些字母和符号。通过控制每个LED段的亮灭,可以显示不同的数字和字符。 在51单片机中,数码管通常连接到GPIO(通用

    2024年01月21日
    浏览(49)
  • 51单片机(四)静态数码管和动态数码管显示

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(47)
  • 【51单片机】动态数码管

    0、前言 参考: 普中51单片机开发攻略–A2.pdf 上一章我们主要是介绍一位数码管的内部结构及控制原理。下面我们再来介 绍下多位数码管及动态显示原理的相关知识。 本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7。 为了正规点,工程弄个正规文件夹: http

    2024年01月21日
    浏览(70)
  • 二、51单片机控制数码管

    (1)数码管的外观: 数码管可分为单个的,联排的(2位、4位、8位) (2)数码管的作用: 数码管是显示器件,是用来显示数字的。 (1)数码管的亮灭是由内部的照明LED的亮灭实现的。 (2)一位数码管内部有八颗LED灯,利用内部的LED灯的亮和灭让数码管显示不同的数字。 (1)驱动方法的

    2023年04月09日
    浏览(52)
  • 51单片机(数码管可调时钟)

    1.数码管(共阴极)如何显示数字:位选+段选(单个) 位选:138译码器通过P22、P23、P24三个端口输入二进制数(011、000等)来选择连同译码器右边的哪一条线,而这些线又分别连着数码管的LED12345678、决定选择哪一个来显示数字 段选:决定输出什么数字,数码管下方又连着一

    2024年02月05日
    浏览(50)
  • 51单片机入门————数码管显示

    我们在马路上看到的红绿灯,就是由数码管来实现的,就是其中可能加入了一些延时和转换 数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示 我们先讨论一个数码管 数码管有共阳极和共阴极,我们现在使用的STC89C52是共阴极的,说明数码管共用阴极 上面是

    2024年02月13日
    浏览(45)
  • 51单片机静态数码管显示

    51单片机静态数码管显示 数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件。   数码管从上右下左中有ABCDEFGDP,共10个引脚,其中3、8号引脚是连接到所有二极管的阴极,A二级管对应7号和38号引脚,B二极管对应6号和38号引脚。所有阴极

    2024年02月08日
    浏览(71)
  • 51单片机数码管显示(三)

    目录 一、静态数码管显示 1、一位数码管 (1)LED数码管各段名称 (2)数码管引脚定义 (3) 共阴极(89C52RC单片机LED数码管采用共阴极方式) (4)共阳极 2、四位一体数码管 (1)四位一体数码管引脚定义 (2)上面共阴极和下面共阳极  3、数码管模块原理图详解 4、编写

    2024年02月08日
    浏览(44)
  • 51单片机矩阵键盘——数码管显示

    当我们熟悉了数码管的位选与段选,并了解的矩阵键盘的扫描之后就可以编写程序了。 按下矩阵键盘S1并松开,数码管第一位(LED8)显示0;按下矩阵键盘S2并松开,数码管第一位显示1;...按下矩阵键盘S16并松开,数码管第一位显示F; 矩阵键盘扫描(输入扫描)     原理:

    2024年02月11日
    浏览(55)
  • 51单片机控制数码管动态显示

    首先打开proteus,导入8位数码管和89c51。 然后如图连线,分清断码和位码, 断码就是一个数码管的7个LED灯。 位码:就是第几位显示,由于是共阴极,所以哪位接地就显示哪位。 下面通过改变位码的接线就可以看出不同的效果 下面就编写程序,从第1位到第8位显示从0到7的八

    2023年04月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包