帮我写stc15用串口调试助手发送字符串,需发文本模式, 指令1 电脑端发送“数码管显示123” DIS2数码管显示123 ,(123为任意3位内的数字)电脑端接收到“已执行123”。 指令2 电脑端发送“关闭数码管” 所有数码管全灭灯 ,同时电脑端接收到“已执行”。
时间: 2024-03-24 09:40:14 浏览: 39
好的,我可以帮您解决这个问题。您可以参考下面的代码:
```c
#include <STC15F2K60S2.h>
#include <intrins.h>
#define FOSC 24000000L
#define BAUD 9600
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LATCH = P1 ^ 0; //锁存器控制引脚
sbit CLK = P1 ^ 1; //时钟控制引脚
sbit DIO = P1 ^ 2; //数据输出引脚
void delay(uint xms)
{
uint i, j;
for (i = xms; i > 0; i--)
for (j = 112; j > 0; j--)
;
}
void SendData(char dat)
{
SBUF = dat;
while (!TI)
;
TI = 0;
}
void SendString(char *s)
{
while (*s)
{
SendData(*s++);
}
}
void InitUART()
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即24MHz
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重载模式
TL1 = FOSC / 4 / BAUD; //设定定时初值
TH1 = FOSC / 4 / BAUD >> 8; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void Display(uint num)
{
uchar i, j, k;
uchar code table[] = {
0xC0, 0xF9, 0xA4, 0xB0,
0x99, 0x92, 0x82, 0xF8,
0x80, 0x90
};
for (i = 0; i < 8; i++)
{
LATCH = 0;
P0 = table[num % 10];
num /= 10;
LATCH = 1;
CLK = 0;
for (j = 0; j < 8; j++)
{
k = i * 8 + j;
LATCH = 0;
P0 = 0x01 << k;
LATCH = 1;
delay(2);
CLK = 1;
delay(2);
CLK = 0;
}
}
}
void CloseDisplay()
{
uchar i, j, k;
for (i = 0; i < 8; i++)
{
LATCH = 0;
P0 = 0xFF;
LATCH = 1;
CLK = 0;
for (j = 0; j < 8; j++)
{
k = i * 8 + j;
LATCH = 0;
P0 = 0x01 << k;
LATCH = 1;
delay(2);
CLK = 1;
delay(2);
CLK = 0;
}
}
}
void main()
{
InitUART();
while (1)
{
if (RI)
{
RI = 0;
if (SBUF == '1')
{
SendString("已执行");
Display(123);
}
else if (SBUF == '2')
{
SendString("已执行");
CloseDisplay();
}
}
}
}
```
在上面的代码中,我们使用了串口通信和数码管显示。当我们通过串口发送指令1时,会触发数码管显示123,同时回复“已执行123”;当我们发送指令2时,会触发数码管全灭,并回复“已执行”。
阅读全文