精华内容
下载资源
问答
  • #define length 0x0F #define length 0x0F //数据包长度 基于 基于Java语言的51单片机串口通讯 PC机程序 1 硬件部分 KeilC 图 1 硬件电路图 串口通讯硬件部分电路收发器件采用 max2325V 供电 J31一单片机如 AT89C...
  • 调试一个简单的串口协议,当单片机收到串口发送的数据,解析数据无误后向串口回发一字节数据0x01,且只是发送一次,但串口助手不停得接收到0x0![图片说明]...
  • 单片机串口接收数据发送数据程序源代码,我学习单片机时参考过的 ,还不错
  • 430单片机与电脑通信的例子这个是小弟电脑上多年的陈年老底儿了 今天晒出来
  • PC单片机串口通信

    2014-02-25 11:22:52
    本程序是用labview编写的PC单片机串口通信程序。
  • 单片机串口仿真mcu_pc,比赛练习案例,仿真实例,现成调用封装使用,可运行的仿真电路图和调好的程序,开箱即用。适用于教学案例、毕业设计、电子设计比赛、出书项目实例,实际设计、个人DIY参考。 已调试好,...
  • PC单片机 串口通信 VB MSComm控件
  • 该整套系统采用单片机采集温度,通过串口大师查看当前的温度,C语言编程新的串口通讯编程思路,简单明了,设置了报警温度值,人性的人机界面。包括软件也在内。。绝度经典(原创)
  • 51单片机串口PC通信

    2013-05-25 09:33:00
    我将串口单片机mcu上的RXD和TXD的导线断开并短时,通过串口助手可以看到发送的数据正确接收-----说明串口硬件接线没什么问题。只要连上MCU,立马就LED灭灯,MCU不工作。。。测试单片机电压只有2.5V左右。这是...
  • PC单片机串口通讯

    2013-10-31 11:34:36
    用PIC写的串口通讯,规约为ModBus,能实现PC机跟单片机的通讯
  • 单片机串口调试工具 用于像PC机发送接收数据的软件 串口调试工具 串口数据发送与接收 工具
  • vb 完整的pc机与单片机串口通信程序代码
  • 随着单片机技术的成熟,单片机异步串行通信已经广泛应用于点对点通信以及单片机PC机的通信中。 串行通信虽然有其自身优点:如适合长距离通信,有一定的纠错能力等,但并行通信在短距离(数米范围内)传输过程中的...
  • STC单片机双串口通信,PC串口调试程序。
  • 关于PC机与51单片机串口通信的VC串口通信实例
  • 文章详细介绍了如何配置开发环境以及使用Java串口API函数编写PC机程序。本程序比使用C++语言编写的串口通讯程序更容易理解,且移植性非常强,视图与控制分开,便于维护和升级。 关键字:Java,JBuilder,KeilC,...

    摘要:由于Java语言的诸多优点,Java得到了广泛的应用,如今利用Java开发串口通讯已相当成熟,实现简单,可移植性强。文章详细介绍了如何配置开发环境以及使用Java串口API函数编写PC机程序。本程序比使用C++语言编写的串口通讯程序更容易理解,且移植性非常强,视图与控制分开,便于维护和升级。


    关键字:JavaJBuilderKeilCJava Communications API,串口通讯,RS232,单片机


     


     


    硬件部分(KeilC


    点击看大图



    硬件电路图


    串口通讯硬件部分电路,收发器件采用max2325V供电。J31接一单片机如AT89C52,单片机的串口与max2321011脚相连。


    max232与微机通过9针接头相连。


    本文的实验环境是AT89C52,单片机的内部程序是用KeilC语言编写的,程序功能非常简单,检测到开始信号后从串口读数据,然后把读入的数据发送给串口,遇到结束符停止。C语言代码如下供大家参考。在uv3中含有两个文件comm.hcomm.c,代码分别为:


    /********************************************************/


    /* comm.h                                               */


    /* serial port define, only use in comm project                          */     


    /********************************************************/


    #define uchar  unsigned char


    #define uint    unsigned int


    #define length 0x0F       //数据包长度


     


    uchar      CR          = 0x0D;


    uchar      LF          = 0x0A;


    uchar      ESC        = 0x1B;


    uchar      SYNC     = 0x01;   //数据包启始符


    uchar      PID        = 0x00;   //数据包标示字


    uchar      ADDR;                  //串口接收外部命令(片内地址)


    uchar      DATA;                   //串口返回片内数据


    uchar      ENDP     = 0x00;   //数据包结束符


    uchar      ACK              = 0x06;   //串口确认


    uchar      ERROR   = 0x18;   //串口错误


     


    uchar      wrong[] = "Bad command";


    /*END*/


    /*******************************************************/


    /*comm..c                                            */


    /* Write time is 2005.4.15,By Gooseli                  */


    /* Copyright is changsha HUNU unversity gooseli.com          */


    /* Cpu is At89C51,Fclk is 11.059MHz                                 */


    /* Compiler is keilC51 compiler                                           */


    /*******************************************************/


     


    #include<stdio.h>


    #include<string.h>


    #include<reg51.h>


    #include<comm.h>


     


     


    void commInit(){


    //**************************//


    // 8051串口初始化                     //


    //**************************//


           SCON    = 0x52;


           PCON    = 0x80;


     


           TMOD   = 0x21;


           TH1      = 0x0FA;


           TL1       = 0x0FA;


           TCON    = 0x40;


    //*****************************************************//


    // 串口控制器工作于方式18位,频率可变。接收允许      //


    // 串口波特率系数SMOD = 1                                              //


    // 定时器1工作于方式18位自动装载。定时器0方式116 //


    // 11.059M晶振,波特率 = 9600TH1 = 0x0FA;            //


    //                      19200           0x0FD             //


    //                      57600              0x0FF                //


    // 3.6864M晶振                   9600            0x0FE             //


    //                                        19200            0x0FF                    //


    // #3.6864M晶振工作于方式2                                                 //


    // #SMOD = 1时,波特率 = 115200                      //


    // 开中断TR1 = 1                                       //


    //*****************************************************//


    }


     


     


    uchar flag;


    uchar readln();


    void println( uchar *str );


     


    main(){  


     


        commInit();                                             //初始化串口


           while(1){


                  flag = readln();


           }


    }


     


    uchar readln(){


           uchar      a;


           uchar      str[length];


           int i;


     


           scanf("%c",&a);                                     //寻找起始符,回车则开始


           if( a==SYNC || a==LF ){


                  while(1){


                         printf("\n>>");


                         //printf(">>");


                         scanf("%c",&a);


                         if( a==ENDP || a == ESC ){  //如果ESC则对话结束


                                break;    


                         }


                         for( i="0"; i<length-1 && a!=CR && a!=LF; i++ ){


                                                                          //读入数据包,如果溢出或者回车则结束


                                str[i] = a;


                                scanf("%c",&a);


                         }


                         str[i] = ENDP;                            //为数据包添加结束符,“\0


                         printf("%s",str);                 //输出输入值


                        


                         /*To do something by yourself*/


                  }


                  return ACK;


           }


           printf("\n%s\n>>",wrong);


     


           return ERROR;     


    }


    /*END*/


    配置运行环境JDK


    Java通讯库函数Java Communications APIJava开发工具JBuilderX


    Java(TM) Communications API Specification 2.0(Windows Platform)Sun公司为Windows平台提供的一个串口API扩展,可以到 http://java.sun.com/products/javacomm/ 下载。Sun公司还提供了其他操作系统下的API下载,移植性是Java先天的优势,如果需要在其他操作系统运行程序,不需要改动程序本身,只要在操作系统下植入相应的API库函数即可实现。


    JBuilderBorland公司出品的一款功能强大的可视化Java集成开发工具,可以快速开发包括复杂企业级应用系统的各种Java程序,本文的程序都用其实现。当然我们以可使用其他优秀的开发工具,例如开放源代码的Eclipse,功能强大,插件丰富。


    在下载Java Communications API压缩文件里找到三个文件:comm.jarwin32comm.dlljavax.comm.properties,这三个文件是把API安装到Windows环境中的重要文件,我们把他们放在我们的JDK里面。


    comm..jar复制到%JAVA_HOME%\jre\lib\extjavax.comm.properties复制到%JAVA_HOME%\jre\libwin32comm.dll复制到%JAVA_HOME%\bin即可。这样我们的程序就可以在Windows环境中运行了,Java Communications API压缩文件中自带有例子,我们可以尝试一下。


    接下来我们要把Java Communications API安装到JBuilder里面,如果JBuilder不是使用的外部的JDK,照上面的的步骤再做一次。假如我们外部的JDKJBuilderJDK是同一的JDK,我们就直接跳到下一步。


     


    1)打开JBuilder,为我们的任务建立一个工程,给它起个有意义的名字,不多讲了。JBuilder会自动生成两个文件,如,工程名为comm,就会生成文件commApplicationcommFrame


    2)选择Tools菜单,选择Configure Libraries…,如图1所示。


    3)点击New按钮,为JBuilder增加一个函数库。如图2,点击OK即可。


    4)下一步为你的工程增加这个库函数,以便你在工程里调用它们。选择Project菜单中的Project Properities选项,左侧选中Paths,右侧选中Required Libraries,单击Add,出现一个小的对话框,选择我们刚才增加的comm函数库,如图3,点击OK两次即可。


    现在环境已经配置好了,我们要开始正式工作了。点击看大图



    2 Configure Library



    点击看大图


    2 New Librariy Wizard



    点击看大图3 Select comm. Library


     


    程序开发JBuilderX


     


    1.  51单片机交互信息,数据库存取(Data


    为了保证数据传输的顺利进行,单片机与PC之间通讯要建立一个协议,在本实例中,采用如下协议:


    程序打开串口后,程序发送启始符(0x01)表示通讯开始。


    通讯开始后,程序就开始发送和接收数据包,数据包以结束符(0x000x0D, 0x0A)表示结尾。由于单片机受控于PC机,所以单片机一般不主动发送数据,只有在PC机发送一个命令,它才会发送一个回应


    如果程序停止符(0x00),则通讯结束。


    2.  界面设计(View


    这部分设计主程序的视图,即使用者看到的部分,包括按钮,下拉菜单,文字编辑框等。


    为了程序的可读性,我们将所有的视图从主程序中分离出来,作成Bean的形式,然后在主程序中调用它们。Java提供了五种布局管理形式FlowLayout,GridLayout GridBagLayout BorderLayout,CardLayout。灵活的运用这些布局,可以达到各种各样的效果,其中GridBagLayout功能强大,使用灵活,本文主要采用这种布局。


    3.  主程序设计(Control


    这部分设计程序的实现方法,逻辑步骤。


    1)首先定义串口,输入输出流等,如下所示:


    package comm;


     


    import java.awt.*;


    import java.awt.event.*;


    import javax.swing.*;


    import javax.comm.*;//包含comm类包,才能使用其API函数


    import java.io.*;


    import java.util.*;


     


    public class CommFrame extends JFrame implements Runnable, SerialPortEventListener {


      JPanel contentPane; //定义一个JPanel,将视图Bean包含进来


      BorderLayout borderLayout1 = new BorderLayout();


      IOBean ioBean = new IOBean();//右侧视图Bean类事例化


      ControlBean controlBean = new ControlBean();//左侧视图Bean类事例化


     


      //Communination define


      static CommPortIdentifier portName;//定义串口


      int portId;


      static Enumeration portList;


      InputStream inputStream;//定义输入流


      OutputStream outputStream;//定义输出流


      SerialPort serialPort;


      Thread readThread;//定义一个线程,程序全双工通讯


      static String TimeStamp;


     


     


      //Construct the frame


      public CommFrame() {


        enableEvents(AWTEvent.WINDOW_EVENT_MASK);


        try {


          jbInit();//程序初始化


          commInit();//串口初始化


        }catch(Exception e) {


          e.printStackTrace();


        }


      }


     


    private void jbInit() throws Exception  {……}


    public void commInit() {……}


    public void commClose() {……}


     


    public void commWrite() {……}


    public void CommRead() {……}


    public void run() {……}


    public void serialEvent(SerialPortEvent event) {…….}//代码如下


     


     


    //Overridden so we can exit when window is closed


      protected void processWindowEvent(WindowEvent e) {


        super.processWindowEvent(e);


        if (e.getID() == WindowEvent.WINDOW_CLOSING) {


          commClose();


          System.exit(0);


        }


      }


    }


    2)串口初始化,首先监测串口是否被占用,如果没有被占用则打开串口。打开输入输出流以便下面的程序从串口读写数据,定义串口的波特率,位数,停止位,奇偶校验,在使用过程中可以改变这些内容以适应不同的需求。


    public void commInit() {


        //Communination ports owned or not


        portId = 1;


        try{


          portList = CommPortIdentifier.getPortIdentifiers();


          while (portList.hasMoreElements()) {


            portName = (CommPortIdentifier) portList.nextElement();


            if (portName.getPortType() == CommPortIdentifier.PORT_SERIAL) {


              if (portName.isCurrentlyOwned()) {//串口是否被占用


      ioBean.Receiver.append("\nCOM"+portId+"Ownedby"+ portName.getCurrentOwner());


                TimeStamp = new java.util.Date().toString();


                portId ++;


              }else if (portName.getName().equals("COM" + portId)) {


                break;


              }


            }


          }


          //Communination ports init


          try {


      serialPort = (SerialPort) portName.open("Gooseli_MCU_Control_App", 2000);//打开串口


            controlBean.CommPortID.setText("COM" + portId);


            controlBean.OnOff.setText("ON");//开关按钮置开状态


            controlBean.OnOff.setSelected(true);


            TimeStamp = new java.util.Date().toString();


      System.out.println(TimeStamp + ": msg2 - SerialPort COM" + portId + " is opend");


      ioBean.Receiver.append("\nCOM" + portId + " is opend");//显示区域显示串口被打开


          } catch (PortInUseException e) {


            System.out.println(e);


            ioBean.Receiver.append("\nCOM" + portId + " " + e);


          }


          try {


            inputStream = serialPort.getInputStream();//打开输入流


          } catch (IOException e) {}


          try {


            outputStream = serialPort.getOutputStream();


            outputStream.write((byte)0x01);//向串口写入启始符开始传送数据包


            ioBean.Receiver.setText("\nCOM" + portId + ">>" + "Start");


            controlBean.begin.setSelected(true);


          } catch (IOException e) {}


          try {


            serialPort.setSerialPortParams(9600,//波特率


                                           SerialPort.DATABITS_8,//数据位


                                           SerialPort.STOPBITS_1,//停止位


                                           SerialPort.PARITY_NONE);//校验位


          } catch (UnsupportedCommOperationException e) {}


          CommRead();//程序开始从串口读数据


        }catch(Exception e) {}


      }


     


    public void commClose() {


        try {


          inputStream.close();


          outputStream.close();


          serialPort.close();


          System.out.println(TimeStamp + ": msg2 - SerialPort COM" + portId + " is closing");


          ioBean.Receiver.append("\nCOM" + portId + " is closing");


        }catch (Exception e) {


           System.out.println(e);


        }


      }


           3)程序初始化,这里定义了一些事件,以便控制程序的运行。例如开始按钮的事件定义如下:


    private void jbInit() throws Exception  {


        contentPane = (JPanel) this.getContentPane();


        contentPane.setLayout(borderLayout1);


        this.setSize(new Dimension(400, 300));


        this.setTitle("Serial Ports Communication Current");


     


        contentPane.add(ioBean,BorderLayout.CENTER);


        contentPane.add(controlBean, BorderLayout.WEST);


        controlBean.OnOff.addActionListener(


          new ActionListener() {


            public void actionPerformed(ActionEvent ae) {


              JToggleButton toggle = (JToggleButton) ae.getSource();


              if (toggle.isSelected()) {


                controlBean.OnOff.setText("ON");


                commInit();


              } else {


                controlBean.OnOff.setText("OFF");


                commClose();


              }


            }


          }


        );


    controlBean.begin.addActionListener(


                new ActionListener() {


                public void actionPerformed(ActionEvent ae) {


                  JToggleButton toggle = (JToggleButton) ae.getSource();


                  if (toggle.isSelected()) {//如果按钮被按下,则开始


                    controlBean.begin.setText("Start");


                    try {


                      outputStream.write((byte)0x01);//发送起始符


                      ioBean.Receiver.setText("\nCOM" + portId + " " + "Start");


                    } catch (IOException e) {}


                  } else {//如果按纽复位


                     controlBean.begin.setText("Stop");


                     try {


                     outputStream.write((byte)0x00);//发送结束符


                     ioBean.Receiver.append("\nCOM" + portId + " " + "Stop");


                    } catch (IOException e) {}


                  }


                }


              }


    );


        ioBean.jButton2.addActionListener(


          new ActionListener() {


            public void actionPerformed(ActionEvent ae) {


              commWrite();


            }


          }


        );


      }


    4)读写串口,使用多线程,实现全双工通讯。主函数CommFrame实现了Runnable接口,在程序中只需要重写run函数即可实现多线程。


    public void commWrite() {


        String outString = ioBean.jTextField1.getText();


        if (outString.equals("clear")) {


          ioBean.Receiver.setText("\nCOM" + portId +" Receive:");


        }


        ioBean.jTextField1.setText("Gooseli:");


        try {


          //outputStream.write((byte)0x01);


          outputStream.write(outString.getBytes());


          outputStream.write((byte)0x0D);


          //outputStream.write((byte)0x00);


          ioBean.Receiver.setText("\nCOM" + portId + ">>" + outString);


        } catch (IOException e) {}


      }


    public void CommRead() {


        try {


          serialPort.addEventListener(this);


        } catch (TooManyListenersException e) {}


        serialPort.notifyOnDataAvailable(true);


        readThread = new Thread(this);


        readThread.start();


      }


     


      public void run() {


        try {


          Thread.sleep(20000);


        }


        catch (InterruptedException e) {}


      }


     


      public void serialEvent(SerialPortEvent event) {


        switch(event.getEventType()) {


          case SerialPortEvent.BI:


          case SerialPortEvent.OE:


          case SerialPortEvent.FE:


          case SerialPortEvent.PE:


          case SerialPortEvent.CD:


          case SerialPortEvent.CTS:


          case SerialPortEvent.DSR:


          case SerialPortEvent.RI:


          case SerialPortEvent.OUTPUT_BUFFER_EMPTY:


            break;


          case SerialPortEvent.DATA_AVAILABLE:


            StringBuffer readBuffer = new StringBuffer();


            String scannedInput = null;


            int c;


            try {


              while ((c = inputStream.read()) != 0x00 && c != 0x0D && c != 0x0A) {


                readBuffer.append( (char) c);//数据包以回车或者换行表示结束


              }


              scannedInput = readBuffer.toString();


              ioBean.Receiver.append("\n" + scannedInput);


              TimeStamp = new java.util.Date().toString();


              System.out.println(TimeStamp + ": scanned input received:" + scannedInput);


     


              inputStream.close();


            } catch (IOException e) {}


            break;


        }


      }


    4.  测试程序


    程序运行后如图四所示。


    为了方便程序运行,我们作一个批处理文件,和程序生成的jar文件放在一个目录里,这样就可以很方便的在含有Java虚拟机的系统里运行我们的程序了。可以将JBuilder运行窗口(Messages)的信息直接拷贝过来,当然也可以自己建立。


    我的批处理文件如下所示:


    @echo off


    @REM 设置路径包括Java虚拟机和程序jar文件路径


    set path=%JAVA_HOME%\bin


    set classpath=%cd%\comm.jar


    @REM 运行程序,注意在主程序前增加包名,否则找不到主函数


    echo Now initializing the program,please wait a minite...


    java comm.CommApplication



    4 Test my programme


     


    展望


    Java作为一个逐渐成熟的程序设计语言,在网络和嵌入式系统越来越多地得到广泛的应用,但是微机底层程序开发发展缓慢。本文应用Java作为串口上位机程序开发语言,是考虑到Java语言的各种优越性,主要是其平台无关性,强大的可移植性,这一点在不久的将来会受到更多的重视。ln


    展开全文
  • 下面是一个单片机PC机通信的程序,pc机程序用c语言来编写,单片机程序用汇编语言来编写
  • PC 机与单片机串口RS232通信实例,调试时很有用。
  • 使用USB串口线实现单片机PC串口通讯。
  • 2、我设计串口通信是想在PC发送字符'g'后,设置发送标志位,单片机接收到在主函数中调用串口发送程序,但是总感觉效率好低,但是有觉得在中断程序中去调用发送程序会太占用CPU,我想问问有什么好的办法。 3、最后一...
  • 我们采用串行口1编程,主要用到的特殊功能寄存器有:数据缓冲寄存器SBUF、串行口1方式控制寄存器SCON、辅助寄存器AUXR等 两个补充链接; C51中的ABSACC.H介绍...

    我们采用串行口1编程,主要用到的特殊功能寄存器有:数据缓冲寄存器SBUF、串行口1方式控制寄存器SCON、辅助寄存器AUXR等
    两个补充链接;
    C51中的ABSACC.H介绍https://blog.csdn.net/qq_34629988/article/details/53225293.
    51单片机 XBYTE说明https://blog.csdn.net/shenhuxi_yu/article/details/54344362.
    /*******************************************************************************

    • 文件名称:串口通讯实验
    • 实验目的:
    • 1.掌握51单片机串口工作模式及相关寄存器配置方法
      2.了解51单片机波特率的计算方法
    • 程序说明:
      1.通过USB连接线连接PC机,在计算机硬件管理器中查看串口号
      2.打开串口调试工具软件,并将串口通讯波特率设定为2400
    • 硬件说明:IAP15F2K61S2@11.0592MHz
    • 日期版本:2019-2-12/qingyu
      说明因为延时程序有_nop_();函数,代表一个机器周期,所以用到了定时器,需要进行相关的配置,同时用到了串行口1的中断标志位TI,注意辅助特殊功能寄存器AUXR,能够选择定时器的工作模式(1T和12T,这是和普通八位的区别,复位及默认情况下为12T模式,与普通相同),SBUF为串口的发送与接收数据缓冲器。

    *******************************************************************************/

    #include "reg52.h"  
    #include "intrins.h"
    #include "absacc.h"
    #define BAUD	     2400  //波特率
    #define SYSTEMCLOCK  11059200L  //系统时钟频率
    sfr AUXR  = 0x8e;    
    void uart_sendstring(unsigned char *str);
    void delay() //延时函数
    {
    	unsigned char i, j, k;
    	_nop_();//代表一个机器周期													   
    	_nop_();
    	
    	i = 43;
    	j = 6;
    	k = 203;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    //主函数
    void main(void)
    { 
        SCON = 0x50;                 //	串行口1的方式控制寄存器sm0,SM1为工作方式选择位,先择了方式1REN允许接收位,为1有效 ;
        AUXR = 0x40;                //1T选择定时器1的1T模式
        TMOD = 0x00;                // 采用系统时钟作为计数脉冲
        TL1 = (65536 - (SYSTEMCLOCK/4/BAUD)); 		//设置定时初值与终值,为固定模板
        TH1 = (65536 - (SYSTEMCLOCK/4/BAUD))>>8;
        TR1 = 1;    //运行控制位 启动定时器1               
       
        while(1){
    		uart_sendstring("hello,world.\r\n");  //串口发送函数
    		delay();
    	}
    }
    
    //通过串口发送字符串
    void uart_sendstring(unsigned char *str) //指针变量
    {
        unsigned char *p;
        
        p = str;
        while(*p != '\0')
        {
            SBUF = *p; //用作串口1的发送和接受数据缓存器
    		while(TI == 0);  //等待发送标志位置位,TI为串口1的中断标志
    		TI = 0;
            p++;
        }
    }
    

    /*******************************************************************************

    • 文件名称:串口通讯实验
    • 实验目的:
    • 1.掌握51单片机串口工作模式及相关寄存器配置方法
      2.了解51单片机波特率的计算方法
      3.掌握单片机串口接收中断服务函数的设计方法
      程序说明:
      1.通过USB连接线连接PC机,在计算机硬件管理器中查看串口号
      2.打开串口调试工具软件,并将串口通讯波特率设定为2400
      3.将跳线J13配置为IO模式
      4.输入1-8字符,控制8个LED指示灯状态
    • 硬件说明:IAP15F2K61S2 @11.0592MHz
    • 日期版本:2019-2-12/qingyu
      进行串行口1的相关寄存器配置,定时器1的配置,打开串行口中断和总中断 。我们需要定义一个串口的终端服务函数,若PC向单片机发送其他数据时,我们需要它进行向我们发送一段数据表示它受到,因此我们需要定义一个串行口发送数据的函数。最后是构建PC发送不同的数据,单片机会接受并执行对应操作的函数

    *******************************************************************************/

    #include "reg52.h"  //定义51单片机特殊功能寄存器
    #include "absacc.h"
    
    #define BAUD	     2400  		//波特率
    #define SYSTEMCLOCK  11059200L  //系统时钟频率
    
    sfr AUXR  = 0x8e; 
    
    bit rxc = 0;
    char rx = '1';
    void uart_sendstring(unsigned char *str);
    void interrupt_scan();
    
    //主函数
    void main(void)
    { 
        SCON = 0x50;  //串行口1选取工作方式1               
    
        AUXR = 0x40;                //特殊功能寄存器配置成1T模式
        TMOD = 0x00;                //采用系统时钟作为计数脉冲
        TL1 = (65536 - (SYSTEMCLOCK/4/BAUD));   //
        TH1 = (65536 - (SYSTEMCLOCK/4/BAUD))>>8;
        TR1 = 1; //TMOD中的GATE位为0时,打开TR1即可采用定时器1 计数 
    	ES = 1;//打开串行口1 的中断允许位
    	EA = 1;	//打开总中断
    	
        while(1)
        {
    	  interrupt_scan();
        }
    }
    //构建PC发送不同的数据,单片机会接受并执行对应操作的函数
    void interrupt_scan()
    {
    	if(rxc == 1)
    	{
    				rxc = 0;
    				switch(rx)
    				{
    					case '1':
    						P2=0X80;P0=0XFE;
    						break;
    					case '2':
    					    P2=0X80;P0=0xFD;
    						break;
    					case '3':
    						P2=0X80;P0=0xFB;
    						break;
    					case '4':
    						P2=0X80;P0=0xF7;
    						break;
    					case '5':
    						P2=0X80;P0=0xEF;
    						break;
    					case '6':
    						P2=0X80;P0=0xDF;
    						break;
    					case '7':
    						P2=0X80;P0=0xBF;
    						break;
    					case '8':
    						P2=0X80;P0=0x7F;
    						break;
    					default:
    						uart_sendstring("error\r\n");	//输入其他数据返回error
    						break;
    				}
    
    				ES = 1;//再次打开串行口1的中断允许位
    			}
    }
    
    //串口中断服务函数
    void isr_uart(void) interrupt 4
    {
        if(RI)
        {
            RI = 0;  //清除接收中断标志位 除方式0的其他方式下(本程序在SCON中设置SM0,SM1为01,为方式1)
    		        //接受到停止位置1,向CPU发起中断,中断结束后必须由软件置0!!)
            rx = SBUF;//将数据缓存器的数据给rx
    		ES = 0;//关闭串行口1的中断允许位
    		rxc = 1;
    	}
    }
    
    //通过串口发送字符串
    void uart_sendstring(unsigned char *str)
    {
        unsigned char *p;
        
        p = str;
        while(*p != '\0')
        {
            SBUF = *p;
    		while(TI == 0);  //等待发送标志位置位
    		TI = 0;
            p++;
        }
    }
    

    也可采用寄存器编程,将void interrupt_scan()函数修改,同时将开发板的J13接到MM即可

    void interrupt_scan()
    {
    	if(rxc == 1)
    	{
    				rxc = 0;
    				switch(rx)
    				{
    					case '1':
    						XBYTE[0x8000] = 0xFE;
    						break;
    					case '2':
    						XBYTE[0x8000] = 0xFD;
    						break;
    					case '3':
    						XBYTE[0x8000] = 0xFB;
    						break;
    					case '4':
    						XBYTE[0x8000] = 0xF7;
    						break;
    					case '5':
    						XBYTE[0x8000] = 0xEF;
    						break;
    					case '6':
    						XBYTE[0x8000] = 0xDF;
    						break;
    					case '7':
    						XBYTE[0x8000] = 0xBF;
    						break;
    					case '8':
    						XBYTE[0x8000] = 0x7F;
    						break;
    					default:
    						uart_sendstring("error\r\n");	//输入其他数据返回error
    						break;
    				}
    
    				ES = 1;//再次打开串行口1的中断允许位
    			}
    }
    
    
    展开全文
  • pc机与单片机串口通信源代码
  • PC机与单片机串口通信的VB源代码,包括VB界面程序和51单片机程序。
  • 利用SPComm控件实现的PC机与单片机串口通讯、电子技术,开发板制作交流

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,579
精华内容 4,231
关键字:

单片机串口接pc串口