文章目录
Led方阵和串口通信COM2(读取字膜的数据并用LED显示)
Author:Luis
Time:2022-04-06
Version:v2.0
功能
Led88点阵2的双色控制、亮度控制、串口通信控制
1、S11 全亮;S15 全暗;S19 一个暗一个亮;
S10 增加亮度;S14 减少亮度;S18 展示字;
2、串口通信,点亮灯和第几行第几列的灯。
3、通过串口读取字膜的数据并用Led方阵显示
前2个功能参考之前的文章(Led方阵和串口通信COM),此篇只用来实现第3个功能。
效果图:
环境
Keil和Protues联动调试仿真。
代码
Keil
#include <regx51.h>
// led显示
unsigned int wei[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; //扫描8位
unsigned int ReData[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 存储串口数据
unsigned char mode = 0; // 选择模式 通过串口
// 延时n毫秒
void delay_ms(unsigned int n)
{
unsigned int i = 0, j = 0;
for (i = 0; i < n; i++)
for (j = 0; j < 123; j++)
;
}
void led_init()
{
P2 = 0x07;
P0 = 0x00;
}
// 串口通讯初始化
void Serial_comInit()
{
SCON = 0x50; //配置SM0/1,并允许接收
PCON = 0x00;
TMOD = 0x20; // 设置定时器1 为方式2
TH1 = 0xfd; //装入初值 对应波特率9600
TL1 = 0xfd;
TR1 = 1; //启动定时器1
EA = 1; // 打开总中断开关
ES = 1; // 打开串口中断开关
}
// 主程序
void main()
{
unsigned int i = 0;
// 初始化
led_init();
Serial_comInit();
P1 = 0x00;
// 主循环
while (1)
{
if (mode == 1)
{
for (i = 0; i < 8; i++)
{
P2 = 0x01;
P0 = wei[i];
P2 = 0x02;
P0 = ReData[i];
delay_ms(50);
}
}
}
}
// 串口通讯 多个数据
void chuankou() interrupt 4
{
// 0x99 0x5A 0x3C 0xFF 0x18 0x9C 0xB6 0xE3
// 99 5A 3C FF 18 9C B6 E3
static char ReceiveCount = 0; // 注意
ES = 0;
if (RI)
{
ReData[ReceiveCount++] = SBUF;
if (ReceiveCount >= 8)
ReceiveCount = 0;
RI = 0;
mode = 1;
}
ES = 1;
}
Proteus
下面的Protues图请参考之前的文章(Led方阵和串口通信COM),在此就不一一展示了。
主板AT89C52
存器74HC573
按键
Led方阵
串口通信COMPIM
注意点
1、串口读取数据(SBUF)是8位一个个进行读取,循环interrupt 4,所以,在中断中,序号的类型必须是能循环改变的。static或者是全局变量。
未解决的问题
Led方阵显示仿真不能连续看到一个字,而是在刷新,可能实物能够忽略此问题。本人也尝试过改变延迟的时间长度,但是都不尽人意。
如果有大佬在评论区,望能指出代码orProteus图的问题,谢谢!!!