串口通讯试验C语言程序


串口通讯试验
                                  6.8源代码(ASM&C51)
                  ;发送与接收程序ASM
                  ORG 0000H
                  AJMP MAIN
                  ORG 0023H
                  AJMP UARTI;转串行中断服务程序
                  ORG 0030H
                  MAIN: MOV SP,#70H
                  MOV 25H,#00H
                  MOV R0,#30H;30H开始存数
                  MOV SCON,#50H;串口方式1,REN=1(允许串口接收数据)
                  MOV TMOD,#20H;定时器1作为波特率发生器,工作模式为2
                  MOV PCON,#00H;SMOD=0
                  MOV TH1,#0FDH
                  MOV TL1,#0FDH
                  SETB TR1;定时器开始计数
                  SETB EA
                  SETB ES
                  LOOP: LCALL FSAT;发送程序
                  LJMP LOOP
                  ;串口中断接收程序
                  UARTI:
                  JB RI,recive;RI=1,本机接收中断,转接收程序,RI=0继续
                  CLR TI
                  SJMP ENDT
                  recive: CLR RI
                  MOV A,SBUF
                  MOV @R0,A
                  INC 25H;接收字节计数
                  RE1: INC R0
                  MOV A,R0
                  CJNE A,#5FH,ENDT ;超过50H从30H开始
                  MOV A,#30H
                  MOV R0,A
                  ENDT: RETI
                  ;发送1234指令子程序
                  FSAT: CLR ES
                  CLR TI;先对TI进行软件复位
                  MOV A,#31H;将ASCII码A发送到串口去
                  MOV SBUF,A
                  JNB TI,$;如果TI为0说明发送没有完成,程序等待
                  CLR TI;先对TI进行软件复位
                  MOV A,#32H
                  MOV SBUF,A
                  JNB TI,$
                  CLR TI
                  MOV A,#33H
                  MOV SBUF,A
                  JNB TI,$
                  CLR TI
                  MOV A,#34H
                  MOV SBUF,A
                  JNB TI,$
                  SETB ES
                  lcall delay5ms
                  lcall delay5ms
                  lcall delay5ms
                  lcall delay5ms
                  lcall delay5ms
                  delay5ms:
                  MOV R4,#0FFH
                  DA222: MOV R5,#0FFH
                  DJNZ R5,$
                  DJNZ R4,DA222
                  RET
                  END
                  //(C51)
                  //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
                  #include <reg51.h>
                  #include <string.h>
                  #define INBUF_LEN 4 //数据长度
                  unsigned char inbuf1[INBUF_LEN]={'a','b','4','2'};//发送缓冲区
                  unsigned char inbuf2[50];//接收缓冲区
                  unsigned char count3;
                  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 = 0xFA ; //Baud:4800 fosc=11.0592MHz
                  IE |= 0x90 ; //Enable Serial Interrupt
                  TR1 = 1 ; // timer 1 run
                  }
                  //向串口发送一个字符
                  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) //RI==开始接收
                  {
                  unsigned char ch;
                  RI = 0 ; //软件RI=0
                  ch=SBUF;
                  if (ch> 50 )
                  {
                  count3= 0 ;
                  inbuf2[count3]=ch;
                  }
                  else
                  {
                  count3++;
                  inbuf2[count3]=ch;
                  }
                  }
                  }
                  main()
                  {
                  init_serialcomm(); //初始化串口
                  while ( 1 )
                  {
                  send_string_com(inbuf1,INBUF_LEN);
                  }
                  }
                  6.9 总结与其他知识
                  l 串口通信基本接线方法
                  目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422、RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。
                  1、DB9和DB25的常用信号脚说明
                  2、RS232C串口通信接线方法(三线制)
                  首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连
                  同一个串口的接收脚和发送脚直接用线相连 对9针串口和25针串口,均是2与3直接相连;
                  两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口)
                  上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接,就能百战百胜。
                  3、串口调试中要注意的几点:
                  不同编码机制不能混接,如RS232C不能直接与RS422接口相连,市面上专门的各种转换器卖,必须通过转换器才能连接;
                  线路焊接要牢固,不然程序没问题,却因为接线问题误事;
                  串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果;
                  强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。
                  l 串口连接线的制作方法
                  在电脑的使用中往往会遇到各种各样的连接线。这些连接线外观上好像都差不多,但内部结构完全不同并且不能混用。如果在使用中这些连接线坏了,往往很多使用者都不知道应该怎么办,下面就给出这些常见的连接线的连线方法以便于修理或查找故障。在介绍之前先对一些市场常用名词做出解释。现在所有的接头都可以分为公头和母头两大类。
                    公头:泛指所有针式的接头。
                    母头:泛指所有插槽式的接头。
                    所有接头的针脚有统一规定,在接头上都印好了的,连接时要注意查看。
                    在接线时没有提及的针脚都悬空不管。
                    下面给出串口,并口各针脚功能表以供高级用户维护电缆或接头时使用。
                      
                    25针串口功能一览
                    针脚 功能
                    2 发送数据(TXD)
                    3 接收数据 (RXD)
                    4 发送请求 (RTS)
                    5 发送清除 (CTS)
                    6 数据准备好 (DSR)
                    7 信号地 (GND)
                    8 载波检测 (DCD)
                    20 数据终端准备好 (DTR)
                    22 振铃指示 (RI)
                    
                    9针串口功能一览表
                    针脚 功能
                    1 载波检测 (DCD)
                    2 接收数据 (RXD)
                    3 发送数据(TXD)
                    4 数据终端准备好 (DTR)
                    5 信号地 (GND)
                    6 数据准备好 (DSR)
                    7 发送请求 (RTS)
                    8 发送清除 (CTS)
                    9 振铃指示 (RI)
                    
                    串口联机线的连接方法
                    串口联机线主要用于直接把两台电脑的com口连接。比较早一点的AT架构的电脑的串口有为9针,和25针两种,现在的ATX架构的电脑两个串口全部是9针。于是联机线就分为3种(9针对9针串口联机线,9针对25针串口联机线,25针对25针串口联机线)这些直接电缆连接线可以互换的连线方法如下表:
                    
                    串口连机线一览
                    9针对9针串口连接
                    9针母头 9针母头
                     2 —— 3
                     3 —— 2
                     4 —— 6
                     5 —— 5
                     6 —— 4
                     7 —— 8
                     8 —— 7
                    
                    25针对25针串口连接
                    25针母头 25针母头
                     2 —— 3
                     3 —— 2
                     4 —— 5
                     5 —— 4
                     6 —— 20
                     7 —— 7
                     20 —— 6
                    
                    9针对25针串口连接
                    9针母头 25针母头
                     2 —— 2
                     3 —— 3
                     4 —— 6
                     5 —— 7
                     6 —— 20
                     7 —— 5
                     8 —— 4
                       
                    串口转接线
                      这种转接线适用于9针串口和25针串口的转换。
                      首先,根据需要(9转25或25转9)选择两个转接头。选择方法如下:
                      9针转25针(9针公头,25针母头)。25针转9针(25针公头,9针母头)。然后使用尽量短的带屏蔽的多芯连接线。连接方法如下表
                    
                    串口转接线一览
                    9针接头 25针接头
                     1 —— 8
                     2 —— 3
                     3 —— 2
                     4 —— 20
                     5 —— 7
                     6 —— 6
                     7 —— 4
                     8 —— 5
                     9 —— 22
                  6.10 如何通过DG3000实现串口通讯?
                  由于DG3000仿真过程中占用了串口,所以是不能通过硬件进行仿真。不过我们完全可以通过模拟软件来观察结果。方法如下:
                  例如:我们打开汇编程序界面如下:
                  
                  然后,点击Target 1 右键,选择:
                  
                  跳出下面窗口,我们选择如下,然后确定:
                  
                  然后点击编译:
                  
                  再点击开始仿真:
                  
                  出现下面界面:
                  
                  然后,我们打开:
                  
                  调出Serial Window #1 ,界面如下:
                  
                  然后全速运行程序 :
                  可以观察 Serial Window #1,显示如下:
                  
                  
                  其中1234就是串口发出的数据。

[ 本帖最后由 HGP7561 于 2008-8-31 12:25 编辑 ]

实验六:串口通讯试验.rar
(2008-08-31 12:25:09, Size: 8.07 KB, Downloads: 6)


我也来说两句 查看全部回复

最新回复

  • Jary203704 (2008-8-28 11:03:16)

    我顶
  • ybyb8989 (2008-8-28 11:48:44)

    顶一下。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • LUOSPRING (2008-8-28 15:41:02)

    顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!