STC15系列单片机 串口2发送程序

STC15系列单片机 串口2发送程序,第1张

串口1响应中断

将串口1接收寄存器中的数据放到内存中

退出串口1中断

将内存中的数据通过串口2发送寄存器发出去

可以的,你可以用三菱PLC的专用协议配合STC程序通过串口通讯。或用自由协议,自由协议比较复杂,但STC那边实现起来比较简单直接用串口按规则把电位器的值发送出来,在PLC这边写程序接收解析,PLC这边比较复杂,需要一定的编程功底。

具体的PLC专用协议,自由协议参考你可以去三菱官网下载电子档说明书,以上2种协议我都成功应用在设备上。

(需要外扩通讯板。)

优缺点:PLC专用协议STC那边需要遵守PLC固定的数据格式比如0530304646(WW指令)相对PLC那边就简单的多,因为数据直接写到了指定的寄存器内(如D,M等),可以直接使用。

PLC自由协议STC按照普通的串口发送数据方式按自己固定的格式将AD数据发送,PLC这边程序比较复杂,需要理解PLC的自由协议写法(如RS指令)并利用一定的算法将数据还原并保存到寄存器内。

stc单片机支持串口isp程序下载,不必使用专用下载器,仅使用串口就能下载程序

STC单片机内负责ISP的程序是固化的,上电以后,只在厂家指定的串口上开放ISP功能,所以你修改的程序很可能没有在上电后被执行。除非你能确定,厂家固化的这段程序区域是你可以自行修改的,并能保证修改的正确性,你就可以换自己的ISP程序,使用任意串口进行工作,否则就只能在单片机退出厂家ISP程序之后,自己编写自己的ISP程序,这样就是随心所欲的了。

/ 这个STC-ISP带这个工具的,我一般也就用这个,下面供参考/

void UartInit(void) //9600bps@110592MHz

{

S2CON = 0x50; //8位数据,可变波特率

AUXR |= 0x04; //定时器2时钟为Fosc,即1T

T2L = 0xE0; //设定定时初值

T2H = 0xFE; //设定定时初值

AUXR |= 0x10; //启动定时器2

}

以下是宏晶用于STC15F4K60S4 系列的串口2代码示例,根据经验很可能可以用于STC12C60S2单片机,但未亲手验证

/---------------------------------------------------------------------/

/ --- STC MCU Limited ------------------------------------------------/

/ --- STC15F4K60S4 系列 定时器2用作串口2的波特率发生器举例------------/

/ --- Mobile: (86)13922805190 ----------------------------------------/

/ --- Fax: 86-755-82905966 -------------------------------------------/

/ --- Tel: 86-755-82948412 -------------------------------------------/

/ --- Web: 

 --------------------------------------------/

/ 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   /

/ 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序   /

/---------------------------------------------------------------------///本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译

//假定测试芯片的工作频率为18432MHz#include "reg51h"

#include "intrinsh"typedef unsigned char BYTE;

typedef unsigned int WORD;#define FOSC 18432000L          //系统频率

#define BAUD 115200             //串口波特率#define NONE_PARITY     0       //无校验

#define ODD_PARITY      1       //奇校验

#define EVEN_PARITY     2       //偶校验

#define MARK_PARITY     3       //标记校验

#define SPACE_PARITY    4       //空白校验#define PARITYBIT EVEN_PARITY   //定义校验位sfr AUXR  = 0x8e;               //辅助寄存器

sfr S2CON = 0x9a;               //UART2 控制寄存器

sfr S2BUF = 0x9b;               //UART2 数据寄存器

sfr T2H   = 0xd6;               //定时器2高8位

sfr T2L   = 0xd7;               //定时器2低8位

sfr IE2   = 0xaf;               //中断控制寄存器2#define S2RI  0x01              //S2CON0

#define S2TI  0x02              //S2CON1

#define S2RB8 0x04              //S2CON2

#define S2TB8 0x08              //S2CON3sfr P_SW2   = 0xBA;             //外设功能切换寄存器2

#define S2_S0 0x01              //P_SW20bit busy;void SendData(BYTE dat);

void SendString(char s);void main()

