STC12C5A60S2之串口

发布者:行者无疆1978最新更新时间:2019-01-26 来源: eefocus关键字:STC12C5A60S2  串口 手机看文章 扫描二维码
随时随地手机看文章

STC12C5A60S2单片机的串口从传统的一个扩展到了两个,


而且还增加了一个独立波特率发生器,把定时器1解放了出来,真的不是一般的方便,


还而且能用1T模式,速度大大滴提高了。。。


于是,就写了串口模块,方便以后用



有关STC12C5A60S2串口的寄存器


 

 

 

UART.C

/*

 * 文 件 名:UART.C

 * 芯    片:STC12C5A60S2

 * 晶    振:12MHz

 * 创 建 者:冷月

 * 创建日期:2010.8.16

 * 修 改 者:

 * 修改日期:

 * 功能描述:STC12C5A系列单片机串口模块,包括串口1和串口2,方式1,使用独立波特率发生器

 * 功能:1.发送一个字符;2.发送一个字符串;3.接收一个字符。

 */


#include

#include

#include "UART.H"


#define uchar unsigned char

#define uint unsigned int


//缓存串口1和串口2接收到的字符

uchar UART1_Recv_Val = 0;

uchar UART2_Recv_Val = 0;



/*

 * 函 数 名:UART1_Init

 * 功能描述:串口1初始化

 * 输入参数:RELOAD:BRT初值;

 * doubleBaud:0波特率不加倍,1波特率加倍

 * timeMod:0独立波特率发生器12T模式,1为1T模式

 * 返 回 值:无

 */

void UART1_Init(uchar RELOAD, bit doubleBaud, bit timeMod)

{

SCON |= 0x50; //串口1方式1,接收充许


BRT = RELOAD; //波特率2400


if (timeMod == 1) //1T

{

//T0x12   T1x12   UM0x6   BRTR    S2SMOD  BRTx12  EXTRAM  S1BRS

AUXR |= 0x15; //串口1使用独立波特率发生器,独立波特率发生器1T

}

else //12T

{

AUXR |= 0x11;

}


if (doubleBaud == 1)

{

PCON |= 0x80;   //波特率加倍

}

else

{

PCON &= 0x7F;   //波特率不加倍

}


EA = 1;

ES = 1; //充许串口1中断

}



/*

 * 函 数 名:UART2_Init

 * 功能描述:串口2初始化

 * 输入参数:RELOAD:BRT初值;

 * doubleBaud:0波特率不加倍,1波特率加倍

 * timeMod:0独立波特率发生器12T模式,1为1T模式

 * 返 回 值:无

 */

void UART2_Init(uchar RELOAD, bit doubleBaud, bit timeMod)

{

//S2SM0  S2SM1   S2SM2   S2REN   S2TB8   S2RB8   S2TI     S2RI

S2CON |= 0x50; //串口2,方式1,接收充许


BRT = RELOAD;


if (timeMod == 1) //1T

{

//T0x12   T1x12   UM0x6   BRTR    S2SMOD  BRTx12  EXTRAM  S1BRS

AUXR |= 0x14; //串口1使用独立波特率发生器,独立波特率发生器1T

}

else //12T

{

AUXR = (AUXR | 0x10) & 0xFB;

}


if (doubleBaud == 1)

{

AUXR |= 0x08; //波特率加倍

}

else

{

AUXR &= 0xF7; //波特率不加倍

}


EA = 1;

//-       -       -       -       -       -       ESPI    ES2

IE2 |= 0x01; //充许串口2中断

}



/*

 * 函 数 名:UART1_SendOneChar

 * 功能描述:串口1发送一个字符

 * 输入参数:val:要发送的字符

 * 返 回 值:无

 */

void UART1_SendOneChar(uchar val)

{

//ES = 0; //关闭串口1中断


SBUF = val;

while(TI == 0);

TI = 0;


//ES = 1;    //恢复串口1中断

}    



/*

 * 函 数 名:UART2_SendOneChar

 * 功能描述:串口2发送一个字符

 * 输入参数:val:要发送的字符

 * 返 回 值:无

 */

void UART2_SendOneChar(uchar val)

{

//IE2 = 0x00;   //关闭串口2中断


S2BUF = val;

while ((S2CON & 0x02) == 0);

S2CON &= 0xFD;


//IE2 = 0x01; //恢复串口2中断

}



