单片机C51串口中断接收和发送测试
发布时间:2008/5/27 0:00:00 访问次数:1568
    
    
    通信协议: 第1字节,msb为1,为第1字节标志,第2字节,msb为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
    测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10
    20 25,说明测试成功。
    //这是一个单片机c51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
    //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
    #include <reg51.h>
    #include <string.h>
    #define inbuf_len 4 //数据长度
    unsigned char inbuf1[inbuf_len];
    unsigned char checksum,count3;
    bit read_flag= 0 ;
    void init_serialcomm( void )
    {
    scon = 0x50 ; //scon: serail mode 1, 8-bit uart, enable ucvr
    tmod |= 0x20 ; //tmod: timer 1, mode 2, 8-bit reload
    pcon |= 0x80 ; //smod=1;
    th1 = 0xf4 ; //baud:4800 fosc=11.0592mhz
    ie |= 0x90 ; //enable serial interrupt
    tr1 = 1 ; // timer 1 run
    // ti=1;
    }
    //向串口发送一个字符
    void send_char_com( unsigned char ch)
    {
    sbuf=ch;
    while (ti== 0 );
    ti= 0 ;
    }
    //向串口发送一个字符串,strlen为该字符串长度
    void send_string_com( unsigned char *str, unsigned int strlen)
    {
    unsigned int k= 0 ;
    do
    {
    send_char_com(*(str + k));
    k++;
    } while (k < strlen);
    }
    
    //串口接收中断函数
    void serial () interrupt 4 using 3
    {
    if (ri)
    {
    unsigned char ch;
    ri = 0 ;
    ch=sbuf;
    if (ch> 127 )
    {
    count3= 0 ;
    inbuf1[count3]=ch;
    checksum= ch- 128 ;
    }
    else
    {
    count3++;
    inbuf1[count3]=ch;
    checksum ^= ch;
    if ( (count3==(inbuf_len- 1 )) && (!checksum) )
    {
    read_flag= 1 ; //如果串口接收的数据达到inbuf_len个,且校验没错,
    //就置位取数标志
    }
    }
    }
    }
    main()
    {
    init_serialcomm(); //初始化串口
    while ( 1 )
    {
    if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
    {
    read_flag= 0 ; //取数标志清0
    send_string_com(inbuf1,inbuf_len
    
    
    通信协议: 第1字节,msb为1,为第1字节标志,第2字节,msb为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。
    测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10
    20 25,说明测试成功。
    //这是一个单片机c51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
    //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
    #include <reg51.h>
    #include <string.h>
    #define inbuf_len 4 //数据长度
    unsigned char inbuf1[inbuf_len];
    unsigned char checksum,count3;
    bit read_flag= 0 ;
    void init_serialcomm( void )
    {
    scon = 0x50 ; //scon: serail mode 1, 8-bit uart, enable ucvr
    tmod |= 0x20 ; //tmod: timer 1, mode 2, 8-bit reload
    pcon |= 0x80 ; //smod=1;
    th1 = 0xf4 ; //baud:4800 fosc=11.0592mhz
    ie |= 0x90 ; //enable serial interrupt
    tr1 = 1 ; // timer 1 run
    // ti=1;
    }
    //向串口发送一个字符
    void send_char_com( unsigned char ch)
    {
    sbuf=ch;
    while (ti== 0 );
    ti= 0 ;
    }
    //向串口发送一个字符串,strlen为该字符串长度
    void send_string_com( unsigned char *str, unsigned int strlen)
    {
    unsigned int k= 0 ;
    do
    {
    send_char_com(*(str + k));
    k++;
    } while (k < strlen);
    }
    
    //串口接收中断函数
    void serial () interrupt 4 using 3
    {
    if (ri)
    {
    unsigned char ch;
    ri = 0 ;
    ch=sbuf;
    if (ch> 127 )
    {
    count3= 0 ;
    inbuf1[count3]=ch;
    checksum= ch- 128 ;
    }
    else
    {
    count3++;
    inbuf1[count3]=ch;
    checksum ^= ch;
    if ( (count3==(inbuf_len- 1 )) && (!checksum) )
    {
    read_flag= 1 ; //如果串口接收的数据达到inbuf_len个,且校验没错,
    //就置位取数标志
    }
    }
    }
    }
    main()
    {
    init_serialcomm(); //初始化串口
    while ( 1 )
    {
    if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
    {
    read_flag= 0 ; //取数标志清0
    send_string_com(inbuf1,inbuf_len