LED 线阵 远程修改 图案

更新中…

线阵 通过客户端,远程修改图形

  1. STC 15w4
  2. ESP8266

流程

  1. 网页发送图形数据
  2. ESP8266 通过emq协议接收
  3. ESP8266 通过UART 串口通信将数据转发到stc15单片机
  4. 单片机通过串口中断接收,将图形数据更新
  5. 最终显示更新后的图形

STC15 嵌入 WiFi 模块引脚图

LED 线阵 远程修改 图案_第1张图片

WiFi模块对应通信

LED 线阵 远程修改 图案_第2张图片

官方文档内给出对应的串口

LED 线阵 远程修改 图案_第3张图片

这里可以看出,esp8266 连接的这个串口2需要用到引脚 P1 ,所以之前的LED就不能再接到P1上了,这里直接将P1上所有的led接到P0上。以防影响到串口通信。

通过U转串模块,将单片机串口与PC串口连接,进行模拟通信

LED 线阵 远程修改 图案_第4张图片

模拟结果
LED 线阵 远程修改 图案_第5张图片

源码:

代码中注释

  1. esp8266 源码
待更新。。。
  1. 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);
	}
}




你可能感兴趣的:(站点博客,单片机,c)