/*

 * 函 数 名:UART1_SendStr

 * 功能描述:串口1发送字符串

 * 输入参数:str:指向要发送的字符串的指针

 * 返 回 值:无

 */

void UART1_SendStr(uchar *str)

{

while( (*str)!='/0' )

{

UART1_SendOneChar(*str);

str++;

}

}



/*

 * 函 数 名:UART2_SendStr

 * 功能描述:串口2发送字符串

 * 输入参数:str:指向要发送的字符串的指针

 * 返 回 值:无

 */

void UART2_SendStr(uchar *str)

{

while( (*str)!='/0' )

{

UART2_SendOneChar(*str);

str++;

}

}



/*

 * 函 数 名:UART1_Int

 * 功能描述:串口1中断服务程序,接收串口1字符

 * 输入参数:无

 * 返 回 值:无

 */

void UART1_Int(void) interrupt 4

{

if (RI == 1)

{

RI = 0;

UART1_Recv_Val = SBUF;

}

}



/*

 * 函 数 名:UART2_Int

 * 功能描述:串口2中断服务程序,接收串口2字符

 * 输入参数:无

 * 返 回 值:无

 */

void UART2_Int(void) interrupt 8

{

if ((S2CON & 0x01) == 1)

{

S2CON &= 0xFE;

UART2_Recv_Val = S2BUF;

}

}

UART.H

/*

 * 模 块 名:UART.H

 * 芯    片:STC12C5A60S2

 * 晶    振:12MHz

 * 创 建 者:冷月

 * 创建日期:2010.8.16

 * 修 改 者:

 * 修改日期:

 * 功能描述:STC12C5A系列单片机串口模块,包括串口1和串口2,方式1,使用独立波特率发生器

 * 可设置串口波特率

 * 功能:1.发送一个字符;2.发送一个字符串;3.接收一个字符。

 */


#ifndef _UART_H_

#define _UART_H_


#define uchar unsigned char

#define uint unsigned int


//定义串口1口开关,关闭则不能接收数据

#define OpenUART1() ES=1

#define CloseUART1() ES=0

#define OpenUART2() IE2|=0x01

#define CloseUART2() IE2&=0xFE


//缓存串口1和串口2接收到的字符

extern uchar UART1_Recv_Val;

extern uchar UART2_Recv_Val;



/*

 * 函 数 名:UART1_Init

 * 调    用:UART1_Init(0xD9, 0, 0);

 * BRT=OxD9,波特率不加倍,独立波特率发生器12T模式,Fosc = 12MHz, Baud0 = 9600

 * UART1_Init(0xB2, 1, 1);

 * BRT=0xB2,波特率加倍,独立波特率发生器1T模式,Fosc = 12MHz, Baud0 = 9600

 * 功能描述:串口1初始化

 */

void UART1_Init(uchar RELOAD, bit doubleBaud, bit timeMod);



/*

 * 函 数 名:UART2_Init

 * 调    用:UART2_Init(0xD9, 0, 0);

 * BRT=OxD9,波特率不加倍,独立波特率发生器12T模式,Fosc = 12MHz, Baud0 = 9600

 * UART2_Init(0xB2, 1, 1);

 * BRT=0xB2,波特率加倍,独立波特率发生器1T模式,Fosc = 12MHz, Baud0 = 9600

 * 功能描述:串口2初始化

 */

void UART2_Init(uchar RELOAD, bit doubleBaud, bit timeMod);



/*

 * 函 数 名:UART1_SendOneChar

 * 调    用:UART1_SendOneChar('A');

 * 功能描述:串口1发送一个字符

 */

void UART1_SendOneChar(uchar val);



/*

 * 函 数 名:UART2_SendOneChar

 * 调    用:UART2_SendOneChar('A');

 * 功能描述:串口2发送一个字符

 */

void UART2_SendOneChar(uchar val);



/*

 * 函 数 名:UART1_SendStr

 * 调    用:UART1_SendStr("MCU");

 * 功能描述:串口1发送字符串

 */

void UART1_SendStr(uchar *str);



/*

 * 函 数 名:UART2_SendStr

 * 调    用:UART2_SendStr("MCU");

 * 功能描述:串口2发送字符串

 */