{

    P_SW2 &= ~S2_S0;            //S2_S0=0 (P10/RxD2, P11/TxD2)

//  P_SW2 |= S2_S0;             //S2_S0=1 (P46/RxD2_2, P47/TxD2_2)#if (PARITYBIT == NONE_PARITY)

    S2CON = 0x50;               //8位可变波特率

#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)

    S2CON = 0xda;               //9位可变波特率,校验位初始为1

#elif (PARITYBIT == SPACE_PARITY)

    S2CON = 0xd2;               //9位可变波特率,校验位初始为0

#endif    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值

    T2H = (65536 - (FOSC/4/BAUD))>>8;

    AUXR = 0x14;                //T2为1T模式, 并启动定时器2

    IE2 = 0x01;                 //使能串口2中断

    EA = 1;    SendString("STC15F2K60S2\r\nUart2 Test !\r\n");

    while(1);

}/----------------------------

UART2 中断服务程序

-----------------------------/

void Uart2() interrupt 8 using 1

{

    if (S2CON & S2RI)

    {

        S2CON &= ~S2RI;         //清除S2RI位

        P0 = S2BUF;             //P0显示串口数据

        P2 = (S2CON & S2RB8);   //P22显示校验位

    }

    if (S2CON & S2TI)

    {

        S2CON &= ~S2TI;         //清除S2TI位

        busy = 0;               //清忙标志

    }

}/----------------------------

发送串口数据

----------------------------/

void SendData(BYTE dat)

{

    while (busy);               //等待前面的数据发送完成

    ACC = dat;                  //获取校验位P (PSW0)

    if (P)                      //根据P来设置校验位

    {

#if (PARITYBIT == ODD_PARITY)

        S2CON &= ~S2TB8;        //设置校验位为0

#elif (PARITYBIT == EVEN_PARITY)

        S2CON |= S2TB8;         //设置校验位为1

#endif

    }

    else

    {

#if (PARITYBIT == ODD_PARITY)

        S2CON |= S2TB8;         //设置校验位为1

#elif (PARITYBIT == EVEN_PARITY)

        S2CON &= ~S2TB8;        //设置校验位为0

#endif

    }

    busy = 1;

    S2BUF = ACC;                //写数据到UART2数据寄存器

}/----------------------------

发送字符串

----------------------------/

void SendString(char s)

{

    while (s)                  //检测字符串结束标志

    {

        SendData(s++);         //发送当前字符

    }

那个串口助手只能调一般的程序,有的汉字显示不了。

串口调试助手使用说明

为简单明了,有些不言自明的功能不作介绍。

1 串口调试助手

11 设置串口参数:

串口号:1-16

波特率:600-256000,>115200 时需要硬件支持。

2 接收区/键盘发送区

21 接收数据

a) 设置串口参数

b) 如果要按十六进制形式显示接收数据,将十六进制显示选项选中。

c) 点击打开/关闭串口区中的打开串口按钮。

22 显示接收数据的长度

因某些限制,显示接收数据的文本不能太长,所以当显示文本长度快达到 62K 时会自动将显示文本删减到 32K,此时文本可保留 32K 的字符或约 10K 的十六进制数据显示。

23 在键盘上发送英文字符

a)在接收区/键盘发送区的输入框中用鼠标点一下。

b)在键盘按下按键立刻发送。

在这里不能发送回车换行,也不能发送汉字,若要发送请在单字符串发送区发送。

3 发送数据

可以发送单字符串,多字符串(字符串序列)或直接在键盘上发送英文字符。有两种发送数据格式,一种是普通的字符串,另外一种是十六进制数据即 HEX 格式数据。发送 HEX 格式数据时要在字符串输入区中输入 HEX 格式字符串,并且要将相应区内的十六进制发送选项选中。

例:HEX 格式数据字符串 12 34 AB CD FF

31 单字符串发送区

311自动发送,自动发送周期:

此项功能可以每隔一段时间反复地自动发送输入框中的数据,点击自动发送按钮后即启动自动发送功能。

自动发送周期最大为 65535mS。

32 多字符串发送区

在多字符串发送区可以发送一个字符串,或者自动地、依次发送所有的字符串。

