如何将单片机的程序上传到电脑

发布时间: 2023-04-15 13:37 阅读: 文章来源:转载

对于51单片机的串口:从逻辑上来说,SBUF独有一个,它既表示发送寄存器,又表示接管寄存器,具有同一个单元地址99H。但在物理构造上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个相对应的就是接管缓冲寄存器SBUF。假如CPU写SBUF,数据就会被送入发送寄存器准备发送;假如CPU读SBUF,则读入的数据一定来自接管缓冲器。即CPU对SBUF的读写,其实是分别访问上述两个不同的寄存器。 a = SBUF; SBUF = a;也就是说:51单片机的sbuf寄存器是以字节为单位进行接管和发送的,一次只能接管一个字节。

我们整个程序的逻辑就是:

51单片机端每收到一个字节就发送一个字节到电脑。也就是数据全部原样返回。

电脑端是直接调API进行底层的字节数组写入,先写入一堆字符串。然后延500ms,然后再从串口中读取单片机返回的数据。我的猜想是电脑的串口也51单片机的串口应该类似,有专门接管的寄存器或者其它存储格式,然后有个缓冲的字节数组进行字节缓冲。电脑直接从缓冲数组读取过来即可。

然后先来51单片机端的代码:

#include

#define uchar unsigned char

#define uint unsigned int

uchar num;

void UART_init()

{

TMOD = 0x20; //T1工作模2 8位自动重装

TH1 = 0xfd;

TL1 = 0xfd; //比特9600

TR1 = 1;//T1定时器

SM0 = 0;

SM1 = 1; //串口工作方1 10位异步

REN = 1;//串口允许接收

EA = 1;//开总中断

ES = 1;//串口中断打开

}

void main()

{

UART_init(); //串口初始化

while(1);

}

void UART() interrupt 4

{

if(RI)//检测是否接收完成

{

num = SBUF; //num取出接收缓存器的,接收一个字节就发送一个

RI = 0;

SBUF = num;

while(!TI);//装上数据TI0,发送完数据TI1

TI = 0;

}

}

这里是采用中断的方式进行串口通信。串口一收到数据就产生中断,然后进入中断处理函数,先取出接收寄存器里的数据,然后放入发送寄存器里发生。

这里注意单片机端对串口的设置:串口为工作方1,也就10位异步收发器8位数据位,也就是一个字节。专业点就是:一帧数据101位起始位(低电平)8位数据位(低位在前)1位停止位(高电平)。比特率9600.

我们在电脑这边打开电脑的串口的时候,也要这样进行设置串口的参数。不然会出问题。

然后来看电脑这边java代码:

package a51cs.startuse;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import gnu.io.CommPort;

import gnu.io.CommPortIdentifier;

import gnu.io.NoSuchPortException;

import gnu.io.PortInUseException;

import gnu.io.SerialPort;

import gnu.io.UnsupportedCommOperationException;

public class Tools {

/**

*用于打开串口

*

* @param portName

* 串口名

* @param baudrate

* 波特率

* @return返回串口

*/

public static final SerialPort portParameterOpen(String portName, int baudrate) {

SerialPort serialPort = null;

try { //通过端口名识别串口

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

//打开端口并设置端口名 serialPort和超时时 2000ms

CommPort commPort = portIdentifier.open(portName, 1000);

//进一步判comm端口是否是串 instanceof

if (commPort instanceof SerialPort) {

System.out.println("COM端口是串口!串口名称是" + portName);

//进一步强制类型转换

serialPort = (SerialPort) commPort;

//baudrate此处需要注:波特率只能允许int57600足够

// 8位数据位

// 1位停止位

//无奇偶校验

serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

//串口配制完 log

System.out.println("串口参数设置已完成,波特率" + baudrate + ",数据8bits,停止1,无奇偶校");

} else { //不是串口

System.out.println("com端口不是串,请检查设!");

//com端口设置null默认null不需要操作

}

} catch (NoSuchPortException e) {

e.printStackTrace();

} catch (PortInUseException e) {

e.printStackTrace();

} catch (UnsupportedCommOperationException e) {

e.printStackTrace();

}

return serialPort;

}

/**

*发送一个字节数组到串口

*

* @param serialPort

* 串口

* @param dataPackage

* 字节数组

*/

public static void uartSendDatatoSerialPort(SerialPort serialPort, byte[] dataPackage) {

OutputStream out = null;

try {

out = serialPort.getOutputStream(); //socket通信差不多,获取输出流然后调write方法写入字节数组

out.write(dataPackage);

out.flush();

} catch (IOException e) {

e.printStackTrace();

} finally {

//关闭输出非常标准的格式!!!

if (out != null) {

try {

out.close();

out = null;

// System.out.println("数据已发送完!");

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/*

*上位机接收数串口对seriesPort接收数buffer返回一byte数组

*/

public static byte[] uartReceiveDatafromSingleChipMachine(SerialPort serialPort) {

byte[] receiveDataPackage = null;

InputStream in = null;

try {

in = serialPort.getInputStream();

//data buffer数据长度

int bufferLength = in.available();

while (bufferLength != 0) {

receiveDataPackage = new byte[bufferLength];

in.read(receiveDataPackage);

bufferLength = in.available();

}

} catch (IOException e) {

e.printStackTrace();

}

return receiveDataPackage;

}

public static void main(String[] args) throws Exception {

//打开串口

SerialPort serialPort = portParameterOpen("COM3", 9600);

//要发送的数据

String dataSend = "Java51单片机串口通信测";

int i = 1;

while (true) {

//发送数据到单片机

byte[] datByte = dataSend.getBytes();//转化为字节数组,我这边设置了默认utf-8编码

uartSendDatatoSerialPort(serialPort, datByte);

System.out.println("-------------------------------------------------------");

System.out.println((i++) + ".发送到串口的数据" + dataSend);

//500ms,等待单片机反应

Thread.sleep(500);

//从单片机接收到的数据,返回的是一个字节数组

byte[] dat = uartReceiveDatafromSingleChipMachine(serialPort);

if (dat != null && dat.length > 0) {

String dataReceive = new String(dat, "utf-8");//字节数组utf-8编码表编码成字符进行显示

System.out.println((i++) + ".从串口接收的数据" + dataReceive);

} else {

System.out.println("接收到的数据为空");

}

}

}

}

本期先分享到这里,想要进群学习单片机编程的同学可以私信我,回我要入,与我们一起成长,喜欢的可以点个赞关注我们!

•••展开全文
相关文章