void UART2_SendStr(uchar *str);



#endif

main.c

/*

 * 文 件 名:UART.C

 * 芯    片:STC12C5A60S2

 * 晶    振:12MHz

 * 创 建 者:冷月

 * 创建日期:2010.8.16

 * 修 改 者:

 * 修改日期:

 * 功能描述:单片机通过串口与PC机通讯,通过PC机控制与单片机IO相连的LED灯亮灭

 * 串口1和串口2使用独立波特率发生器,波特率默认设置为9600,波特率不加倍,1T模式

 */


#include

#include

#include "UART.H"


#define uchar unsigned char

#define uint unsigned int



//独立波特率发生器初值,1T模式

//Fosc = 晶振频率, Baud0 = 标准波特率

//RELOAD = 256 - INT(Fosc/Baud0/32 + 0.5)

//Baud = Fosc/(256 - RELOAD)/32

//error = (Baud - Baud0)/Baud0 * 100%

uchar RELOAD = 0xD9; //Fosc = 12MHz, Baud0 = 9600


//波特率是否加倍,0不倍,1加倍

bit doubleBaud = 0;


//独立波特率发生器,0为12T模式,1为1T模式

bit timeMod = 1;



/*LED定义*/

sbit LED1 = P1^0;

sbit LED2 = P1^1;



/*

 * 函 数 名:main

 * 功能描述:程序入口

 * 输入参数:无

 * 返 回 值:无

 */

void main(void)

{

//串口标志位,0使用串口1,1使用串口2

bit UART_flag = 1;


LED1 = 1;

LED1 = 1;


//串口1和串口2初始化

UART1_Init(RELOAD, doubleBaud, timeMod);

UART2_Init(RELOAD, doubleBaud, timeMod);


//先用串口1接收字符

OpenUART1();

CloseUART2();


UART1_SendOneChar(0x0C); //超级终端清屏

UART1_SendStr("/r/n");

UART1_SendStr("/r/n");

UART1_SendStr("1.串口1通讯/r/n");

UART2_SendStr("2.串口2通讯/r/n");


while (UART1_Recv_Val == 0);


UART1_SendStr("/r/n"); //换行


if (UART1_Recv_Val == '1')

{

OpenUART1();

CloseUART2();

UART1_SendStr("Light LED(UART1):/r/n");


UART_flag = 0;

}

else

{

CloseUART1();

OpenUART2();

UART2_SendStr("Light LED(UART2):/r/n");


UART_flag = 1;

}

UART1_Recv_Val = 0; //缓存清零

UART2_Recv_Val = 0; //缓存清零


while (1)

{

if (UART_flag == 0) //串口1接收字符

{

if (UART1_Recv_Val != 0)

{

switch (UART1_Recv_Val)

{

case '1':

LED1 = ~LED1;

break;

case '2':

LED2 = ~LED2;

break;

default:

LED1 = 1;

LED1 = 1;

break;

}

UART1_Recv_Val = 0;    //缓存清零

}

}

else    //串口2接收字符

{

if (UART2_Recv_Val != 0)

{

switch (UART2_Recv_Val)

{

case '1':

LED1 = ~LED1;

break;

case '2':

LED2 = ~LED2;

break;

default:

LED1 = 1;

LED1 = 1;

break;

}

UART2_Recv_Val = 0;    //缓存清零

}

}

}

}


最后,用超级终端调试一下下


设置如下

实验结果:


关键字:STC12C5A60S2  串口 引用地址:STC12C5A60S2之串口

上一篇:STC12系列单片机冷启动、热启动
下一篇:STC12系列单片机PCA模块应用

推荐阅读最新更新时间:2024-03-16 16:23