请把鼠标移到“接收区/键盘发送区”和“多字符串发送区”之间,当鼠标形状发生变化时按下鼠标器的左键不松开,然后移动鼠标,将“多字符串发送区”的宽度调宽一些,让“间隔时间”显露出来。

321发送一个字符串

a) 输入字符串。

b) 如果要发送 16 进制数据, 要先在字符串后的 HEX 选项框中打上对勾。

c) 点击发送按钮。发送后,按钮上的数字作为当前字符串序号保存起来,此序号在自动循环发送中要用到它。

322 发送多个字符串(字符串序列)

a) 输入多个字符串。

b) 如果要发送 16 进制数据, 将相应的 HEX 选项打上对勾。

c) 输入间隔时间,最大为 65535mS。

d) 点击自动循环发送按钮。

延时时间到达后发送当前字符串( 见321的步骤 c) )的下一个字符串,间隔一段时间后再发送下一个。发送完毕自动从头开始继续发送。

4 打开/关闭串口区

下载后打开串口选项:选中这选项后,每次下载后会自动打开调试助手指定的串口,接收应用程序发送的数据。

下载后出现“无效的端口号”时,您可能会有莫名其妙的感觉,此时要重新选择串口调试助手指定的串口,或将这选项的对勾去掉。

5 “收缩主窗体”按钮

若您想使用两个串口调试助手时,可以另外打开一个下载程序,但本程序的窗体显然太大,使用起来不方便。如果您点击一下“收缩主窗体”按钮,就可以在显示屏上同时放下两个串口调试助手。

STC的程序下载实际上就是串口下载,并不是直接通过USB进行的,而是很多电脑没有RS232串口,即使有串口也不如USB方便,因此才使用那种东西来下载的,我在实验室用台式机从来都是直接用主板的RS232接口下程序,比USB的转换器稳定多了。

USB转TTL实际上就是USB转232。

RS232的电平标准与单片机的TTL电平并不兼容,因此需要使用转换电路来连接,常用就是MAX232了。

这是我写的模拟程序,只有一个发送函数和一个接收函数,EP为接收标志位,发送没有标志位,通过外部中断来发送起始信号,无应答与非应答,无结束信号,实测可以正常收发数据

#ifndef _IOPORTSEND_H__

#define _IOPORTSEND_H__

#include<reg52h>

unsigned char DAT,EP=0;//可以把DAT当作串口中的SBUF,主机发送完后接收机从DAT提取数据

sbit flag = P3^3;//外部中断口

sbit ok = P2^7;//起始信号发送口

sbit PCL = P2^6;//时钟线

sbit PDA = P2^5;//数据线

void delay() //延时函数控制波特率

{

unsigned char a,b;

for(b=3;b>0;b--)

for(a=13;a>0;a--);

}

void PortInit()//中断配置

{

EA=1;

EX1=1;

IT1=1;

}

void SendPort(unsigned char dat)//发送函数

{

unsigned char i;

PCL=0;

ok=1;//通过ok来启动接收机的中断

ok=0;

for(i=0;i<8;i++)//开始发送数据

{

PCL=0;

delay();

if(dat&0x80)

PDA=1;

else

PDA=0;

PCL=1;

delay();

dat<<=1;

}

PCL=0;

delay();

ok=1;//ok置1以便下次发送时启动中断

PCL=1;//发送完毕释放时钟线与数据线

PDA=1;

}

void ReadPort()interrupt 2//接收函数,在中断函数中接收数据

{

unsigned char i;

static unsigned int b;

PCL=1;

PDA=1;//防止接收机的PCL口和PDA口影响数据的接收

for(i=0;i<8;i++)//开始接收数据

{

DAT<<=1;

while(PCL==0);

b=0;

while(PCL==1)

{

b++;

if(b==1)

if(PDA)

DAT|=0x01;

}

}

EP=1;//接收完毕后置EP为1,需要在其他函数中清零

}

#endif

以上就是关于STC15系列单片机 串口2发送程序全部的内容,包括:STC15系列单片机 串口2发送程序、用三菱编程指令,STC单片机上的模拟电位器数据如何采集、stc能用串口透传下载吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10205766.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存