- /*********单总线通信脉冲时间定义**********/
- #define H_LVL 5
- #define L_LVL_0 5
- #define L_LVL_1 10
- #define S_H 10 //起始位高电平,起始位用于将期间从休眠中唤醒并做好接收数据的准备,暂没使用
- #define S_L 5 //起始位低电平
- #define START_T0() {TMR0=158;T0IF=0;T0IE=1;}
- #define STOP_T0() {T0IE=0;}
- /*
- 函数功能:数据位发送,数据位0或1都包括固定宽度的高电平脉冲和不同宽度的低电平
- 说明:
- */
- void SendBit(uchar databit)
- {
- timeout=H_LVL;
- START_T0();
- ORDER=1; //信号线高电平
- while(timeout);
- STOP_T0(); //禁止T0中断
-
- if(databit)
- timeout=L_LVL_1; //数据位1
- else
- timeout=L_LVL_0; //数据位0
- START_T0();
- ORDER=0; //信号线低电平
- while(timeout);
- STOP_T0();
- }
- /*发送结束脉冲,用于标记最后一个数据位的脉冲宽度,*/
- 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();
- }
- /*
- 函数功能:数据字节发送,低位在前
- 参数说明:dat 要发送的数据字节
- */
- void SendData(uchar dat)
- {
- uchar i,j;
-
- CCP1IE=0; //关闭捕捉中断
- se_ccp1_int++;
- TMR2IE=0;
-
- // SendStart(); //起始位高电平,起始位用于将期间从休眠中唤醒并做好接收数据的准备
- 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;
-
- }
复制代码
|