更新中…
STC15 嵌入 WiFi 模組引腳圖
WiFi模組對應通訊
官方檔案內給出對應的串列埠
這裡可以看出,esp8266 連線的這個串列埠2需要用到引腳 P1 ,所以之前的LED就不能再接到P1上了,這裡直接將P1上所有的led接到P0上。以防影響到串列埠通訊。
通過U轉串模組,將微控制器串列埠與PC串列埠連線,進行模擬通訊
模擬結果
程式碼中註釋
待更新。。。
#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);
}
}