51单片机串口发送数据点阵屏倒计时程序
时间: 2023-08-14 17:02:23 浏览: 53
以下是51单片机串口发送数据点阵屏倒计时程序的代码:
```
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define CLK 6 // 时钟线
#define DATA 7 // 数据线
#define LATCH 5 // 锁存线
sbit CLK_PIN = P2^CLK;
sbit DATA_PIN = P2^DATA;
sbit LATCH_PIN = P2^LATCH;
uchar code LED_DuanMa[17] = { // 共阴极数码管的段码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00
};
uchar code LED_WeiMa[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; // 共阴极数码管的位码
uchar code TimeSet[8] = {0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; // 倒计时时间,从1秒开始
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void Display() { // 显示函数
uchar i, j, k;
for (i = 0; i < 8; i++) { // 逐位扫描
k = LED_WeiMa[i]; // 获取当前位码
LATCH_PIN = 0; // 锁存线拉低
for (j = 0; j < 8; j++) { // 逐段输出
DATA_PIN = (LED_DuanMa[TimeSet[j]] & (0x01 << i)) ? 1 : 0; // 获取当前段码
CLK_PIN = 0;
_nop_();
CLK_PIN = 1;
}
DATA_PIN = (k & 0x01) ? 1 : 0; // 输出位码
CLK_PIN = 0;
_nop_();
CLK_PIN = 1;
LATCH_PIN = 1; // 锁存线拉高
}
}
void UART_Init() { // 串口初始化函数
TMOD &= 0x0f;
TMOD |= 0x20;
SCON = 0x50;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
}
void UART_Send(uchar dat) { // 串口发送函数
SBUF = dat;
while (!TI);
TI = 0;
}
void main() {
uchar i, j, dat;
UART_Init(); // 初始化串口
while (1) {
if (RI) { // 接收到数据
RI = 0;
dat = SBUF;
switch (dat) {
case 's': // 开始倒计时
while (1) {
for (i = 0; i < 8; i++) { // 倒计时循环
TimeSet[i]--;
if (TimeSet[i] == 0xff) { // 溢出处理
TimeSet[i] = 9;
if (i == 7) { // 倒计时结束
delay(1000);
for (j = 0; j < 8; j++)
TimeSet[j] = 0;
break;
}
else
TimeSet[i+1]--;
}
}
Display(); // 显示倒计时
delay(5); // 每个数码管显示5ms
if (RI) { // 接收到新数据
RI = 0;
dat = SBUF;
if (dat == 'e') // 结束倒计时
break;
}
}
break;
case 't': // 发送当前倒计时时间
for (i = 0; i < 8; i++)
UART_Send(TimeSet[i]);
break;
default:
break;
}
}
}
}
```
本程序在原有点阵屏倒计时程序的基础上,添加了串口通信功能。通过串口发送控制命令,可以控制倒计时的开始和结束,并且可以发送当前倒计时的时间。控制命令为字母字符,'s'表示开始倒计时,'e'表示结束倒计时,'t'表示发送当前倒计时时间。在接收到新数据时,程序会立即停止倒计时,并根据接收到的命令进行相应的操作。