微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > EVB-335与51单片机串口通讯

EVB-335与51单片机串口通讯

时间:10-02 整理:3721RD 点击:
最近一直在做一个信息采集系统,做了很多实验,都不怎么理想,但我还是选择了用51单片机作为信息采集端,通过串口,51单片机会将采集到的信息发送给EVB_335,硬件连接如图


首先,做一块带串口的51单片机的最小系统板。


将最小系统板与EVB-335用交叉线连接。
将以下代码编译后下载到51单片机,该程序功能为:将51单片机各个IO口采集到的信息通过串口发送出去

  1. #include <reg52.h>


  2. void uart_init()
  3. {
  4.         ET1 = 0;
  5.         TMOD = TMOD & 0X0F;
  6.         TMOD = TMOD | 0X20;
  7.         TH1=TL1=0XFd;
  8.         PCON = 0;
  9.         SCON = 0X40;
  10.         TR1 = 1;
  11. }

  12. uart_delay(int us)
  13. {
  14.         while(us--);
  15. }

  16. void  uart_txdat(char dat)
  17. {
  18.   SBUF = dat;
  19.         while(TI==0);
  20.         TI = 0;
  21. //        uart_delay(50);
  22. }

  23. void main()
  24. {        int j=100;
  25.         uart_init();
  26.         while(1)
  27.         {

  28.         uart_txdat('s');
  29.         uart_txdat(((P0&0xf0)>>4)+48);
  30.         uart_txdat((P0&0x0f)+48);                       
  31.         uart_txdat(((P1&0xf0)>>4)+48);
  32.         uart_txdat((P1&0x0f)+48);
  33.         uart_txdat(((P2&0xf0)>>4)+48);
  34.         uart_txdat((P2&0x0f)+48);
  35.         uart_txdat(((P3&0xf0)>>4)+48);
  36.         uart_txdat((P3&0x0f)+48);
  37.          for(j=5;j>0;j--)
  38.         uart_delay(30000);
  39.         }


  40. }

复制代码

同时,编译一下程序下载到EVB-335,该程序的功能为:接收51单片机传来的信息,并将它通过其他串口发送给另外的终端,同时,将接收到的信息写入对应文件,方便使用。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<malloc.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<fcntl.h>
  7. #include<unistd.h>
  8. #include<termios.h>

  9. #define max_buffer_size 9

  10. int main()
  11. {
  12.         char fd=-1,ffd=-1,fdt=-1;
  13.         volatile char j=0,ret=0;
  14.         char buff[max_buffer_size];
  15.         struct termios opt,opt_tem;
  16.        
  17.         while(1)
  18.         {
  19.                  fd=-1,ffd=-1,fdt=-1;
  20.                 opt = opt_tem;
  21.                 fd=open("/dev/ttySAC3",O_RDWR);  //′ò?aμúò???′??ú
  22.         if(fd<0)
  23.         {
  24.                 printf("dev1 open error!");
  25.                 return 0;
  26.         }
  27.                 fdt=open("/dev/ttySAC0",O_RDWR);  //′ò?aμú?t??′??ú
  28.         if(fdt<0)
  29.         {
  30.                 printf("dev2 open error!");
  31.                 close(fd);
  32.                 return 0;
  33.         }
  34.         ffd=open("/file/info.txt",O_RDWR,0664);//′ò?a???t
  35.         if(ffd<0)
  36.         {
  37.                 printf("info.txt file open failed!");
  38.                 close(fd);
  39.                 close(fdt);
  40.                 return 0;
  41.         }
  42.         tcgetattr(fd,&opt);
  43.         tcgetattr(fdt,&opt);
  44.         cfmakeraw(&opt);
  45.         cfsetispeed(&opt,B9600);
  46.         cfsetospeed(&opt,B9600);
  47.         tcsetattr(fd,TCSANOW,&opt);
  48.        
  49.         printf("reday receiving data####\n");
  50.        
  51.                 for(j=0;j<max_buffer_size;j++)
  52.                          {
  53.                 *(buff+j) = '\n';        //?aè·±£3é1|?óê?êy?Y£??óê????°£??è???àó|?o′???
  54.                          }
  55.                 read(fd,buff,sizeof(char));  //2é?ˉ?????ú×′ì?£??óê?μ??aê??üá?oó?aê??óê?oí′|àíêy?Y
  56.                  if(buff[0] == 's')
  57.                  {
  58.           for(j=1;j<max_buffer_size;j++)
  59.                          {
  60.                 *(buff+j) = '\n';        //?aè·±£3é1|?óê?êy?Y£??óê????°£??è???àó|?o′?????
  61.                 read(fd,buff+j,sizeof(char));//?óê?êy?Y
  62.                                  printf("receiv success,char is %c,j value %d\n",buff[j],j);
  63.                          }
  64.                
  65.    if(*(buff+j-1) != '\n')
  66.          {
  67.                 //printf("receiv success,string is %s\n",buff);
  68.                  for(j=0;j<max_buffer_size;j++)
  69.                  write(fdt,buff+j,sizeof(char));//???óê?μ?μ?êy?Y·¢?í???í?§?ú
  70.                  lseek(ffd,0,SEEK_SET);  //???t?¨??
  71.                  ret = write(ffd,buff+1,strlen(buff)-1);//???óê?μ?μ?êy?Y±£′?μ??÷?ú???t??ó|????
  72.                          close(fd);
  73.      close(fdt);
  74.      close(ffd);
  75.                 sleep(1);
  76.                 // if(ret)
  77.                 //break;
  78.          }
  79.        
  80.    }
  81.    
  82. }

  83. return 0;
  84.        
  85. }

复制代码

值得注意的是,如果要使用51单片机的P0口,是需要接上拉电阻的,我的这次实验是没有接上拉电阻,所以P0口也是不能作为输入口使用的。

好东西,谢谢分享,顶!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top