LED 線陣 遠端修改 圖案

2021-05-14 21:00:02

更新中…

線陣 通過使用者端,遠端修改圖形

  1. STC 15w4
  2. ESP8266

流程

  1. 網頁傳送圖形資料
  2. ESP8266 通過emq協定接收
  3. ESP8266 通過UART 串列埠通訊將資料轉發到stc15微控制器
  4. 微控制器通過串列埠中斷接收,將圖形資料更新
  5. 最終顯示更新後的圖形

STC15 嵌入 WiFi 模組引腳圖

在這裡插入圖片描述

WiFi模組對應通訊

在這裡插入圖片描述

官方檔案內給出對應的串列埠

在這裡插入圖片描述

這裡可以看出,esp8266 連線的這個串列埠2需要用到引腳 P1 ,所以之前的LED就不能再接到P1上了,這裡直接將P1上所有的led接到P0上。以防影響到串列埠通訊。

通過U轉串模組,將微控制器串列埠與PC串列埠連線,進行模擬通訊

在這裡插入圖片描述

模擬結果
在這裡插入圖片描述

原始碼:

程式碼中註釋

  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);
	}
}