精华内容
下载资源
问答
  • 中、低档PIC单片机有些不带串口,有些虽然有串行口,却受串口固定协议的限制或留作他用,故需用普通I/O口进行通讯。由于中、低档机I/O口数量相对较少,为节省口线,就要用I/O口模拟串行通讯。本文以两片...

    中、低档PIC单片机有些不带串口,有些虽然有串行口,却受串口固定协议的限制或留作他用,故需用普通I/O口进行通讯。由于中、低档机I/O口数量相对较少,为节省口线,就要用I/O口模拟串行通讯。

    本文以两片采用不同主频的PIC单片机(A机时钟频率为6MHz,使用口线RB6;B机时钟频率为4MHz,使用口线RB4)之间用异步通讯方式传送一组数据为例,说明I/O口一线通讯的实现方法。

    一、设计思想

    1.时钟同步问题

    因两个单片机的时钟不同,故采用异步通讯方式。发送、接收一位数据时,采用软件延时,保证发送、接收完全同步。

    2.数据发送、接收方式

    I/O口一线串行通讯,并-串(或串-并)转换用软件完成。将欲发送的字节存于16H中,经移位指令移至进位位。根据进位位的值,将口线RB6置0或1。接收端RB4接收并判断后,置进位标志为0或1,再经移位指令移入14H中。这样循环执行8次,就可将一个字节由低位到高位一位位地发送出去。数据传送速率可用延时循环的方法进行调节。

    3.握手协议

    先发握手信号,后发数据。假定A机为发送,B机为接收。A机开始发送时,先发送一个握手数据信号,B机收到后回送一个应答信号,表示同意接收。

    A机收到应答信号后,开始发送数据。握手信号和数据信号都按异步通讯格式,先发准备信号“1”,接着发送起始位“0”,然后发数据位。

    4.数据传送

    异步通讯时,发送时钟控制数据位的定时移位串行输出,接收时钟检测起始位,并控制数据的定时接收移入。两个时钟信号不是通过信号线传递,而是采用编程约定的办法,使之和实际使用的数据速率基本保持一致,而数据信号中的起始位则是发和收的同步控制。接收时钟为数据传送波特率的16倍频信号,即一个数据位宽的时间内将会出现16个接收时钟的信号,这是检测起始位和保证在数据位中央位置接收数据所需要的。为排除瞬时干扰,在检测到数据输入线的电平由“1”变为“0”之后,接收端将继续检测。仅当连续8个接收时钟周期内都检测到数据线上的电平为“0”时,才确认是起始位,且发送端每一个“0”或“1”都发送16次,接收端将以16倍的时钟周期,即以位宽时间为间隔,接收各数据位(在其中央位置接收数据)。一个字长数据(8位)接收完后,子程序返回。

    二、程序框图和源程序

    下面给出发送、接收一字长(8位)信号的子程序框图(见图1、图2)和PIC单片机源程序(发送、接收联络信号与数据信号相同)。注:所有延时程序略。

    1.发送子程序

    list p=16c65,f=inhx8m

    portb equ6

    trisb equ 16h

    status equ3

    rp0 equ5

    org0x100

    fs bsf status,rp0;选存储体1

    bcf trisb,6 ;置RB6为输出

    bcf status,rp0;恢复存储体0

    bsf portb,6 ;发准备信号“1”

    movlw0x08

    movwf1f ;置发送字长

    call ystb ;延时同步

    movlw0x10

    movwf1c

    fs1 bcf portb,6 ;发16个起始位

    decfsz1c,1

    goto fs1

    ts call ystj ;延时调节波特率

    rrf 16h,1 ;发送字节移位

    btfsc status,0

    goto ty

    movlw0x10

    movwf1c

    fs2 bcf portb,6 ;位为0,发16个“0”

    decfsz1c,1

    goto fs2

    goto tr

    ty movlw0x10

    movwf1c

    fs3 bsf portb,6 ;位为1,发16个“1”

    decfsz1c,1

    goto fs3

    tr decfsz1f, 1

    goto ts ;发送未完,延时发下一位

    return ;发送结束返回

    end

    2.接收子程序

    list p=16c65,f=inhx8m

    portb equ6

    trisb equ 16h

    status equ 3

    rp0  equ5

    org 0x200

    js bsf status,rp0 ;选存储体1

    bsf trisb,4 ;置RB4为输入

    bcf status,rp0 ;恢复存储体0

    js1 btfss portb,4 ;检测收到“1”否

    goto js1 ;未收到“1”继续检测

    movlw0x08 ;置接收字长8位

    movwf1f

    loop1 movlw0x08 ;置循环次数8

    movwf1d

    loop btfsc portb,4 ;检测起始位

    goto loop1 ;未收到“0”重置8次循环

    decfsz1d,1

    goto loop ;收到“0”继续检测

    jz call ystb ;收到8个“0”,延时同步,接收数据

    btfsc portb,4 ;测试接收位

    goto jy

    bcf status,0 ;收到“0”置c=0

    goto j1

    jy bsf status,0 ;收到“1”置c=1

    j1 rrf 14h,1 ;接收位移入14h

    decfsz 1f,1

    goto jz ;未接收完,延时接收下一位

    return ;接收完返回

    end

    c9e83370cf1614795dea18db764e75d7.png

    展开全文
  • //*******************************************************// 项目: 单线通讯程序//作者://日期:2010年10月18日//功能:两单片机通过一个I/O口实现数据交换//备注://****************************************...

    //*******************************************************

    //   项目: 单线通讯程序

    //  作者:

    //  日期:2010年10月18日

    //  功能:两单片机通过一个I/O口实现数据交换

    //  备注:

    //*******************************************************

    #include "pic.h"

    #include "pic16f887.h"

    //*******************************************************

    __CONFIG(HS&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BORDIS&IESODIS&FCMDIS&LVPDIS&debugDIS&BORv21& WP1);

    //*******************************************************

    #define uchar  unsigned char

    #define uint  unsigned int

    #define ulong  unsigned long int

    //*******************************************************

    #define ID RB0      //定义单总线,即:数据输出引脚

    #define K1 RB3

    #define ID0 TRISB0

    #define C CARRY

    //*******************************************************

    void MCU_init(void);

    void delay(uint x);

    void delay_1ms(uint z);

    void delay_uS(uint z);

    //*******************************************************

    uchar a,b;       //定义临时变量

    uchar SBUF_M,TEMP;     //定义要发送的或接收的8位数据

    //*******************************************************

    //   单总线 发送子程序

    //*******************************************************

    void danxian_fasong()

    {

    uchar i;

    IF(ID==1)      //看是否空闲,

    {

    ID0=0;      //

    asm("NOP");

    ID=0;      //总线置0,锁定总线100ms,以便使接收方能扑捉到这个100ms的起始位,

    delay_1ms(100);    //起始位宽度选择原则是大于接收方大循环周期与中断函数运行时间的和;

    ID=1;      //再给一个上升沿,告诉接收方2毫秒后开始发送

    delay_uS(1);    //26uS

    for(i=0;i<8;i++)   //8次循环,将 SBUF_M 的8位数据全部送出

    {

    SBUF_M=SBUF_M<<1;  //待发送的数据左移1位

    ID=C;          //待发送的数据赋给输出端

    delay_uS(8);   //109uS  //每位数据保持109uS

    }

    ID=1;      //待8位数据全部发送完毕后,务必释放总线为1

    asm("NOP");

    ID0=1;

    }

    else

    {

    return;      //总线不空闲,跳出

    }

    }

    //*********************************************

    //   单总线 接收子程序

    //*********************************************

    void danxian_jieshou()

    {

    uchar i;

    while(ID==0);     //在此等待100ms剩余时间全部过去,26uS上升沿到来,则向下进行

    delay_uS(1);     //26uS

    delay_uS(3);     //50uS //延时50ms是为了扑捉数据位的中间位置

    for(i=0;i<8;i++)    //8次循环,将总线送来的8位数据全部接收,并赋给SBUF_M (模拟串口变量)

    {

    SBUF_M=SBUF_M<<1;   //SBUF_M (模拟串口变量)左移1位

    if(ID==1)

    {

    SBUF_M|=0X01;

    }

    else

    {

    SBUF_M&=0XFE;

    }

    delay_uS(8);    //109uS接收时间必须与数据位保持时间同宽

    }

    a=SBUF_M;      //待8位数据全部接收完毕后,将接收到的数据赋给 a ;

    }

    //******************主程序*******************************

    void main()

    {

    MCU_init();

    a=0;

    b=0x01;

    while(1)

    {

    //*****************发送部分******************************

    if(K1==0)

    {

    while(K1==0);

    SBUF_M=b;

    danxian_fasong();  //调用发送子程序

    b++;

    }

    //*****************接收部分******************************

    if(ID==0)

    {

    danxian_jieshou();  //调用接收子函数

    }

    PORTD=a;     //将a赋给PORTD显示出来

    }

    }

    //*******************************************************

    //  延时子函数(约1毫秒)

    //*******************************************************

    void delay_1ms(uint z)    //延时子函数(约1毫秒)

    {

    uint x,y;

    for(x=z;x>0;x--)

    for(y=110;y>0;y--);

    }

    //******** 延时子函数************************************

    //以下微秒级延时是在11.0592晶振下试验的:

    //delay_uS(1);//26uS delay_uS(2);//38uS delay_uS(3);//50uS

    //delay_uS(4);//61uS delay_uS(5);//74uS delay_uS(6);//86uS

    //delay_uS(7);//98uS delay_uS(8);//109uS delay_uS(9);//122uS

    //delay_uS(10);//133uS

    //*******************************************************

    void delay_uS(uint z)    //延时子函数(微秒级)

    {

    uint x;

    for(x=z;x>0;x--)

    {

    ;

    }

    }

    //*******************************************************

    void delay(uint x)

    {

    uint a,b;

    for(a=x;a>0;a--)

    {

    asm("clrwdt");

    for(b=110;b>0;b--);

    }

    }

    //*******************************************************

    void MCU_init(void)

    {

    STATUS&=0x18;

    OPtiON=0x0F;

    INTCON=0x00;

    PIE1=0x00;

    PIE2=0x00;

    PIR1=0x00;

    PIR2=0x00;

    PCON=0x00;

    //*******************************************************

    // A口初始化

    //*******************************************************

    TRISA=0x03;

    PORTA=0x00;

    ANSEL=0X00;

    ADON=0;       //关闭AD功能                       0:Timer1门控源为SYNCC2OUT 0:输出异步

    PCON|=0x00;

    OPTION&=0xDF;

    SSPCON=0x09;

    //*******************************************************

    //  B口初始化

    //*******************************************************

    TRISB=0x0F;

    PORTB=0x00;

    ANSELH=0X00;

    CCP1CON=0x00;

    CM2CON1=0x02;

    IOCB=0x00;      //禁止B口电平变化中断

    INTCON&=0xEB;

    OPTION&=0x7F;

    WPUB=0xFF;      //禁止B口弱上拉

    //*******************************************************

    //  C口初始化

    //*******************************************************

    TRISC=0x01;

    PORTC=0x00;

    CCP1CON=0x00;

    CCP2CON=0x00;

    PSTRCON=0x00;

    RCSTA=0x00;

    SSPCON=0x09;

    T1CON=0x00;

    STATUS&=0x18;     //0001 1000

    OPTION=0x0F;     //0000 1111

    INTCON=0x00;

    PIE1=0x00;

    PIE2=0x00;

    PIR1=0x00;

    PIR2=0x00;

    PCON=0x00;

    //*******************************************************

    // D口初始化

    //*******************************************************

    TRISD=0x00;

    PORTD=0x00;

    PSTRCON=0x00;

    //*******************************************************

    // E口初始化

    //*******************************************************

    TRISE=0x01;

    PORTE=0x00;

    ANSEL=0x00;

    }

    699ba7046c51816a17b33a7caa85f179.png

    0

    展开全文
  • 能在一根金属线上实现通讯的技术。灵活易用的一根线上通讯应用。适合特殊场合。单线通讯
  • 《匠人手记》24《用单片机IO口实现单线单工通讯》.pdf
  • 文章目录0、前言1、硬件连接示意图2、单线单工通讯协议3、关于波特率自适应的处理4、数据接收程序流程图5、数据接收程序的代码实现(纯定时器扫描)5.1、不带校准位的代码实现—即不带波特率自适应5.2、带校准位的...

    0、前言


      许多便宜的单片机都没有标准的串行通讯口。因此,我们常用单片机的 IO 口来模拟串行通讯。下面,给出一个简单的通讯方案。
      在这个方案中,主机平时处于睡眠状态,从机处于工作状态。在需要的时候,由从机通过通讯接口唤醒主机。主机被唤醒后不断向从机发送数据,从机接收通讯数据并进行解读,执行相关功能。

    1、硬件连接示意图


    展开全文
  • 简介:在双MCU单片机之间通过一根数据线(GPIO口)进行通讯的驱动(50us中断一次)  发送数据的数据头:定义为90次中断的低电平(50us*90 = 4.5ms) 270-90此中断的高电平(50us*180 = 9ms)  发送数据1:定义为11...

    单数据线自定义通讯驱动程序


    简介:在双MCU单片机之间通过一根数据线(GPIO口)进行通讯的驱动(50us中断一次)
    发送数据的数据头:定义为90次中断的低电平(50us*90 = 4.5ms) 270-90此中断的高电平(50us*180 = 9ms)
    发送数据1:定义为11次中断的低电平(50us*11 = 550us)   45-11次中断的高电平(50us*34 = 1.7ms)
    发送数据0:定义为11次中断的低电平(50us*11 = 550us)   22-11次中断的高电平(50us*11 = 550us)
    两个MCU之间分为发送方和回复方,发送方首先发送数据包,回复方接收到完整的数据后 等待10ms 的延时后发送回 复数据给发送方。


     STM8s定时器配置:

    // 定时50us
    static void TIM4_Config(void)
    {
       TIM4_DeInit();
      
       TIM4_TimeBaseInit(TIM4_PRESCALER_4,199);                                     //50us
      
       TIM4->EGR = 0x01;                                                            //允许更新
      
       TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);                                       //允许中断
      
       TIM4_Cmd(ENABLE);                                                            //使能计数
    }

    50us中断函数:

    /*******************************************************************************
    #Function      :   Interrupt_Time4Up 
    #Description   :   定时器中断运行,定时50us执行通讯驱动程序
    #Parameter     :   NULL
    #Return        :   NULL
    #AuthorAndData :   huangzhigang 20140915
    *******************************************************************************/
    void Interrupt_Time4Up(void)
    {
       if(!g_b1SciTxFlag)
       {
          s_SCIRxDriver();                                                          //串行数据接收驱动函数
       }
       else
       {
          s_SCITxDriver();                                                          //串行数据发送驱动函数
       }
    }

    通讯发送和接收驱动:

    union STATUS_BIT_U uInterruptStatusBufFlag = {0};
    
    //50us基础时钟
    #define MSEC1                         20 
    #define MSEC5_1                       50
    
    //u8 flag = 0;
    
    static void s_SCIRxDriver(void);
    union STATUS_BIT_U uSciRxStatusFlag = {0};
    #define s_b1SciRxStartFlag       uSciRxStatusFlag.cBit.bit0                     //串行数据接收开始标志位                   
    #define s_b1SciHighStatusFlag    uSciRxStatusFlag.cBit.bit1                     //串行高电平状态标志位
    #define s_b1SciBootCodeFlag      uSciRxStatusFlag.cBit.bit2                     //引导码标志位
    #define s_b1SciRxLowStatusFlag   uSciRxStatusFlag.cBit.bit3                     //串行接收低电平状态标志位
    
    #define RX_BOOT_CODE_MIN         216                                            //13.5ms
    #define RX_BOOT_CODE_MAX         300
    #define RX_DATA_CODE             36                                             //1.8ms
    
    static u8 s_u8SciDataStatusSum = 0;
    static u8 s_u8SciDataStatusBuf[5] = {0, 0, 0, 0, 0};
    static u8 s_u8SciDataPoint = 0;
    static u16 s_u16SciRxCnt = 0;
    static u8 s_u8ByteCnt = 0;
    static u8 s_u8BitCnt = 0;
    u8 g_u8SciRxDataBuf[10] = {0};
    
    static void s_SCITxDriver(void);
    union STATUS_BIT_U uSciTxStatusFlag = {0};
    #define s_b1SciTxStatusFlag      uSciTxStatusFlag.cBit.bit0                     //串行发送状态标志位
    #define s_b1SciTxBootCodeFlag    uSciTxStatusFlag.cBit.bit1                     //串行发送引导码标志位
    #define s_b1SciTxBitStartFlag    uSciTxStatusFlag.cBit.bit2                     //串行发送位开始标志     
    #define s_b1SciTxLastByteFlag    uSciTxStatusFlag.cBit.bit3                     //判断是否发送最后字节
    
    static u16 s_u16DataHigh = 0;
    static u16 s_u16DataLow = 0;
    static u16 s_u16SciTxTimer = 0;
    static u8 s_u8TxBit = 0;
    static u8 s_u8TxByte = 0;
    /*----------------------------------------------------------------------------*/
    
    void Interrupt_Time4Up();
    static void s_SCIRxDriver(void);
    static void s_SCITxDriver(void);
    
    /*******************************************************************************
    #Function      :   Interrupt_Time4Up 
    #Description   :   定时器中断运行,定时50us执行通讯驱动程序
    #Parameter     :   NULL
    #Return        :   NULL
    #AuthorAndData :   huangzhigang 20140915
    *******************************************************************************/
    void Interrupt_Time4Up(void)
    {
       if(!g_b1SciTxFlag)
       {
          s_SCIRxDriver();                                                          //串行数据接收驱动函数
       }
       else
       {
          s_SCITxDriver();                                                          //串行数据发送驱动函数
       }
    }
    
    
    /*******************************************************************************
    *   串行数据接收
    *******************************************************************************/
    static void s_SCIRxDriver(void)
    { 
       s_u8SciDataStatusSum -= s_u8SciDataStatusBuf[s_u8SciDataPoint];              
       
       if(SciDataStatus)                                                            //串行数据状态
       {
          s_u8SciDataStatusBuf[s_u8SciDataPoint] = 1;                               //1
       }
       else
       {
          s_u8SciDataStatusBuf[s_u8SciDataPoint] = 0;                               //0
       }
       
       s_u8SciDataStatusSum += s_u8SciDataStatusBuf[s_u8SciDataPoint];              
       
       s_u8SciDataPoint ++;                                                         
       
       if(s_u8SciDataPoint > 4)
       {
          s_u8SciDataPoint = 0;                                                    
       }
       
       if(s_u8SciDataStatusSum >= 3)                                                //高电平处理
       {
          if(s_b1SciRxStartFlag)                                                    //串行数据接收开始标志位
          {
             s_u16SciRxCnt++;                                                       //串行接收数据计数
          }
          
          s_b1SciHighStatusFlag = 1;
       }
       else
       {
          if(s_b1SciHighStatusFlag)
          {
             s_b1SciHighStatusFlag = 0;
             
             if(s_b1SciRxStartFlag)                                                 //串行接收开始标志位
             {
                if(!s_b1SciBootCodeFlag)                                            //引导码标志位
                {
                   if((s_u16SciRxCnt > RX_BOOT_CODE_MIN) && (s_u16SciRxCnt < RX_BOOT_CODE_MAX))//判断引导码
                   {
                      s_b1SciBootCodeFlag = 1;
                   }
                }
                else
                {
                   if(s_u16SciRxCnt < RX_DATA_CODE)                                 //脉宽小于1.8ms
                   {
                      g_u8SciRxDataBuf[s_u8ByteCnt] &= (~(1 << s_u8BitCnt));        //0
                   }
                   else
                   {
                      g_u8SciRxDataBuf[s_u8ByteCnt] |= (1 << s_u8BitCnt);           //1
                   }
                
                   s_u8BitCnt++;                                                    //位计数
                
                   if(s_u8BitCnt >= 8)
                   {
                      s_u8BitCnt = 0;
                   
                      s_u8ByteCnt ++;                                               //字节计数
                   
                      if(s_u8ByteCnt > SCI_RX_BYTE)
                      {
                         s_u8ByteCnt = 0;
                      
                         uSciRxStatusFlag.all = 0;
                      
                         g_b1SciRxFinishFlag = 1;
                         
                         g_b1SciCorrectFlag = 1;                                    //通信正常标志位
                      }
                   }
                }
             }
             else
             {
                s_b1SciRxStartFlag = 1;
             }
             
             s_u16SciRxCnt = 0;
          }
          
          s_u16SciRxCnt++;
          
          s_b1SciRxLowStatusFlag = 1;                                               //串行接收低电平状态标志位
       }
       
       if(s_u16SciRxCnt > 400)                                                      //串行接收计数大于400 出错了
       {
          s_u16SciRxCnt = 0;
          
          uSciRxStatusFlag.all = 0;
          
          s_u8ByteCnt = 0; 
          
          s_u8BitCnt = 0;
       }
    }
    /*******************************************************************************
    *   串行数据发送
    *******************************************************************************/
    static void s_SCITxDriver(void)
    {    
       SciDataOut();                                                                //串行数据输出
       
       if(!s_b1SciTxBitStartFlag)                                                   //串行发送位开始标志判断
       {
          s_b1SciTxBitStartFlag = 1;                                                //串行发送位开始标志
             
          s_u16SciTxTimer = 0;
             
          if(!s_b1SciTxBootCodeFlag)                                                //串行发送引导码标志位判断
          {
             s_b1SciTxBootCodeFlag = 1;
                
             s_u16DataHigh = 270;
                  
             s_u16DataLow = 90;
          }
          else
          {
             if(g_u8SciTxData[s_u8TxByte] & (1 << s_u8TxBit))                       //发送1
             {
                s_u16DataHigh = 45;
                  
                s_u16DataLow = 11;
             } 
             else                                                                   //发送0
             {
                s_u16DataHigh = 22;
                  
                s_u16DataLow = 11;
             }
                
             s_u8TxBit ++;                                                          //位计数
                
             if(s_u8TxBit > 7)
             {
                s_u8TxBit = 0;
                   
                s_u8TxByte++;                                                       //字节计数
                   
                if(s_u8TxByte > SCI_TX_BYTE)                                        //判断是否发完一帧数据
                {
                   s_b1SciTxLastByteFlag = 1;                                       //串行发送最后字节标志位
                      
                   s_u8TxByte = 0;                                                  //发送字节清0
                }
             }
          }
       }
          
       if(s_b1SciTxBitStartFlag)                                                    //串行发送位开始标志
       {
          if(s_u16SciTxTimer == 0)                                                  //串行发送时间判断
          {
             SciDataLow();                                                          //数据线拉低
          }
          else if(s_u16SciTxTimer == s_u16DataLow)                                  //串行发送时间判断
          {
             SciDataHigh();                                                         //数据线拉高
          }
          else if(s_u16SciTxTimer == s_u16DataHigh)                                 //串行发送时间判断
          {
             SciDataLow();                                                          //数据线拉低
                     
             if(!s_b1SciTxLastByteFlag)                                             //判断是否发送最后字节
             {
                s_u16SciTxTimer = 0;                                                //发送时间清0
                   
                s_b1SciTxBitStartFlag = 0;                                          //串行发送位开始标志
             }
          }
          else if(s_u16SciTxTimer == (s_u16DataHigh + 10))                          //串行发送时间大于 高电平时间+10 出错了
          {
             g_b1SciTxFlag = 0;
                   
             s_b1SciTxLastByteFlag = 0;
                   
             s_b1SciTxBootCodeFlag = 0;
                
             s_b1SciTxBitStartFlag = 0;
             
             SciDataIn();                                                           //串行数据输入
          }
             
          s_u16SciTxTimer++;  
       }
    }


    展开全文
  • PIC单片机串口通讯程序 描述如何使用PIC8位单片机的UART
  • 一根线通讯技术(单线通讯技术)

    万次阅读 2017-06-28 16:26:03
    本文介绍了一种能够利用一根线通讯的技术。  这里说的一根线是严格的一根线,也就是说没有地线。如图所示。  该技术利用一根线作为载体,将数字信号以灵活的速率传到线缆的另一端。速率最低可以到1200bps,最远...
  • 文章目录0、前言1、硬件接线示意图2、通讯规则2.1...  目前很多便宜的单片机都没有标准的串行通讯口UART,甚至没有IIC、SPI等接口,MCU外围硬件接口不够。但有时又需要和其它设备或者器件进行简单的通讯,速度要求不
  • 51单片机双机通讯

    千次阅读 2015-01-27 15:38:11
    //两个单片机通讯,使用中断法 #include #define uchar unsigned char #define uint unsigned int #define key_port P1 #define dis_port P2 void main (void) { uchar key_in=0xff; SCON=0x50; //MODER1,REN=...
  •   目前很多便宜的单片机都没有标准的串行通讯口UART,甚至没有IIC、SPI等接口,MCU外围硬件接口不够。但有时又需要和其它设备或者器件进行简单的通讯,速度要求不是很高,又或者说受硬件限制,只能提供一根通讯线...
  • PLC与单片机IO口单线数字通信协议,可取代串口通讯,节约成本
  • 51单片机软件SPI通讯

    千次阅读 2019-01-23 00:02:58
    UART、 I2C 和 SPI 是单片机系统中最常用的三种通信协议。 1、初步介绍 SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件...
  • 基于单片机I/O口的单线通信程序

    千次阅读 2019-11-16 17:45:59
    单线串口通信协议如下: 需要发送的数据帧:
  • 用于无线手机通讯等方面的资料!单片机应用于通讯及声技术方面==是毕业设计的好资料!
  • 单片机入门学习十 STM32单片机学习七 串口通讯

    千次阅读 多人点赞 2018-01-18 16:09:38
    单片机入门学习三 51单片机学习二 中已经说了串口通讯的基本原理,本篇主要记录stm32中的串口通讯。 1、串口通讯基础简单回顾 1)串口通讯通讯方式 同步通信:带时钟同步信号传输。SPI,I²C通信接口 异步...
  • PIC单片机I2C主从通讯程序源代码

    热门讨论 2009-11-09 15:33:20
    单片机I2C通讯程序源代码PIC16F7x_I2CMaster;PIC16F7x_I2CSlave
  • 本文为大家介绍wifi模块与单片机通信原理。时钟DS1302模块电路原理图:DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。...
  • 其主要特点是单线双向异步串行通讯。为了进入监控模式,在单片机上电复位时,该通讯线要处于高电平状态。除了该通讯线外,还有一些辅助信号线要处于特定的电位状态。如果单片机的复位矢量不是处于擦除状态(被烧录过...
  • 这是我收集的很实用的PIC单片机的子程序包括:PIC12F629控制七彩灯、PIC16F84模拟6221红外发射、PIC16F876驱动诺基亚5110LCD、PIC16F877串行通信程序、PIC单片机I-O口单线通讯程序、PIC单片机读写时钟芯片DS1302汇编...
  • uart就无法实现单项通信,遂决定使用STcubeMX软件,使用官方hal库对单片机进行配置,自己摸索实属不易,现仅能实现uart1接收再通过uart1发送,以STM32F103C8为例,仅通过A9即可实现上位机与单片机之间的通讯。...
  • 在许多传统行业中,多路高 温度采集系统是不可或缺的。电厂、石化行业、钢铁厂以及制药厂等企业生产过程...采集部分是通过主 芯片 AT89S52 单片机和 DALLAS 单线式数字温度传感器 DS18B20 组建采集网络完成。DS18B20
  • 51单片机与PC串口通信

    万次阅读 多人点赞 2015-06-01 13:40:26
    本人最近写了一个单片机与电脑的串口通信程序,程序调试成功,希望对大家有所帮助。本程序的功能有:1、通过DS18B20采集温度并通过1602显示出来。2、单片机与电脑进行通信,上位机给单片机一个读温度指令,单片机把...
  • 51单片机温度传感器

    千次阅读 多人点赞 2019-10-29 22:36:44
    51单片机总结—— DS18B20数字温度传感器 单总线时序和注意事项: 单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0、读1。所有这些信号除存在脉冲由DS18B20发出的以外其他信号都由总线控制器发出。 数据传输...
  • 单线激光雷达驱动

    2021-06-07 16:04:18
    在基于lwip协议栈搭建好tcp或udp通讯后,我们就可以开始用板载网口与雷达通信了,目前先将接收到的雷达数据在udp接收回调函数中进行转存。 一、雷达协议介绍 雷达作为udp服务器端,发送广播信号到另一端,当平台设置...
  • 单线或多线循迹.py

    2019-08-01 22:46:09
    openmv巡线,9区域划分,通过串口发送数字与单片机通讯,便于过滤周围其他线条的影响
  • &amp;nbsp;————————–cn—————————————————www.ourDev.cn————————–...从单片机初学者迈向单片机工程师 作者:tangwei039 来自:西安tangwei039@126.com 整理:by Linff 目录:...
  • 01 分段线性插值法 02 用普通IO口检测AD值的方法(采集温度) 03 用单片机IO口实现单线单工通讯 04 复位电路集锦 03 一阶滤波算法之深入研究

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 518
精华内容 207
关键字:

单片机单线通讯