更新中…
线阵 通过客户端,远程修改图形
- STC 15w4
- ESP8266
流程
- 网页发送图形数据
- ESP8266 通过emq协议接收
- ESP8266 通过UART 串口通信将数据转发到stc15单片机
- 单片机通过串口中断接收,将图形数据更新
- 最终显示更新后的图形
图
STC15 嵌入 WiFi 模块引脚图
WiFi模块对应通信
官方文档内给出对应的串口
这里可以看出,esp8266 连接的这个串口2需要用到引脚 P1 ,所以之前的LED就不能再接到P1上了,这里直接将P1上所有的led接到P0上。以防影响到串口通信。
通过U转串模块,将单片机串口与PC串口连接,进行模拟通信
模拟结果
源码:
代码中注释
- esp8266 源码
待更新。。。
- stc15 单片机 源码
#include "stc15f2k60s2.h"
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define FOSC 11059200L //MUC主频为11.0592下
#define BAUD 9600 //串口2产生的波特率为9600
#define TM (65536-(FOSC/4/BAUD)) //计算初值
#define S2RI 0X01 //接收标志位
#define S2TI 0X02 //发送标志位
#define f(i,a,b) for((i)=(a);(i)<(b);(i)++)
u8 isUart = 0;
u16 leni=0,lenj=0;
char GledStr[16][100];
/**
延时函数
**/
void delay4us(u16 us)
{
u16 i;
u8 m;
for(i=0;i<us;i++)
for(m=0;m<5;m++);
}
//1毫秒 延时
//ms 1ms的倍数
void delay1ms(u16 ms)
{
u16 m;
for(m=0;m<ms;m++)
delay4us(250);
}
//真对 IAP15W4K61S4 STC15W4K56S4 系列 IO口初始化
//io口初始化 P0 P1 P2 P3 P4 为准双向IO口
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
void IO_init(void)
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
}
/**
左:绿
上:P47-P40 下:P37-P30
右:红
上:P17-P10 下:P27-P20
**/
#define sgreen P4
#define xgreen P3
#define sred P1
#define xred P2
/**
点灯
*/
void greenLed(u16 index){
sgreen = index>>8;
xgreen = index;
}
void redLed(u16 index){
sred = index>>8;
xred = index;
}
/**
将接中断收到的字符串,整合
**/
void ISP_Check(u8 tmp) //串口2发送数据调用函数
{
EA = 0;
S2BUF=tmp;
if(S2BUF == '{'){
// 开始
leni=lenj=0;
} else if(S2BUF == '}'){
// 结束
} else if(S2BUF == '\n'){
// 分隔符,数组换行
leni++;
lenj = 0;
} else{
// 数据部分
GledStr[leni][lenj++] = S2BUF;
}
while(S2CON&S2TI==0); // 等特数据传送 (S2TI发送中断标志)
S2CON&=~S2TI; //清标志?
EA = 1;
}
/**
串口中断,接收ESP8266传输的图像数据
传输格式:{010101001\n100011001\n100010001} 每行字符串使用空格分割
**/
void Uart2() interrupt 8 using 1 //串口2中断
{
u8 tmp;
isUart = 1; // 传输开始
if(S2CON&S2RI) //如果收到数据 S2RI置位
{
tmp=S2BUF;
ISP_Check(tmp);
S2CON&=~S2RI; //清标志位
}
isUart = 0; // 传输结束
}
main()
{
u16 i,j;
u16 msg;
S2CON = 0x50; //REN=1允许串行接受状态,串口工作模式2
T2L=TM; //配置串口2波特率 初始值
T2H=TM>>8;
AUXR=0X14; //开启定时器T2 并且开启1T模式
IE2=0X01; //串口2中断使能
EA = 1; // 开总中断
IO_init();
isUart = 1; // 开启传输
while(1)
{
while(isUart){
// 等待传输
greenLed(0xffff);
redLed(0xffff);
}
greenLed(0x0000);
redLed(0x0000);
f(i,0,lenj){
// 灭灯
delay4us(360);
greenLed(0x0000);
redLed(0x0000);
msg = 0x0000;
// 初始化 16 进制
f(j,1,16+1){
// ledStr 列转16进制
if(GledStr[j][i]=='1') msg |= 1<<(16-j);
}
// 亮灯
redLed(msg);
greenLed(msg);
delay4us(60);
}
delay1ms(10);
}
}
转载:https://blog.csdn.net/qq_44009311/article/details/116768837
查看评论