本帖最后由 guan1989 于 2020-5-23 21:02 編輯
-
- //串口通訊實驗
- //這里寫好程序 下載到單片機里
- //直接 用下載軟件的串口助手 以16進制 發送 8A 會接收到 我愛單片機
- //此程序雖然很少 但是它有著串口通訊和接收的所有功能
- //需要用串口的朋友只要用它改改就可以實現自己想要的效果
- #include "stc8.h"
- unsigned char data key_value[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //實時存儲按鍵按下標志位:LED1,LED2,LED3...LED10,test,mute,,LED_ALARM,buzzer;用于顯示和通訊
- unsigned char data key_alarm[12]={1,1,1,1,1,1,1,1,1,1,1,1}; //按鍵按下是否生效標志位:LED1,LED2,...lLED10,test,mute
- unsigned char data buzzer_value[12]={1,1,2,4,8,1,1,1,1,1,1,1};//1表示2秒1鳴,2表示1秒1鳴、4表示1秒2鳴、8表示長鳴
- /*
- 命令A11,表示key_alarm[0]=1;A10,表示key_alarm[0]=0;返回key_alarm[12]
- 命令B11,表示buzzer_value[1]=1;B10,表示buzzer_value[1]=0;返回buzzer_value[12]
- 命令KEY,返回key_value[14]
- */
- unsigned char tmp[4]; //存儲接收到的值;
- unsigned char ucreceive_num=0;
- void main()
- {
- // P3M0 |= 0x03 ;
- // P3M1 &=0xfc ; //uart1推挽輸出,需限流電阻
- SCON |= 0x50; //REN=1允許串行接受狀態,串口工作模式2
- TMOD= 0x20; //定時器工作方式2 8位 自動重裝載定時器 實現波特率
- AUXR=0X40; //開啟1T模式
- TH1 =TL1= 0xDC; // 設置波特率為9600 公式 TH1=256-(11059200/32/9600)=256-36=220 0xDC
- // 設置波特率為9600 公式 TH1=256-(22118400/32/9600)=256-72=184 0xB8
- // 如有不明白請查 STC8手冊上有詳細說明
-
-
- TR1 = 1; //開啟定時器1
- ES = 1; //開串口中斷
- EA = 1; // 開總中斷
-
- while(1)
- {
-
- }
- }
- /***********************************************
- *函數名稱:Uart1_SendChar
- *功 能:串口1發送單個字符函數
- *入口參數:Udat:欲發送的數據
- *返 回 值:無
- *備 注:無
- ************************************************/
- void int_tmp()
- {
- ucreceive_num=0;
- tmp[0]=0x00;
- tmp[1]=0x00;
- tmp[2]=0x00;
- }
- /***********************************************
- *函數名稱:Uart1_SendChar
- *功 能:串口1發送單個字符函數
- *入口參數:Udat:欲發送的數據
- *返 回 值:無
- *備 注:無
- ************************************************/
- void ISP_Check()
- {
- unsigned char a;
- unsigned char c;
- switch(tmp[0])
- {
- case 'K' :
- if((tmp[1]=='E')&&(tmp[2]=='Y'))
- {
- ES= 0;
- a=0;
- while(a<14)
- {
- SBUF = key_value[a]; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- a++; // 下一個字符
- }
- int_tmp();
- }
- break;
-
- case 'A' :
- if( ( ((tmp[1]>='0')&&(tmp[1]<='9')) || ((tmp[1]>='a')&&(tmp[1]<='b')) ) &&( (tmp[2]=='0') || (tmp[2]=='1') ))
- {
- ES= 0;
- if((tmp[1]>='0')&&(tmp[1]<='9'))
- c=tmp[1]-0X30;
- else
- c=tmp[1]-0X51;
- key_alarm[c] = (tmp[2]-0x30);
- a=0;
- while(a<12)
- {
- SBUF = key_alarm[a]; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- a++; // 下一個字符
- }
- SBUF = c; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- SBUF = tmp[2]-0x30; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- int_tmp();
- }
- break;
-
- case 'B' :
- if( ( ((tmp[1]>='0')&&(tmp[1]<='9')) || ((tmp[1]>='a')&&(tmp[1]<='b')) ) &&( (tmp[2]=='1') || (tmp[2]=='2') ||(tmp[2]=='4') ||(tmp[2]=='8') ))
- {
- ES= 0;
- if((tmp[1]>='0')&&(tmp[1]<='9'))
- c=tmp[1]-0X30;
- else
- c=tmp[1]-0X51;
- buzzer_value[c] = (tmp[2]-0x30);
- a=0;
- while(a<12)
- {
- SBUF = buzzer_value[a]; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- a++; // 下一個字符
- }
- SBUF = c; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- SBUF = tmp[2]-0x30; //SUBF接受/發送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特數據傳送 (TI發送中斷標志)
- TI = 0; // 清除數據傳送標志
- int_tmp();
- c=0;
- }
- break;
-
- default :
- ES=0;
- int_tmp();
- }
- ES=1;
- }
- void Serial_int(void) interrupt 4 using 1
- {
- if (RI)
- {
- tmp[ucreceive_num] = SBUF;
- ucreceive_num++;
- ISP_Check();
- if(ucreceive_num==3)
- int_tmp();
- RI = 0;
- }
- }
復制代碼
源代碼見附件 |