基于STM32F407ZGT6的USB虚拟串口代码
#include sys.h #include delay.h #include usart.h #include led.h #include lcd.h #include key.h #include malloc.h #include w25qxx.h #include sdio_sdcard.h #include usbd_usr.h #include usbd_desc.h #include usb_conf.h #include usbd_cdc_core.h #include usbd_cdc_vcp.h USB_OTG_CORE_HANDLE USB_OTG_dev; extern vu8 b
[单片机]
基于51 单片机的串口收发数据
在进行串口的收发数据过程中一定要注意波特率的问题。 大多数51单片机用的都是11m晶振而只有少部分用的是奇葩的12m(楼主的就是),在12m晶振进行串口通信时切忌要将波特率设置为4800以下,应为12m晶振的波特率在9600以上误差很大容易丢失数据,动手能力强的可以折腾一下用定时器输出9600波特率。 至于,串口中断以及波特率的设置可以参考网上例子忒多。 在用串口助手进行串口收发数据时都会触发串口中断并且在发送数据时只能够一位一位的发送,也就是SBUF=10是不行的智能一位一位发送也就是每次只能发送(0-9或者一个字符)并且串口调试助手接收到的数据是asii码要进行下转换,发送也要进行一下转换。这只是针对串口调试助手。
[单片机]
基于51 单片机的<font color='red'>串口</font>收发数据
51单片机模拟串口源程序
单片机模拟串口实验,在没有串口的单片机上想使用串口功能这就需要模拟一个串口了 单片机源程序如下: #include reg51.h typedef unsigned char BYTE; typedef unsigned WORD; typedef bit BOOL; #define BAUD 0xFE80 /* 9600bps@11.0592MHz */ sfr AUXR = 0x8E; sbit RXB = P3^0; /* 定义串口TX RX端口 */ sbit TXB = P3^1; BYTE TBUF,RBUF; BYTE TDAT,RDAT; BYTE TCNT,RCNT
[单片机]
STM32中的串口通信的基础知识
串口通信基本原理 并行通信与串行通信 ① 并行通信传送八路信号,一次并行传送传送完整的一个字节信息。串行通信在一个方向上只能传送一路信号,一次只能传送一个二进制位,传送一个字节信息时,只能一位一位地依次传送; ② 串行的传输速度慢,但是对线路的要求低一些。 并行的对线路的要求高,但是速度快; ③ 串行线路仅使用一对信号线,线路成本低并且抗干扰能力强,因此可以用在长距离通讯上;而并行线路使用多对信号线(还不包括额外的控制线路),线路成本高并且抗干扰能力差,因此对通讯距离有非常严格的限制。 串行通信中单工,半双工和全双工的区别 单工,半双工和全双工是通过传输方向不同而分的。具体说明如下: 按通信方式不同又可分为异
[单片机]
STM32中的<font color='red'>串口</font>通信的基础知识
STM32串口接收不定长数据原理与源程序
今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。 看了前面IDLE中断的定义,你就会明白了,一帧数据
[单片机]
STM32<font color='red'>串口</font>接收不定长数据原理与源程序
MSP430模拟串口的源程序-汇编语言
#i nclude MSP430x11x1.h ; ; MSP430F1121 ; ----------------- ; /|\| XIN|- ; | | | 32k ; --|RST XOUT|- ; | | ; | | 2400 8N1 ; | TX/P1.1|-------- ; | TX/P2.2| -------- ; RXD equ 004h ; RXD on P2.2 TXD equ 002h
[单片机]
c51 串口连接接收与发送
调试通过。 #include AT89X52.H #include intrins.h #include string.h #include stdio.h #define uchar unsigned char #define uint unsigned int #define Fclk 11059200UL /*使用11.0592M体*/ #define BitRate 9600UL /*波特率定义为9600*/ #define DEBUG0 sbit sda= P1^2; //2ic串行数据 sbit scl= P1^5; //2ic串行时钟 sbit WP = P3^2;
[单片机]
基于ARM的多串口多总线服务器设计
  工业控制中,各设备的信号采集和监控只靠串口总线难以实现扩展,要将现场控制网络和信息网络相连,就需要解决串口通信协议和因特网通信协议的转换问题,即把原有设备转换为具备网络接口的外设,这样可以将传统串行链路上的数据传输到信息网络上,而无需更换原有设备。如此,可以提高原有设备利用率、增加多终端连接数、节约成本、简化布线的复杂度及延长通信距离。   近年来,因信息化和物联网发展的需要,串口服务器大量涌现,它们不占用主机资源,且具有终端服务器的功能。不过,设备体积庞大、价格昂贵、串口不易裁剪或扩展、传输大量数据帧时丢包、参数配置繁杂等问题也随之出现。   本设计采用的串口服务器的核心设备--树莓派,是一款体积小、价格便宜但功能非
[单片机]
基于ARM的多<font color='red'>串口</font>多总线服务器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved