求STC5A60S2单片机的第二串口应用发送数据的一个小程序,谢谢

求STC5A60S2单片机的第二串口应用发送数据的一个小程序,谢谢,第1张

以下是宏晶用于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++);         //发送当前字符

    }

首先,串口调试软件的波特率最好设置成9600,这种波特率也支持显示中文的,

USB转串口看你用的什么芯片,经过实验采用CH340或是341的是没有问题的,其他还有待验证。

串口调试软件也很重要,有些软件会奇怪出现乱码,但并不是程序错误,推荐你用小丁的sscom32,个人感觉很棒! ;

; 程序名称:单片机串口发送中文字符实验,232通信程序

; 硬件说明:打开《串口调试助手》,波特率设为9600速率,110592晶体

; 注 意:《串口调试助手》要设置好COM号(请核对是否和设备管理器的COM编号一致)

; *** 作说明:下载程序后打开串口调试助手sscom32exe即可显示,或按一下复位开关

;/

ORG 0000H

AJMP main

ORG 0030H

main: MOV 20H,#00H

MOV TMOD,#22H ;定时器工作方式

MOV SCON,#40H

MOV TH1,#0FAH ;波特率9600

MOV PCON,#80H

SETB TR1

SETB REN ;允许接收

ajmp start

start: mov dptr,#num ;查表

send : clr a ;

movc a,@a+dptr

cjne a,#'$',send_2

ajmp $ ;遇到$停止。

send_2:mov sbuf,a

JNB TI,$ ;串行发送一帧结束了吗?

CLR TI ;

inc dptr ;指针加一

Ljmp send

num:

db 0dh,0ah,0dh,0ah,"XY900_USB型单片机学习板USB-232串口中文发送试验 >

/   甲机串口程序:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。/

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K1=P1^7;

uchar Operation_No=0;  // *** 作代码

//数码管代码

uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延时

void DelayMS(uint ms)

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//向串口发送字符

void Putc_to_SerialPort(uchar c)

{

SBUF=c;

while(TI==0);

TI=0;

}

//主程序

void main()

{

LED1=LED2=1;

P0=0x00;

SCON=0x50;         //串口模式1,允许接收

TMOD=0x20;        //T1工作模式2

PCON=0x00;         //波特率不倍增

TH1=0xfd;

TL1=0xfd;

TI=RI=0;

TR1=1;

IE=0x90;        //允许串口中断

while(1)

{

DelayMS(100);

if(K1==0)      //按下K1时选择 *** 作代码0,1,2,3

{

while(K1==0);

Operation_No=(Operation_No+1)%4;

switch(Operation_No)    //根据 *** 作代码发送A/B/C或停止发送

{

case0:     Putc_to_SerialPort('X');

LED1=LED2=1;

break;

case1:     Putc_to_SerialPort('A');

LED1=~LED1;LED2=1;

break;

case2:     Putc_to_SerialPort('B');

LED2=~LED2;LED1=1;

break;

case3:     Putc_to_SerialPort('C');

LED1=~LED1;LED2=LED1;

break;

}

}

}

}

//甲机串口接收中断函数

void Serial_INT() interrupt   4

{

if(RI)

{

RI=0;

if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];

elseP0=0x00;

}

}

/ 乙机程序接收甲机发送字符并完成相应动作:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。/

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K2=P1^7;

uchar NumX=-1;

//延时

void DelayMS(uint ms)

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//主程序

void main()

{

LED1=LED2=1;

SCON=0x50;         //串口模式1,允许接收

TMOD=0x20;        //T1工作模式2

TH1=0xfd;            //波特率9600

TL1=0xfd;

PCON=0x00;         //波特率不倍增

RI=TI=0;

TR1=1;

IE=0x90;

while(1)

{

DelayMS(100);

if(K2==0)

{

while(K2==0);

NumX=++NumX%11;   //产生0~10范围内的数字,其中10表示关闭

SBUF=NumX;

while(TI==0);

TI=0;

}

}

}

void Serial_INT() interrupt 4

{

if(RI)      //如收到则LED则动作

{

RI=0;

switch(SBUF)//根据所收到的不同命令字符完成不同动作

{

case'X':   LED1=LED2=1;break;          //全灭

case'A':   LED1=0;LED2=1;break;       //LED1亮

case'B':   LED2=0;LED1=1;break;       //LED2亮

case'C':   LED1=LED2=0;                  //全亮

}

}

}

以上就是关于求STC5A60S2单片机的第二串口应用发送数据的一个小程序,谢谢全部的内容,包括:求STC5A60S2单片机的第二串口应用发送数据的一个小程序,谢谢、求RS232串口通信程序(C语言版)、两片单片机通过串口一发一收的C语言例程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存