原创 单片机C51串口中断接收和发送测试例程(含通信协议的实现)

2008-10-21 15:01 3046 15 16 分类: MCU/ 嵌入式

单片机C51串口中断接收和发送测试例程(含通信协议的实现)


作者:龚建伟  http://www.gjwtech.com<?XML:NAMESPACE PREFIX = O />


通信协议:1字节,MSB1,为第1字节标志,第2字节,MSB0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。


测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。


<?XML:NAMESPACE PREFIX = V />

 

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//
和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

//
程序编写: 龚建伟  webmaster@gjwtech.com
//
技术主页:http://www.gjwtech.com
//
您有这方面的问题可以和我讨论



#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);
          }
    }

}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户741296 2008-10-21 15:05

不错! 对初学者很有帮助!
相关推荐阅读
用户1340145 2009-07-24 09:29
数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮地
转自:http://ouravr.com/bbs/bbs_content.jsp?bbs_sn=3351198&bbs_page_no=1&bbs_id=9999除了正确进行接地设计、...
用户1340145 2009-07-20 15:37
转载的C51的编程规范
转贴地址http://blog.sina.com.cn/s/blog_5e112fd50100cifv.html收集的C51的编程规范 编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及...
用户1340145 2009-07-20 15:31
PS/2鼠标
Microsoft标准串口鼠标(两键)采用7个数据位,1个停止位, 无校验位的方式以1200BPS的速率传送数据(有部分为2400bps) 数据格式采用Mirosoft规定的3字节格式如下: Byte...
用户1340145 2009-07-02 17:14
手把手教你写程序
非常实用,特转载共大家分享!谢谢原作者!http://bbs.21ic.com/club/bbs/bbsview.asp?boardid=11&t=3355604&tp=%CA%D6%...
用户1340145 2009-06-25 15:46
9针VGA显示接口引脚定义
VGA 是 Video Graphics Adapter(Array) 的缩写,信号类型为模拟类型,显示卡端的接口为 9 针母插座:显示器连线端的接口为 9 针公插头: 引脚定义PinNameDirD...
用户1340145 2009-06-25 14:55
PS/2鼠标接口的设计与实现(转)
http://www.dzkf.cn/html/zonghejishu/2007/0911/2599.html当前嵌入式系统技术已得到了广泛应用,但传统嵌入式系统的人机接口多采用小键盘操作的文本菜单方...
我要评论
1
15
关闭 站长推荐上一条 /3 下一条