单片机串口自发自收_51单片机串口自发自收 - CSDN
  • 单片机串口自发自收

    2020-07-13 13:34:01
    单片机串口自发自收 #include<reg51.h> unsigned char code led_code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09, 0x11,0xc1,0x63,0x85,0x61,0x71,0xff}; unsigned char dis_buf[4]; sbit led_clk...

    单片机串口自发自收

    #include<reg51.h>
    unsigned char code led_code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,
    0x11,0xc1,0x63,0x85,0x61,0x71,0xff};
    unsigned char dis_buf[4];
    sbit led_clk= P1^6 ;
    sbit led_data = P1^7 ;
    sbit key1=P2^0;
    sbit key2=P2^1;
    sbit key3=P2^2;
    sbit key4=P2^3;
    unsigned char read_flag ;
    unsigned char flag=0;
    unsigned char TT[4],num;
    unsigned char i,j;
    void led_display ( )
    {
    unsignedchar t,i;
    unsignedchar input_code;
    for(i=0;i<4;i++)
    {
    input_code=dis_buf[ i];
    for(t=0;t<8;t++)
    {
    if(input_code & 0x01 )
    {
    led_data=1;
    }
    else
    {
    led_data=0;
    }
    led_clk=0;
    input_code>>=1;
    led_clk=1;
    }
    }
    }
    void Send(unsigned char dat)
    {
    SBUF=dat;
    while(TI0);
    TI=0;
    }
    void recive(void) interrupt 4
    {
    if(RI)
    {
    RI=0;
    TT[num]=SBUF;
    num++;
    if(num>=4)
    {
    num=0;
    read_flag=1;
    }
    }
    }
    void delay_ms(unsigned int x)
    {
    unsigned int i;
    unsigned char j;
    for(i=x;i>0; i–)
    for(j=110;j>0;j–);
    }
    void main(void)
    {
    TMOD=0x20;
    SCON=0x50;
    PCON=0x00;
    TH1=0xfd;
    TL1=0xfd;
    EA=1;
    ES=1;
    TR1=1;
    dis_buf[0]=led_code[16];
    dis_buf[1]=led_code[16];
    dis_buf[2]=led_code[16];
    dis_buf[3]=led_code[16];
    led_display();
    while(1)
    {
    if(key1
    0)
    {
    delay_ms(10);
    if(key10)
    {
    i=0;flag=1;
    }
    }
    else if(key2
    0)
    {
    delay_ms(10);
    if(key20)
    {
    i=4;flag=1;
    }
    }
    else if(key3
    0)
    {
    delay_ms(10);
    if(key30)
    {
    i=8;flag=1;
    }
    }
    else if(key4
    0)
    {
    delay_ms(10);
    if(key40)
    {
    i=12;flag=1;
    }
    }
    if(flag)
    {
    for(j=i;i<j+4;i++)
    {
    Send(led_code);
    }
    flag=0;
    }
    if(read_flag
    1)
    {
    read_flag=0;
    dis_buf[0]=TT[3];
    dis_buf[1]=TT[2];
    dis_buf[2]=TT[1];
    dis_buf[3]=TT[0];
    led_display();
    }
    }
    }

    展开全文
  • STM32 串口2自发自收

    2020-07-17 17:52:53
    STM32F10X,主函数,串口一的配置(初始化+中断配置+中断接收函数)
  • STM32通过串口自收发

    2020-07-28 23:30:44
    STM32 通过 串口 收发 ,亲自测试可用,运行流畅 发什么输出什么
  • 一个字有一个逻辑‘1’起始位,8为ASCII码数据位,1位逻辑‘1’停止位,传输波特率为9600baut。
  • 功能: 连接串口到电脑,下载该程序,打开电源 打开串口调试助手,将波特率设置为2400,无奇偶校验 晶振12MHz,发送和接收使用的格式相同,如都使用 字符型格式,设置正确后接受框可以显示出: The UART test,...
     
    /*-----------------------------------------------
    功能:	连接串口到电脑,下载该程序,打开电源
            打开串口调试助手,将波特率设置为2400,无奇偶校验
            晶振12MHz,发送和接收使用的格式相同,如都使用
            字符型格式,设置正确后接受框可以显示出:
    		The UART test, 请在发送区输入信息
    ------------------------------------------------*/
    
    #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        
    
    /*------------------------------------------------
                       函数声明
    ------------------------------------------------*/
    void SendStr(unsigned char *s);
    
    /*------------------------------------------------
                        串口初始化
    ------------------------------------------------*/
    void InitUART  (void)
    {
    
        SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
        TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
        //TH1   = 0xF3;               // TH1:  重装值2400  
    	
    		TH1=0xfd;
    	  TL1=0xfd;	//11.0592MHZ晶振 9600波特率 对应应装初值
    	
        TR1   = 1;                  // TR1:  timer 1 打开                         
        EA    = 1;                  //打开总中断
       // ES    = 1;                  //打开串口中断
    }                            
    /*------------------------------------------------
                        主函数
    ------------------------------------------------*/
    void main (void)
    {
    
    InitUART();
    
    SendStr("The UART test, 请在发送区输入信息");
    
    ES    = 1;                  //打开串口中断
    while (1)                       
        {
        
        }
    }
    
    /*------------------------------------------------
                        发送一个字节
    ------------------------------------------------*/
    void SendByte(unsigned char dat)
    {
     SBUF = dat;
     while(!TI);
          TI = 0;
    }
    /*------------------------------------------------
                        发送一个字符串
    ------------------------------------------------*/
    void SendStr(unsigned char *s)
    {
     while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
      {
      SendByte(*s);
      s++;
      }
    }
    /*------------------------------------------------
                         串口中断程序
    ------------------------------------------------*/
    void UART_SER (void) interrupt 4 //串行中断服务程序
    {
        unsigned char Temp;          //定义临时变量 
       
       if(RI)                        //判断是接收中断产生
         {
    	  RI=0;                      //标志位清零
    	  Temp=SBUF;                 //读入缓冲区的值
    	  P1=Temp;                   //把值输出到P1口,用于观察
          SBUF=Temp;                 //把接收到的值再发回电脑端
    	 }
       if(TI)                        //如果是发送标志位,清零
         TI=0;
    } 
    
    

    展开全文
  • #include void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0;
    MSP430单片机的串口收发程序涉及到多个寄存器,可以一步一步按照以下步骤进行配置:
    1、首先将用到的IO口设置为第二功能,例如要使用P3.4和P3.5作为USART0的TXD和RXD,则有 P3SEL |= BIT3+BIT4;
    2、使能串口收发功能,要配置以下寄存器
    如果既要收,又要发,则需要将UTXE0和URXE0置1,因为他们默认都是不打开的。
    在IAR的头文件中有关于两位的掩码:
    #define UTXE0   (0x80)
    #define USPIE0  (0x40)
    因此,我们可以直接使用语句:
    ME1 |= UTXE0 + URXE0; 
    3、选择每帧的数据位的个数,需要配置寄存器:
    默认的是7bit数据位,因此将CHAR位置1就是8位数据位。
      UCTL0 |= CHAR; 
    4、选择波特率发生源,MSP430F149的波特率发生源有四种
    
    
    波特率的分频系数要求大于3,要选择合适的时钟源,可以遵循以下规则:当波特较低时(<9600),可以选择ACLK,辅助时钟一般情况下使用是32768Hz的Watch Oscilliater,
    当波特率较高时要使用SMCLK子系统时钟。
    在IAR的头文件中有如下定义:
    #define SSEL0  (0x10) /* Clock Source Select 0 */
    
    因此要选用ACLK,可以使用:
    UTCTL0 |= SSEL0;
    5、配置波特率,这个需要结合选用的时钟源进行相应的计算:
    
    
    首先它需要用到三个寄存器UXBR0,UXBR1和UXMCLK
    然后要弄清楚分频比:
    其中的BRCLK是指波特率发生器的时钟源的频率,例如本例当中使用的ACLK= 32768Hz, baude rate是指我们最终希望配置成的频率,例如本例需要的是9600
    那么N=32768/9600=3.41
    UXBRO和UXBR1组合为一个16位的寄存器,它保存整数部分,所以UXBR0=3,UXBR1=0;
    UXMCLK用来保存小数部分,小数部分的计算比较复杂
    首先让小数部分0.41*8=5.08 取整就是5
    则UXBR1这个8位寄存器中就应该有5个1,这五个1要分布相对平均,可以取01001010,就是4A
    要注意UXBR1的取值并不唯一。
    在User's Guide中已经计算好的有如下:
    这些是常用值,建议使用的时候参考参考,免去计算的麻烦。
    6、软件清除复位标志位
    寄存器如下:
    其中第一位用于是否具有软件复位UART功能,一般需要关闭该功能,也就是复位
    UCTL0 &= ~SWRST; 
    7、最后我们需要打开中断,当然如果你不需要使用中断收发而使用查询方式收发,那么就不用打开中断。
    需要配置的寄存器如下:

    可以看到默认的情况下,USART的发送中断和接收中断是关闭的,在本例当中,我们用到了接收中断,因此:
    IE1 |= URXIE0;
    到此,整个程序基本就结束了。
    
    
    #include  <msp430x14x.h>
    
    void main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
      ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
      UCTL0 |= CHAR;                            // 8-bit character
      UTCTL0 |= SSEL0;                          // UCLK = ACLK
      UBR00 = 0x03;                             // 32k/9600 - 3.41
      UBR10 = 0x00;                             //
      UMCTL0 = 0x4A;                            // Modulation
      UCTL0 &= ~SWRST;                          // Initialize USART state machine
      IE1 |= URXIE0;                            // Enable USART0 RX interrupt
    
    // Mainloop
      for (;;)
      {
      _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/interrupt
      while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?
      TXBUF0 = RXBUF0;                          // RXBUF0 to TXBUF0
      }
    }
    
    // UART0 RX ISR will for exit from LPM3 in Mainloop
    #pragma vector=UART0RX_VECTOR
    __interrupt void usart0_rx (void)
    {
      _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from 0(SR)
    }
    

    
    
    
    
    
    
    展开全文
  • 编写程序对微机系统的串口进行自发自收的内环测试;数据发送从键盘输入,接受数据在屏幕上显示。 不多BB,直接上代码 .586 DATA SEGMENT USE16 BUF DB 30 DUP(?) DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS...

    //
    题目:
    运用微机系统串行口知识,进行微机系统串行口的测试;完成硬件测试环境;编写程序对微机系统的串口进行自发自收的内环测试;数据发送从键盘输入,接受数据在屏幕上显示。

    不多BB,直接上代码

    .586
    DATA SEGMENT USE16
    BUF DB 30 DUP(?)
    DATA ENDS
    
    CODE SEGMENT USE16
        ASSUME CS:CODE, DS:DATA
    START:
        MOV AX, DATA
        MOV DS, AX
        CALL I8250			; 8250初始化 
        MOV BX, OFFSET BUF
    SEND:MOV DX, 3FDH
    	IN AL, DX
    	TEST AL, 20H
    	JZ SEND
        MOV DX, 3F8H
        MOV AH, 1
        INT 21H
        CMP AL, '$'
        JZ COUT
        OUT DX, AL
    RECE:MOV DX, 3FDH
    	IN AL, DX
    	TEST AL, 01H
    	JZ RECE				; 判断一帧数据接收完整
    	MOV DX, 3F8H
    	IN AL, DX
    	AND AL, 01111111B
    	CMP AL, 03H
    	JZ EXIT
    	MOV [BX], AL
    	INC BX
    	JMP SEND
    	
    COUT:MOV AH, 2
        MOV DL, 0AH
        INT 21H				; 光标下移一行
        MOV BYTE PTR [BX+1], '$'
    	MOV AH, 09H
    	MOV DX, OFFSET BUF
    	INT 21H			 	; 显示字符字符串
    	
    EXIT:MOV AH,4CH
        INT 21H				; 结束程序
        
    I8250 PROC
        MOV DX, 3FBH
        MOV AL, 80H
        OUT DX, AL
        MOV DX, 3F9H
        MOV AL, 0
        OUT DX, AL
        MOV DX, 3F8H
        MOV AL, 30H
        OUT DX, AL
        MOV DX, 3FBH
        MOV AL, 0AH
        OUT DX, AL
        MOV DX, 3F9H
        MOV AL, 0
        OUT DX, AL
        MOV DX, 3FCH
        MOV AL, 10H
        OUT DX, AL
        RET			
    I8250 ENDP
        
    CODE ENDS
        END START
    

    输入样例123$
    输出样例123

    展开全文
  • 单片机串口通信实验

    2009-06-10 12:02:00
    实验四 单片机串口通信实验姓 名:郑旅军 学 号:0656061指导老师:邹慧兰 成 绩:如有疑问,请zlj800800@163.com 探讨 一、实验目的1学习单片机串口工作方式的程序设计2学习串行通信的协议3学习串口通信的...
  • #include #define uchar unsigned char uchar rtemp,sflag; void SerialInit() //11.0592M晶振,波特率9600 { TMOD=0x20; //设置定时器1工作方式为方式2 TH1=0xfd;... //串口方式1 SM1=
  • 本系列文章讲述了基于proteus仿真的51单片机学习,内容全面,不仅讲解电路原理,还讲解了单片机c语言,实例丰富,内容全面。
  • stm32串口接收到乱码

    2019-07-14 10:22:19
    前言:之前用的是神州stm32f4那款单片机,但是最近,老师发了一块跟正点原子芯片一样的核心板,当我准备用串口调试时发现发出来的是乱码。本以为是单片机的问题,于是打开之前串口模板程序,发现出来的仍然是乱码。...
  • 有个题目,要求用两台单片机进行串口通信,互相控制。题目链接:http://zhidao.baidu.com/question/551966684.html其电路图有些松散,重画如下:图片链接:...
  • #include #include #define uchar unsigned char #pragma interrupt_handler SerialService:12 uchar rtemp,sflag; void SerialInit(void) { UCSRB=(1)|(1)|(1); //置一接收结束中断使能、接收使能、发
  • 老规矩,先说下问题:串口在接收pc端发来的数据时(100个bytes,每200ms发送一次),偶尔会丢一些数据。某一次的测试记录如下:第一次丢数据 发送总量60多万字节 丢了27个第二次丢数据 发送总量80多万字节 (在上一...
  • 我用的是USB转TTL,最方便的一种验证方法就是,把USB转TTL的RX脚和TX脚短接起来,运行labview写的串口,实现自发自收的功能。验证单片机就用串口调试工具和单片机通信,调试工具发送命令,看单片机...
  • AVR USART接收中断程序

    2017-02-24 15:37:19
    使用AVR的USART进行自发自收(将发送引脚RXD短接到接收引脚TXD),发出数据:0,1,2。。。数据,能接收到自己发出的数据:0,1,2。。。使用LED作出简单指示。 USART自发自收,使用PB口的LED指示接收到的数据,...
  • 利用msp430单片机和红外系统进行简单控制信息传输,本方案是利用串口及红外无线传输,自发自收,对红外和串口通信能够有效的掌握
  • 假设要发送一组数据 Send[10]一般采用查询发送(循环发送)方式:   unsigned char Send[10]; //发送量 unsigned char i; //循环量 for(i=0;i;i++) { SBUF= Send[i]; //发
  • 如果说单写单片机什么最重要,我想应该就是串口了吧。  在我没有钱买仿真调试那玩意的时候,也在我发现手上就一块2块钱的单片机的时候串口可能就成为了唯一的调试手断了。  我喜欢用串口中断的方式来使用串口,...
  • 实验15:串口通信

    2020-03-05 21:15:29
    实验15:串口通信 /************************************************************************************** * 串口通信实验 * 实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择...
1 2 3 4 5 6
收藏数 118
精华内容 47
关键字:

单片机串口自发自收