EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2009/2/10 10:19:10

3

标签: 8051  串口  通讯  通信  c51  

MCU-51串口通信程序

MCU-51串口通信程序

51串口通讯是51单片机的基本,以前每次用串口通信都要自己写程序,想偷懒的话到网上找程序,每次都要花费很长时间才能调通串口。其实对于51 c语言程序来说,写好一个通用程序后,以后每次复制粘贴,程序中调用相应函数既可,而不用每次都为程序发愁。

 

本文keil项目文件 rar

 

#include <reg51.h>

#include <string.h>

  

unsigned char ch;

  

bit read_flag= 0 ;

  

void init_serialcom( void )

   {

       SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr  

                         //UART为模式18位数据,允许接收

          TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload            

                         //定时器1为模式2,8位自动重装

          PCON |= 0x80 ; //SMOD=1;

          TH1 = 0xFD ;   //Baud:19200 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 ;

          }

 

//串口接收中断函数

void serial () interrupt 4 using 3

{

    if (RI)

          { 

                 RI = 0 ;

                 ch=SBUF;             

                 read_flag= 1 ; //就置位取数标志

              }

}

 

 main()

    {

           init_serialcom(); //初始化串口

                  while ( 1 )

                        {

                            if (read_flag) //如果取数标志已置位,就将读到的数从串口发出

                                    {

                                              read_flag= 0 ; //取数标志清0

                                                 send_char_com(ch);

                                          }

                            }

       }

 

这个程序由四部分组成

init_serialcom( void )                              //初始化串口

send_char_com( unsigned char ch)     //向串口发送字符

serial () interrupt 4 using 3                    //中断串口接收字符

main()                                                     //主函数

 

其中前三个函数都不太需要改变,以后应用的时候直接复制粘贴就行,主要修改的是主函数。这个程序实现的是接收字符,再把这个字符串口发送。

还要一个要注意的是波特率,而波特率可用用下面两个小程序算出

 

 

下载:rar

 

 

下载:rar

 

     关于keil对串口调试,可以参见下一篇博文。

 

参考资料:

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

http://www.dz863.com/interface-circuits/RS232-Seria-circuits/rs232-C51.htm

2. 51单片机串口波特率计算--博客之家

http://street.bloghome.cn/posts/86892.html

系统分类: 单片机   |   用户分类: MCS51   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

该用户于2009/2/10 10:58:36编辑过该文章

阅读(7935)  |  评论(9)  |  收藏(1)  |  举报  

投一票您将和博主都有获奖机会!

最新评论

  • wanglei_142

    2009/9/1 18:56:50

    楼主太好,小弟在此学习了! 谢谢!

  • huajia

    2009/8/23 12:33:36

    谢谢

  • tengjingshu

    2009/7/6 9:10:35

    TO hesor: 程序里有一个发多个字符的函数,只不过被注释掉而已

  • hesor

    2009/7/2 12:19:54

    博主你好,如果我要实现连续发5个字节,然后返回5字节的程序该怎么写,比如Pc发送FF 00 02 01 0D ,然后单片机要判断这5位是否都正确,如果正确则返回,FF 00 04 01 0D,这个程序改怎么写,望博主赐教.

  • tengjingshu

    2009/4/20 9:00:20

    to wx3456: 你试试我的程序。至于没有从main运行,你可以看一下汇编是不是从main开始的。

  • wx3456

    2009/4/18 13:08:33

    谢谢啦! 我想请教一个问题 我用C51写了一个通过串口中断方式发送一个字符到PC的程序,写好之后我在Keil51 下Debug。在SRC文件中发现程序没有进入主程序中执行,而是直接进入了串口中断程序,复位也没有用,可是我发现此时没有产生任何中断,也把中断关了,程序根本没有从main()出开始运行,不知道问题出在哪里??是Keil软件哪里没有设置对吗?之前我用查询方式做的程序一切正常。程序如下 #include bit flag; void interrupt4(void) interrupt 4 using 1//串口中断 { TI=0; //关串口中断 flag=1; } void main(viod) { TMOD=0x20; TL1=0xfd; TH1=0xfd; SCON=0x40; //串口工作方式1,1个起始位,8个数据位,1个停止位 PCON=0x00; TI=0; EA=1; //开总中断 ES=1; //开串口中断 flag=1; TR1=1; while(1) { if(flag==1) { SBUF='$'; flag=0; } } }

  • aoyong

    2009/2/16 14:11:50

    谢谢共享

  • klyzh2003

    2009/2/11 15:56:12

    谢谢共享

  • 天涯客

    2009/2/10 22:31:42

    很好