标题:
单总线通讯接口的单片机源码
[打印本页]
作者:
tendy
时间:
2018-3-30 12:05
标题:
单总线通讯接口的单片机源码
/*********单总线通信脉冲时间定义**********/
#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;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1