單片機串口接收字符串 然后根據接收到的字符串執行命令,適合各種串口通訊實現控制
單片機源程序如下:
- /*************** ***********************************************************************
- * 串口通信控制 *
- 實現現象:下載程序后打開串口調試助手,將波特率設置為4800,根據串口接收到的數據執行不同命令。
- 注意事項:無。
- ***************************************************************************************/
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- #include "string.h"
- #include "intrins.h"
- typedef unsigned int u16; //對數據類型進行聲明定義
- typedef unsigned char u8;
- char jiesuo[10] = {'l','j','t','a','o','0','5','2','1','\0'};
- char suoche[10] = {'q','l','w','q','e','p','5','2','0','\0'};
- char qixihuo[10] = {'9','1','1','2','1','7','5','2','1','\0'};
- char receiveDatas[10];
- sbit k1 = P1^4;
- sbit k2 = P2^2;
- sbit k3 = P2^1;
- sbit k4 = P2^0;
- sbit da = P1^3;
- sbit v = P1^5;
- sbit gnd = P1^2;
- int br=1;
- int i=0;
- int s=0;
- int t=0;
- int m=0;
- void Receive(char x);
- void result();
- void delay500ms();
- void delay1s();
- sfr WDT_CONTR=0xe1;
- /*******************************************************************************
- * 函數名 :UsartInit()
- * 函數功能 :設置串口
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void UsartInit()
- {
- SCON=0X50; //設置為工作方式1
- TMOD=0X21; //設置計數器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF4; //計數器初始值設置,注意波特率是4800的,晶振11.0592
- TL1=0XF4;
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- TR1=1; //打開計數器
- ET0 = 1;
- TR0 = 1;
- TH0 = 0x4C;
- TL0 = 0x00;
- WDT_CONTR=0x35;
- }
- /*******************************************************************************
- * 函 數 名 : main
- * 函數功能 : 主函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- UsartInit(); // 串口初始化
- v=1;
- da=1;
- gnd=0;
- k1=0;
- k2=0;
- k3=0;
- k4=0;
- while(1)
- {
- delay1s();
- delay500ms();
- WDT_CONTR=0x35;
- };
- }
- /*******************************************************************************
- * 函數名 : Usart() interrupt 4
- * 函數功能 : 串口通信中斷函數
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- void Usart() interrupt 4
- {
- u8 receiveData;
- receiveData=SBUF;//出去接收到的數據
- Receive(receiveData);
- RI = 0;//清除接收中斷標志位
- SBUF=receiveData;//將接收到的數據放入到發送寄存器
- while(!TI); //等待發送數據完成
- TI=0; //清除發送完成標志位
- }
- /**************************************************
- 將接收到的字符存入字符串
- ***************************************************/
- void Receive(char x)
- {
- receiveDatas[i]=x ;
- i++;
- if(i==9){
- i=0;
- result();
-
- }
- }
- /*******************************************
- 對比字符串執行命令
- *********************************/
- void result()
- {
- int a= strcmp(receiveDatas,jiesuo) ;
- int b= strcmp(receiveDatas,suoche);
- int c= strcmp(receiveDatas,qixihuo);
- if(a==0)
- {k3=1;
-
- delay500ms();
- WDT_CONTR=0x35;
- k3=0;
- }
- if(b==0)
- {
- k1=1;
- delay500ms();
- WDT_CONTR=0x35;
- k1=0;
- }
- if(c==0)
- {k2=1;
- delay1s();
- WDT_CONTR=0x35;
- delay1s();
-
- delay1s();
- WDT_CONTR=0x35;
- delay1s();
-
- delay1s();
- WDT_CONTR=0x35;
- delay1s();
- k2=0;
- }
- }
- /***********************************************
- 定時器中斷
- *****************************************/
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x4C;
- TL0 = 0x00;
- s++;
- t++;
- if(s==10){
- i=0;
- s=0;
- }
- if(t==30)
- {
- WDT_CONTR=0x35;
- t=0;
- }
-
- if(da==0)
- {
- if (br==1)
- {
- m++;
- if(m==30000)
- { k4=1;
- delay1s();
- delay500ms();
- WDT_CONTR=0x35;
- delay500ms();
- delay1s();
- k1=1;
- br=0;
- delay500ms();
- k1=0;
- WDT_CONTR=0x35;
- delay1s();
- delay500ms();
- WDT_CONTR=0x35;
- delay500ms();
- delay1s();
- WDT_CONTR=0x35;
- k4=0;
- }
- }
- }
- else
- {
- br=1;
- m=0;
- }
-
- //add your code here!
- }
- /*********************************************
- 延時0.5秒 和延時1秒 9秒
- *******************************************/
- void delay1s() //誤差 -0.000000000227us
- {
- unsigned char a,b,c;
- for(c=13;c>0;c--)
- for(b=247;b>0;b--)
- for(a=142;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
- void delay500ms() //誤差 -0.000000000114us
- {
- unsigned char a,b,c;
- for(c=98;c>0;c--)
- for(b=127;b>0;b--)
- for(a=17;a>0;a--);
- _nop_(); //if Keil,require use intrins.h
- }
復制代碼
所有資料51hei提供下載:
串口控制.7z
(15.52 KB, 下載次數: 168)
2018-2-9 18:50 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|