標題: 串口以固定格式發送信號給51單片機來控制多盞LED亮滅 [打印本頁]
作者: kill_ha_ha 時間: 2019-10-30 18:03
標題: 串口以固定格式發送信號給51單片機來控制多盞LED亮滅
單片小白剛接觸單片機不久,看見單片機可以通過串口通信來實現控制功能,就想通過串口觸摸屏輸出信號來實現控制多個LED,遂借來一個串口屏進行試驗,發現串口屏只是輸出了一串數字(A5 5A 06 83 00 01 01 00 01),查了下串口屏說明,對數字串做出如下解釋:一二位為幀頭(A5 5A),第三位為字節長度(06),第四位為讀指令(83),后五位為字節位(00 01 01 00 01),多開關的話后五位會有所不同以區分是哪個開關發出的信號;現本人只能做到串口有信號來只有一個LED亮滅,不知如何寫代碼讓單片機能識別這串數字來控制不同的LED亮滅,代碼如下,還望各位高手斧正、賜教。
單片機源程序如下:
#include <reg52.h> //載入頭文件
typedef unsigned int u16; //定義一些用到的函數
typedef unsigned char u8;
uchar i;
sbit led0=P0^0; //定義LED管腳
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
void UsartInit() //初始化串口數據9600
{
TMOD = 0x20;
SCON = 0x50;
TH1 = TL1 = 0xFD;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void main()
{
led0=0;
led1=0;
led2=0;
led3=0;
UsartInit();
while(1);
}
void Usart() interrupt 4 //中斷函數
{
u8receiveData;
i=SBUF;
switch(i)
{
Case ' ? ':led0=~led0;
case ' ? ':led1=~led1;
case ' ? ':led2=~led2;
case ' ? ':led3=~led3;
}
receiveData=SBUF;
RI=0;
SBUF=receiveData;
while(!TI);
TI=0;
}
作者: wulin 時間: 2019-10-30 18:04
給你寫一個串口接收固定長度字符串示例參考,需要按串口屏按鍵的定義修改。- #include <reg51.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit led0=P1^0;
- sbit led1=P1^1;
- sbit led2=P1^2;
- sbit led3=P1^3;
- u8 rec_buf[9];
- bit flag=0;
- void InitUART()
- {
- TMOD = 0x20;
- SCON = 0x50;
- TH1 = 0xFA;
- TL1 = TH1;
- PCON = 0x80;
- EA = 1;
- ES = 1;
- TR1 = 1;
- }
- void main()
- {
- u8 i;
- InitUART();
- while(1)
- {
- if(flag==1)
- {
- flag=0;
- //以下需要按自定義協議解析數據,這是隨便寫的示范
- i=rec_buf[4]+rec_buf[5]+rec_buf[6]+rec_buf[7]+rec_buf[8];
- switch(i)
- {
- case 0:led0=~led0;break;
- case 1:led1=~led1;break;
- case 2:led2=~led2;break;
- case 3:led3=~led3;break;
- }
- }
- }
- }
- void UARTInterrupt() interrupt 4
- {
- static u8 num=0; //靜態變量
- RI=0; //接收中斷請求標志位清0
- rec_buf[num]=SBUF; //接收到的數據保存在緩存數組
- // SBUF=rec_buf[num]; //返回收到的數據
- // while(!TI);
- // TI=0;
- if(rec_buf[0]==0xA5) //驗證數據頭第1字節
- {
- num++;
- if(num==2)
- {
- if(rec_buf[1]!=0x5A)//驗證數據頭第2字節
- num=0; //否則從第1字節重新接收字符串
- }
- if(num>=9)
- {
- flag=1; //接收完成標志置1
- num=0;
- }
- }
- }
- //A5 5A 06 83 00 01 01 00 01
復制代碼
作者: csmyldl 時間: 2019-10-30 19:34
switch(i)
{
Case ' ? ':led0=~led0;
case ' ? ':led1=~led1;
case ' ? ':led2=~led2;
case ' ? ':led3=~led3;
}
接收到的數據不只是一個,應該把所有數據都接收完放在一個緩沖區,而且接收緩字區數據前5個字節,剩下的字節數,每一個字節去控制一個LED燈,switch語句中的case未區分不同的數據
作者: 來51學習的 時間: 2019-10-30 20:17
你好!
要想控制,需要后五位(00 01 01 00 01)數據來完成;
串口屏共設定多少個按鍵?每個按鍵的輸出都是什么?
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |