|
|
本帖最后由 guan1989 于 2020-5-23 21:02 編輯
-
- //串口通訊實(shí)驗(yàn)
- //這里寫(xiě)好程序 下載到單片機(jī)里
- //直接 用下載軟件的串口助手 以16進(jìn)制 發(fā)送 8A 會(huì)接收到 我愛(ài)單片機(jī)
- //此程序雖然很少 但是它有著串口通訊和接收的所有功能
- //需要用串口的朋友只要用它改改就可以實(shí)現(xiàn)自己想要的效果
- #include "stc8.h"
- unsigned char data key_value[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //實(shí)時(shí)存儲(chǔ)按鍵按下標(biāo)志位: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}; //按鍵按下是否生效標(biāo)志位: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表示長(zhǎng)鳴
- /*
- 命令A(yù)11,表示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]; //存儲(chǔ)接收到的值;
- unsigned char ucreceive_num=0;
- void main()
- {
- // P3M0 |= 0x03 ;
- // P3M1 &=0xfc ; //uart1推挽輸出,需限流電阻
- SCON |= 0x50; //REN=1允許串行接受狀態(tài),串口工作模式2
- TMOD= 0x20; //定時(shí)器工作方式2 8位 自動(dòng)重裝載定時(shí)器 實(shí)現(xiàn)波特率
- AUXR=0X40; //開(kāi)啟1T模式
- TH1 =TL1= 0xDC; // 設(shè)置波特率為9600 公式 TH1=256-(11059200/32/9600)=256-36=220 0xDC
- // 設(shè)置波特率為9600 公式 TH1=256-(22118400/32/9600)=256-72=184 0xB8
- // 如有不明白請(qǐng)查 STC8手冊(cè)上有詳細(xì)說(shuō)明
-
-
- TR1 = 1; //開(kāi)啟定時(shí)器1
- ES = 1; //開(kāi)串口中斷
- EA = 1; // 開(kāi)總中斷
-
- while(1)
- {
-
- }
- }
- /***********************************************
- *函數(shù)名稱:Uart1_SendChar
- *功 能:串口1發(fā)送單個(gè)字符函數(shù)
- *入口參數(shù):Udat:欲發(fā)送的數(shù)據(jù)
- *返 回 值:無(wú)
- *備 注:無(wú)
- ************************************************/
- void int_tmp()
- {
- ucreceive_num=0;
- tmp[0]=0x00;
- tmp[1]=0x00;
- tmp[2]=0x00;
- }
- /***********************************************
- *函數(shù)名稱:Uart1_SendChar
- *功 能:串口1發(fā)送單個(gè)字符函數(shù)
- *入口參數(shù):Udat:欲發(fā)送的數(shù)據(jù)
- *返 回 值:無(wú)
- *備 注:無(wú)
- ************************************************/
- 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接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- a++; // 下一個(gè)字符
- }
- 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接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- a++; // 下一個(gè)字符
- }
- SBUF = c; //SUBF接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- SBUF = tmp[2]-0x30; //SUBF接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- 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接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- a++; // 下一個(gè)字符
- }
- SBUF = c; //SUBF接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- SBUF = tmp[2]-0x30; //SUBF接受/發(fā)送緩沖器(又叫串行通信特殊功能寄存器)
- while(!TI); // 等特?cái)?shù)據(jù)傳送 (TI發(fā)送中斷標(biāo)志)
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- 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;
- }
- }
復(fù)制代碼
源代碼見(jiàn)附件 |
|