|
- /*********單總線通信脈沖時間定義**********/
- #define H_LVL 5
- #define L_LVL_0 5
- #define L_LVL_1 10
- #define S_H 10 //起始位高電平,起始位用于將期間從休眠中喚醒并做好接收數(shù)據(jù)的準(zhǔn)備,暫沒使用
- #define S_L 5 //起始位低電平
- #define START_T0() {TMR0=158;T0IF=0;T0IE=1;}
- #define STOP_T0() {T0IE=0;}
- /*
- 函數(shù)功能:數(shù)據(jù)位發(fā)送,數(shù)據(jù)位0或1都包括固定寬度的高電平脈沖和不同寬度的低電平
- 說明:
- */
- void SendBit(uchar databit)
- {
- timeout=H_LVL;
- START_T0();
- ORDER=1; //信號線高電平
- while(timeout);
- STOP_T0(); //禁止T0中斷
-
- if(databit)
- timeout=L_LVL_1; //數(shù)據(jù)位1
- else
- timeout=L_LVL_0; //數(shù)據(jù)位0
- START_T0();
- ORDER=0; //信號線低電平
- while(timeout);
- STOP_T0();
- }
- /*發(fā)送結(jié)束脈沖,用于標(biāo)記最后一個數(shù)據(jù)位的脈沖寬度,*/
- void SendEnd()
- {
- timeout=5;
- START_T0();
- ORDER=1; //信號線高電平
- while(timeout);
- STOP_T0(); //禁止T0中斷
- timeout=20;
- START_T0();
- ORDER=0;
- while(timeout);
- STOP_T0();
- }
- void SendStart()
- {
- timeout=S_H;
- START_T0();
- ORDER=1; //信號線高電平
- while(timeout);
- STOP_T0(); //禁止T0中斷
- timeout=S_L;
- START_T0();
- ORDER=0;
- while(timeout);
- STOP_T0();
- }
- /*
- 函數(shù)功能:數(shù)據(jù)字節(jié)發(fā)送,低位在前
- 參數(shù)說明:dat 要發(fā)送的數(shù)據(jù)字節(jié)
- */
- void SendData(uchar dat)
- {
- uchar i,j;
-
- CCP1IE=0; //關(guān)閉捕捉中斷
- se_ccp1_int++;
- TMR2IE=0;
-
- // SendStart(); //起始位高電平,起始位用于將期間從休眠中喚醒并做好接收數(shù)據(jù)的準(zhǔn)備
- for(i=0;i<8;i++)
- {
- j=(dat>>i)&0x01;
- SendBit(j);
- }
- SendEnd();
-
- CTR_LED=1;
- delay(200);
- CTR_LED=0;
- se_ccp1_int--;
- if(se_ccp1_int==0)
- {
- CCP1IF=0;
- CCP1IE=1; //開捕捉中斷
- }
- TMR2IE=1;
-
- }
復(fù)制代碼
|
|