在定時器0里增加一個10秒標志flag,在主循環中添加Report()函數,定時發送上報繼電器狀態。
- #include <STC8F2K08S2.h>
- #include <intrins.h>
- #define uchar unsigned char//宏定義無符號字符型
- #define uint unsigned int //宏定義無符號整型
- typedef unsigned char INT8U;
- typedef unsigned int INT16U;
- #define ENABLE_ISP 0x82 //系統工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
- #define WD1 0x5a //使用STC11xx系列單片機時,先寫入0x5a,然寫入0xa5
- #define WD2 0xa5
- char IAPAddr=0;
- unsigned char T0RH = 0; //T0重載值的高字節
- unsigned char T0RL = 0; //T0重載值的低字節
- bit flagFrame = 0; //幀接收完成標志,即接收到一幀新數據
- bit flagTxd = 0; //單字節發送完成標志,用來替代TXD中斷標志位
- unsigned char cntRxd = 0; //接收字節計數器
- unsigned char pdata bufRxd[50]; //接收字節緩沖區
- void UartDriver();//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
- void UartAction(unsigned char *buf, unsigned char len);//在接收到的數據幀后添加換車換行符后發回
- void UartWrite(unsigned char *buf, unsigned char len);//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
- unsigned char UartRead(unsigned char *buf, unsigned char len);//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- void UartRxMonitor(unsigned char ms);//串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔
- bit flagFrame2 = 0; //幀接收完成標志,即接收到一幀新數據
- bit flagTxd2 = 0; //單字節發送完成標志,用來替代TXD中斷標志位
- unsigned char cnt2Rxd = 0; //接收字節計數器
- unsigned char pdata buf2Rxd[50]; //接收字節緩沖區
- void Uart2Driver();//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
- void Uart2Action(unsigned char *buf2, unsigned char len2);//在接收到的數據幀后添加換車換行符后發回
- void Uart2Write(unsigned char *buf2, unsigned char len2);//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
- unsigned char UartRead(unsigned char *buf2, unsigned char len2);//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- void ConfigUART(unsigned int baud);//串口配置函數,baud-通信波特率
- void ConfigTimer0(unsigned int ms);//配置并啟動T0,ms-T0定時時間
- void Report(void);
- sbit IN_1 = P3^7;
- sbit IN_2 = P3^6;
- sbit IN_3 = P3^3;
- sbit IN_4 = P3^2;
- sbit out1 = P5^5;
- sbit out2 = P5^4;
- sbit out3 = P1^7;
- sbit out4 = P1^6;
- bit bz1=0,bz2=0,bz3=0,bz4=0;
- bit k=0,k1=0,bk1=0,ks=0,bzw=0;
- bit flag=0;
- uchar addr=0x00,xx_1=0,xx_2=0,xx_3=0,xx_4=0,zz=0x00;
- uchar y_1=0,y_2=0,y_3=0,y_4=0,zy=0x00,zt=0x00;
- uint js=0;
- /********************************************************************
- E2P函數
- *********************************************************************/
- union union_temp16
- {
- INT16U un_temp16;
- INT8U un_temp8[2];
- }my_unTemp16;
- INT8U Byte_Read(INT16U add); //讀一字節,調用前需打開IAP 功能
- void Byte_Program(INT16U add, INT8U ch); //字節編程,調用前需打開IAP 功能
- void Sector_Erase(INT16U add); //擦除扇區
- void IAP_Disable(); //關閉IAP 功能
- void UartAction(unsigned char *buf, unsigned char len){//接收
- if((buf[0] == 0xAA)&&(buf[1] == addr)&&(buf[2] == 0x01)&&(buf[4] == 0xBB)&&(len==5)) //更改板子地址
- {
- addr=buf[3];k=1;
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x01;
- buf[3] = 0x01;
- buf[4] = 0x00;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
- if ((buf[0] == 0xAA)&&(buf[1] == addr)&&(buf[2] == 0x02)&&(buf[4] == 0xBB)&&(len==5)) //打開對應輸出
- {
- switch(buf[3])
- {
- case 1:out1=0;break;
- case 2:out2=0;break;
- case 3:out3=0;break;
- case 4:out4=0;break;
- default:break;
- }
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x02;
- buf[3] = buf[3];
- buf[4] = 0xFF;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
- if ((buf[0] == 0xAA)&&(buf[1] == addr)&&(buf[2] == 0x03)&&(buf[4] == 0xBB)&&(len==5)) //關閉對應輸出
- {
- switch(buf[3])
- {
- case 1:out1=1;break;
- case 2:out2=1;break;
- case 3:out3=1;break;
- case 4:out4=1;break;
- default:break;
- }
-
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x03;
- buf[3] = buf[3];
- buf[4] = 0x00;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
-
- if ((buf[0] == 0xAA)&&(buf[1] == addr)&&(buf[2] == 0x04)&&(buf[3] == 0x04)&&(buf[4] == 0xBB)&&(len==5)) //查詢輸入狀態
- {
- if(IN_1==0){xx_1=0x01;}else{xx_1=0x00;}
- if(IN_2==0){xx_2=0x02;}else{xx_2=0x00;}
- if(IN_3==0){xx_3=0x04;}else{xx_3=0x00;}
- if(IN_4==0){xx_4=0x08;}else{xx_4=0x00;}
- zz = ((xx_1)|(xx_2)|(xx_3)|(xx_4));
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x04;
- buf[3] = 0x04;
- buf[4] = zz;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
-
- if ((buf[0] == 0xAA)&&(buf[1] == addr)&&(buf[2] == 0x05)&&(buf[3] == 0x04)&&(buf[4] == 0xBB)&&(len==5)) //查詢輸出狀態
- {
- if(out1==0){y_1=0x01;}else{y_1=0x00;}
- if(out2==0){y_2=0x02;}else{y_2=0x00;}
- if(out3==0){y_3=0x04;}else{y_3=0x00;}
- if(out4==0){y_4=0x08;}else{y_4=0x00;}
- zy = ((y_1)|(y_2)|(y_3)|(y_4));
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x05;
- buf[3] = 0x04;
- buf[4] = zy;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
-
- if ((buf[0] == 0xAA)&&(buf[1] == 0x00)&&(buf[2] == 0x07)&&(buf[4] == 0xBB)&&(len==5)) //廣播控制輸出狀態
- {
- zt=buf[3];
- if((zt&0x01)==0x01){out1=0;}else{out1=1;}
- if((zt&0x02)==0x02){out2=0;}else{out2=1;}
- if((zt&0x04)==0x04){out3=0;}else{out3=1;}
- if((zt&0x08)==0x08){out4=0;}else{out4=1;}
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x07;
- buf[3] = 0x04;
- buf[4] = zt;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
-
- if ((buf[0] == 0xAA)&&(buf[1] == 0x00)&&(buf[2] == 0x00)&&(buf[3] == 0x00)&&(buf[4] == 0xBB)&&(len==5)) //查詢板子地址
- {
- buf[0] = 0xAA;
- buf[1] = addr;
- buf[2] = 0x00;
- buf[3] = 0x01;
- buf[4] = 0x00;
- buf[5] = 0xBB;
- len = 6;
- UartWrite(buf,len);
- }
- }
- void Uart2Action(unsigned char *buf2, unsigned char len2)//接收
- {
- if ((buf2[0] == 0xAA)&&(buf2[1] == addr)&&(buf2[2] == 0x02)&&(buf2[4] == 0xBB)&&(len2==5)) //打開
- {
- switch(buf2[3])
- {
- case 1:out1=0;break;
- case 2:out2=0;break;
- case 3:out3=0;break;
- case 4:out4=0;break;
- default:break;
- }
- buf2[0] = 0xAA;
- buf2[1] = addr;
- buf2[2] = 0x02;
- buf2[3] = buf2[3];
- buf2[4] = 0xFF;
- buf2[5] = 0xBB;
- len2 = 6;
- Uart2Write(buf2,len2);
- }
- if ((buf2[0] == 0xAA)&&(buf2[1] == addr)&&(buf2[2] == 0x03)&&(buf2[4] == 0xBB)&&(len2==5)) //關閉
- {
- switch(buf2[3])
- {
- case 1:out1=1;break;
- case 2:out2=1;break;
- case 3:out3=1;break;
- case 4:out4=1;break;
- default:break;
- }
- buf2[0] = 0xAA;
- buf2[1] = addr;
- buf2[2] = 0x03;
- buf2[3] = buf2[3];
- buf2[4] = 0xFF;
- buf2[5] = 0xBB;
- len2 = 6;
- Uart2Write(buf2,len2);
- }
- }
- void ConfigTimer0(unsigned int ms)//配置并啟動T0,ms-T0定時時間
- {
- unsigned long tmp; //臨時變量
- tmp = 11059200 / 12; //定時器計數頻率
- tmp = (tmp * ms) / 1000; //計算所需的計數值
- tmp = 65536 - tmp; //計算定時器重載值
- tmp = tmp + 33; //補償中斷響應延時造成的誤差
- T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
- T0RL = (unsigned char)tmp;
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x01; //配置T0為模式1
- TH0 = T0RH; //加載T0重載值
- TL0 = T0RL;
- ET0 = 1; //使能T0中斷
- TR0 = 1; //啟動T0
- }
- void ConfigUART(unsigned int baud)//串口配置函數,baud-通信波特率
- {
- SCON = 0x50; //配置串口為模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1為模式2
- TH1 = 256 - (11059200/12/32)/baud; //計算T1重載值
- TL1 = TH1; //初值等于重載值
- ET1 = 0; //禁止T1中斷
- TR1 = 1; //啟動T1
-
- }
- void Config2UART() //串口2配置
- {
- S2CON = 0x50;
- AUXR |= 0x04;
- T2L = 0xE0; //65536-11059200/115200/4=0FFE8H
- T2H = 0xFE;
- AUXR |= 0x10; //啟動定時器
- IE2 = 0x01;
- }
- void senddate()//發送輸入狀態
- {
- unsigned char buf[10];
- unsigned char len=0;
- if((k1==1)&&(bk1==0))
- {
- bk1=1;
- if(IN_1 == 0){xx_1 = 0x01;}else{xx_1 = 0x00;}//查詢輸入狀態打開為1,關閉為0
- if(IN_2 == 0){xx_2 = 0x02;}else{xx_2 = 0x00;}//查詢輸入狀態打開為1,關閉為0
- if(IN_3 == 0){xx_3 = 0x04;}else{xx_3 = 0x00;}//查詢輸入狀態打開為1,關閉為0
- if(IN_4 == 0){xx_4 = 0x08;}else{xx_4 = 0x00;}//查詢輸入狀態打開為1,關閉為0
- zz = ((xx_1)|(xx_2)|(xx_3)|(xx_4));
- buf[0]=0xAA;
- buf[1]=addr;
- buf[2]=0x06;
- buf[3]=0x04;
- buf[4]=zz;
- buf[5]=0xBB;
- len=6;
- UartWrite(buf, len);
- Uart2Write(buf, len);
- k1=0;
- ks=1;
- }
- if(bzw==1){bzw=0;bk1=0;}//消抖延時后清零
- }
- void main()
- {
- P1M0 = 0xC0; //
- P1M1 = 0x00;
- P5M0 = 0xFF; //
- P5M1 = 0x00;
- EA = 1;ES = 1; //開總中斷
- ConfigTimer0(1); //配置T0定時1ms
- ConfigUART(9600); //配置波特率為9600
- Config2UART();
- out3=1;out4=1;out1=1;out2=1;//
- if(Byte_Read(0X0001)==0xff){addr=0;}//首次讀取,如果讀到0xFF說明沒有存過數據,直接付給00值
- else
- {
- addr=Byte_Read(0X0001);
- }
- while(1)
- {
- if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;out1=0;}//點動
- if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;out1=1;}
-
- if((IN_2==0)&&(bz2==0)){bz2=1;k1=1;out2=0;}//點動
- if((IN_2==1)&&(bz2==1)){bz2=0;k1=1;out2=1;}
-
- if((IN_3==0)&&(bz3==0)){bz3=1;k1=1;out3=0;}//點動
- if((IN_3==1)&&(bz3==1)){bz3=0;k1=1;out3=1;}
-
- if((IN_4==0)&&(bz4==0)){bz4=1;k1=1;out4=0;}//點動
- if((IN_4==1)&&(bz4==1)){bz4=0;k1=1;out4=1;}
-
- senddate();//發送輸入狀態
- UartDriver(); //調用串口驅動
- Uart2Driver();
- Report();
- if(k==1) //E2P
- {
- Sector_Erase(0);
- Byte_Program(0x0001,addr); //寫入扇區
- k=0;
- }
- }
- }
- void InterruptTimer0() interrupt 1//T0中斷服務函數,執行串口接收監控
- {
- static unsigned int Cnt_1ms;
- TH0 = T0RH; //重新加載重載值
- TL0 = T0RL;
- UartRxMonitor(1); //串口接收監
- if(ks==1){js++;if(js==320){js=0;bzw=1;ks=0;}}
- Cnt_1ms++;
- if(Cnt_1ms >= 10000)//10秒
- {
- Cnt_1ms = 0;
- flag=1;
- }
- }
- void InterruptUART() interrupt 4{//串口中斷服務函數
- if (RI) { //接收到新字節
- RI = 0; //清零接收中斷標志位
- if (cntRxd < sizeof(bufRxd)) {//接收緩沖區尚未用完時,保存接收字節,并遞增計數器
- bufRxd[cntRxd++] = SBUF; // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數的次數增加,cntRxd慢慢變大,當傳入的數據不滿的時候就 用時間檢測,判斷是否是傳輸完成
- }
- }
- if (TI) { //字節發送完畢
- TI = 0; //清零發送中斷標志位
- flagTxd = 1; //設置字節發送完成標志
- }
- }
- /********************************************************************
- 串口二(485) 發送接收中斷函數
- *********************************************************************/
- void uart2_isr() interrupt 8
- {
- if( S2CON & 0x01 )
- {
- S2CON &= ~0x01;
- if (cnt2Rxd < sizeof(buf2Rxd)) {//接收緩沖區尚未用完時,保存接收字節,并遞增計數器
- buf2Rxd[cnt2Rxd++] = S2BUF; // cntRxd++這個很重要,一開始 cntRxd < sizeof(bufRxd)當進入函數的次數增加,cntRxd慢慢變大,當傳入的數據不滿的時候就 用時間檢測,判斷是否是傳輸完成
- }
- }
- if( S2CON & 0x02 )
- {
- S2CON &= ~0x02;
- flagTxd2 = 1; //設置字節發送完成標志
- }
- }
- void UartWrite(unsigned char *buf, unsigned char len)//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
- {
- while (len--) //循環發送所有字節
- {
- flagTxd = 0; //清零發送標志
- SBUF = *buf; //發送一個字節數據
- buf++;
- while (!flagTxd); //等待該字節發送完成
- }
- }
- void Uart2Write(unsigned char *buf2, unsigned char len2){//串口數據寫入,即串口發送函數,buf-待發送數據的指針,len-指定的發送長度
- while (len2--){ //循環發送所有字節
- flagTxd2 = 0; //清零發送標志
- S2BUF = *buf2; //發送一個字節數據
- buf2++;
- while (!flagTxd2); //等待該字節發送完成
- }
- }
- unsigned char UartRead(unsigned char *buf, unsigned char len){//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- unsigned char i;
- if (len > cntRxd){ //指定讀取長度大于實際接收到的數據長度時,讀取長度設置為實際接收到的數據長度
- len = cntRxd;
- }
- for (i=0; i<len; i++){ //拷貝接收到的數據到接收指針上
- *buf++ = bufRxd[i];
- }
- cntRxd = 0; //接收計數器清零
- return len; //返回實際讀取長度
- }
- unsigned char Uart2Read(unsigned char *buf2, unsigned char len2){//串口數據讀取函數,buf-接收指針,len-指定的讀取長度,返回值-實際讀到的長度
- unsigned char i;
- if (len2 > cnt2Rxd){ //指定讀取長度大于實際接收到的數據長度時,讀取長度設置為實際接收到的數據長度
- len2 = cnt2Rxd;
- }
- for (i=0; i<len2; i++){ //拷貝接收到的數據到接收指針上
- *buf2++ = buf2Rxd[i];
- }
- cnt2Rxd = 0; //接收計數器清零
- return len2; //返回實際讀取長度
- }
- void UartDriver(){//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
- unsigned char len;
- unsigned char pdata buf[50];
- if (flagFrame){ //有命令到達時,讀取處理該命令
- flagFrame = 0;
- len = UartRead(buf, sizeof(buf)-2); //將接收到的命令讀取到緩沖區中
- UartAction(buf, len); //傳遞數據幀,調用動作執行函數
- }
- }
- void Uart2Driver(){//串口驅動函數,監測數據幀的接收,調度功能函數,需在主循環中調用
- unsigned char len2;
- unsigned char pdata buf2[50];
- if (flagFrame2){ //有命令到達時,讀取處理該命令
- flagFrame2 = 0;
- len2 = Uart2Read(buf2, sizeof(buf2)-2); //將接收到的命令讀取到緩沖區中
- Uart2Action(buf2, len2); //傳遞數據幀,調用動作執行函數
- }
- }
- void UartRxMonitor(unsigned char ms){//串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔
- static unsigned char cntbkp = 0;
- static unsigned char idletmr = 0;
- if (cntRxd > 0){ //接收計數器大于零時,監控總線空閑時間
- if (cntbkp != cntRxd){ //接收計數器改變,即剛接收到數據時,清零空閑計時
- cntbkp = cntRxd;
- idletmr = 0;
- }else{ //接收計數器未改變,即總線空閑時,累積空閑時間
- if (idletmr < 30){ //空閑計時小于30ms時,持續累加
- idletmr += ms;
- if (idletmr >= 30){ //空閑時間達到30ms時,即判定為一幀接收完畢
- flagFrame = 1; //設置幀接收完成標志
- }
- }
- }
- }else if(cnt2Rxd > 0){
- if (cntbkp != cnt2Rxd){
- cntbkp = cnt2Rxd;
- idletmr = 0;
- }else{
- if (idletmr < 30){
- idletmr += ms;
- if (idletmr >= 30){
- flagFrame2 = 1; }}
- }
- }
- else{
- cntbkp = 0;
- }
- }
- //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
- INT8U Byte_Read(INT16U add)
- {
- IAP_DATA = 0x00;
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x01; //IAP/ISP/EEPROM 字節讀命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- //EA = 0;
- IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- return (IAP_DATA);
- }
- /*********************************************************************************************/
- //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
- void Byte_Program(INT16U add, INT8U ch)
- {
- IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 0x02; //IAP/ISP/EEPROM 字節編程命令
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
- IAP_DATA = ch; //要編程的數據先送進IAP_DATA 寄存器
- //EA = 0;
- IAP_TRIG = WD1; //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = WD2; //送完WD2 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
- /*********************************************************************************************
- //擦除扇區, 入口:DPTR = 扇區地址 */
- void Sector_Erase(uint addr)
- {
- IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
- IAP_CMD = 3; //IAP/ISP/EEPROM 扇區擦除命令
- // my_unTemp16.un_temp16 = add;
- IAP_ADDRH = addr>>8; //設置目標單元地址的高8 位地址
- IAP_ADDRL = addr; //設置目標單元地址的低8 位地址
- IAP_TRIG = 0x5a; //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
- IAP_TRIG = 0xa5; //送完WD2 后,ISP/IAP 命令立即被觸發起動
- _nop_();
- //EA = 1;
- IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- }
- /*********************************************************************************************/
- void IAP_Disable()
- {
- //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
- //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
- IAP_CONTR = 0; //關閉IAP 功能
- IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
- IAP_TRIG = 0; //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
- IAP_ADDRH = 0x80;
- IAP_ADDRL = 0;
- }
- /*********************************************************************************************/
- void Report(void)
- {
- unsigned char buf[5];
- unsigned char i;
- if(flag==1)
- {
- flag=0;
- buf[0]=0xAA;
- buf[1]=addr;
- buf[2]=0xFF;
- buf[3]=0xFF;
- buf[4]=0xBB;
- ES=0; //關串口中斷
- for(i=0;i<5;i++)
- {
- SBUF=buf[i];//發送數據
- while(!TI); //等待發送中斷請求標志位為1
- TI=0; //發送中斷請求標志位清0
- }
- ES=1; //開串口中斷
- }
- }
復制代碼 |