![]() |
發(fā)布時間: 2018-4-30 12:36
正文摘要:現(xiàn)在有一模塊,根據(jù)不同手勢會發(fā)出四種不同的字符串指令,現(xiàn)將這4種指令發(fā)送給51單片機,從而控制單片機的P0口的LED燈不同狀態(tài)。急求大神、、、、 |
wulin 發(fā)表于 2018-4-30 16:59 多謝 wulin大神給的解答 ![]() |
給你一個示例程序,LED顯示方式自行修改,你圖中LED要加1~5K限流電阻。 #include <reg51.h> #define uint unsigned int #define uchar unsigned char uchar table0[] ="OK\n"; //用于串口助手返回驗證 uchar table1[]="ERROR\n";//用于串口助手返回驗證 uchar rec_buf[7]; //接收數(shù)據(jù)緩存 uchar V_data; //收到的有效數(shù)據(jù)變量 bit flag=0; //接收完成標 /*************初始化串口**************/ void InitUART() //9600bps@11.0592MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位數(shù)據(jù),可變波特率 TMOD|= 0x20; //設(shè)定定時器1為8位自動重裝方式 TL1 = 0xFD; //設(shè)定定時初值 TH1 = 0xFD; //設(shè)定定時器重裝值 TR1 = 1; //啟動定時器1 ET1 = 0; //禁止定時器1中斷 EA = 1; //開總中斷 ES = 1; //開串口中斷 } /**********串口發(fā)送函數(shù)*************/ void SendOneByte(uchar c) { SBUF = c; //發(fā)送數(shù)據(jù) while(!TI); //等待發(fā)送完成 TI = 0; //發(fā)送中斷請求標志位清0 } /************數(shù)據(jù)解析程序*************/ void analysis() { uchar i; //臨時變量 if(flag==1) //如果7個字節(jié)數(shù)據(jù)串接收完成 { ES=0; //關(guān)串口中斷 flag=0; //接收完成標志清0 if(rec_buf[4]==~(rec_buf[0]+rec_buf[1]+rec_buf[2]+rec_buf[3]+rec_buf[5]+rec_buf[6]+1))//驗證數(shù)據(jù)校驗和 {//校驗和=其它數(shù)據(jù)的和+1取反 V_data=rec_buf[2];//提取有效數(shù)據(jù) for(i=0;i<3;i++) SendOneByte(table0[i]);//返回OK } else { rec_buf[0]=rec_buf[1]=rec_buf[2]=rec_buf[3]=rec_buf[4]=rec_buf[5]=rec_buf[6]=0;//清除緩存 V_data=0xff; //提取有效數(shù)據(jù)失敗 for(i=0;i<7;i++) SendOneByte(table1[i]);//返回ERROR } ES=1; //開串口中斷 } } /**********顯示程序**********/ void display() { switch(V_data) { case 0x10: P0=0xf0; break; case 0x11: P0=0x0f; break; case 0x12: P0=0xaa; break; case 0x13: P0=0x55; break; default:P0=0xff; break; } } /**************主程序**************/ void main() { InitUART(); //初始化串口 while(1) { analysis(); //數(shù)據(jù)解析 display(); //顯示 } } /*********串口中斷服務(wù)程序**********/ void UARTInterrupt() interrupt 4 { static uchar num=0; //靜態(tài)計數(shù)變量 RI=0; //接收中斷請求標志位清0 rec_buf[num]=SBUF; //接收到的數(shù)據(jù)串保存在緩存數(shù)組 if(rec_buf[0]==0x5A) //驗證數(shù)據(jù)頭(起始位) { num++; if(num>=7) { flag=1; //7個字節(jié)數(shù)據(jù)串接收完畢,完成標志置1 num=0; //計數(shù)變量清0 } } } //5A A5 10 00 F0 55 AA //5A A5 11 00 EF 55 AA //5A A5 12 00 EE 55 AA //5A A5 13 00 ED 55 AA |
參與人數(shù) 1 | 黑幣 +5 | 收起 理由 |
---|---|---|
![]() | + 5 | 贊一個! |
P01=1; |
Powered by 單片機教程網(wǎng)