当前位置:首页 > 单片机 > 单片机
[导读]使用GPRS模块,模块固定波特率115200, 手头有现成的STC89c51RC,一般51不能达到115200,查找资料使用下面的配置可以实现115200的波特率, 已经测试过OK。//#include "reg51.h"#include "intrins.h"#include "STC89C

使用GPRS模块,模块固定波特率115200, 手头有现成的STC89c51RC,一般51不能达到115200,查找资料使用下面的配置可以实现115200的波特率, 已经测试过OK。


//#include "reg51.h"
#include "intrins.h"
#include "STC89C5xRC.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 18432000L //System frequency
#define BAUD 9600 //UART baudrate

/*Define UART parity mode*/
#define NONE_PARITY 0 //None parity
#define ODD_PARITY 1 //Odd parity
#define EVEN_PARITY 2 //Even parity
#define MARK_PARITY 3 //Mark parity
#define SPACE_PARITY 4 //Space parity

#define PARITYBIT EVEN_PARITY //Testing even parity

sbit bit9 = P2^2; //P2.2 show UART data bit9
bit busy;

void SendData(BYTE dat);
void SendString(char *s);


void init()//串口初始化
{
SCON=0x50; //SCON:串行口工作方式1, 8-bit UART,允许串行接收位(REN=1)
TL2=RCAP2L=250;//或253
TH2=RCAP2H=255;
T2CON=0x34;//

EA=1; //开总中断
ES=1; //开串口中断

}

void main()
{
/*
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8-bit variable UART
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9-bit variable UART, parity bit initial to 1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9-bit variable UART, parity bit initial to 0
#endif

TMOD = 0x20; //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
*/

init();
SendString("STC89-90xxrnUart Test !rn");
while(1);
}

/*----------------------------
UART interrupt service routine
----------------------------*/
void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
P0 = SBUF; //P0 show UART data
bit9 = RB8; //P2.2 show parity bit
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
busy = 0; //Clear transmit busy flag
}
}

/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //Wait for the completion of the previous data is sent
ACC = dat; //Calculate the even parity bit P (PSW.0)
if (P) //Set the parity bit according to P
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0; //Set parity bit to 0
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1; //Set parity bit to 1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //Set parity bit to 0
#endif
}
busy = 1;
SBUF = ACC; //Send data to UART buffer
}

/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
while (*s) //Check the end of the string
{
SendData(*s++); //Send current char and increment string ptr
}
}

================================================
STC89C5xRC.h

/* After is STC additional SFR */

/* sfr AUXR = 0x8e; */
/* sfr AUXR1 = 0xa2; */
/* sfr IPH = 0xb7; */

sfr P4 = 0xe8;
sbit P43 = P4^3;
sbit P42 = P4^2;
sbit P41 = P4^1;
sbit P40 = P4^0;

sfr XICON = 0xc0;

sfr WDT_CONTR = 0xe1;

sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;

/* Above is STC additional SFR */

/*--------------------------------------------------------------------------
REG51F.H

Header file for 8xC31/51, 80C51Fx, 80C51Rx+
Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.

Modification according to DataSheet from April 1999
- SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
--------------------------------------------------------------------------*/

/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;

/* 80C51Fx/Rx Extensions */
sfr AUXR = 0x8E;
sfr AUXR1 = 0xA2;
sfr SADDR = 0xA9;
sfr IPH = 0xB7;
sfr SADEN = 0xB9;
sfr T2CON = 0xC8;
sfr T2MOD = 0xC9;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;

/* PCA SFR
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr CCAPM3 = 0xDD;
sfr CCAPM4 = 0xDE;
sfr CL = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CCAP3L = 0xED;
sfr CCAP4L = 0xEE;
sfr CH = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr CCAP3H = 0xFD;
sfr CCAP4H = 0xFE;
*/

/* BIT Registers */
/* PSW */
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;

/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;

/* IE */
sbit EA = IE^7;
sbit EC = IE^6;
sbit ET2 = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;

/* IP */
/* sbit PPC = IP^6;*/
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;

/* P3 */
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;

/* SCON */
sbit SM0 = SCON^7; // alternatively "FE"
sbit FE = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;

/* P1 */
/* PCA
sbit CEX4 = P1^7;
sbit CEX3 = P1^6;
sbit CEX2 = P1^5;
sbit CEX1 = P1^4;
sbit CEX0 = P1^3;
sbit ECI = P1^2;
*/

sbit T2EX = P1^1;
sbit T2 = P1^0;

/* T2CON */
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2= T2CON^0;

/* CCON */
/* PCA
sbit CF = CCON^7;
sbit CR = CCON^6;

sbit CCF4 = CCON^4;
sbit CCF3 = CCON^3;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
*/
================================================
http://www.amobbs.com/thread-4534583-1-1.html


STC的URAT在6T模式下工作的问题

测试程序使用小强开发板光盘中的《串口收发 测试程序[深圳伟嵌科技].C》修改,主要是定时器,使用了定时器2作为波特率发生器。
晶振:11.0592M
通过计算可得知
当 TL2=RCAP2L=250; 时
12T模式下波特率57600,6T模式下波特率115200。
当 TL2=RCAP2L=253; 时
12T模式下波特率115200。

使用STC-ISP中的串口调试助手分别测试三种模式
A:6T,TL2=250,波特率115200
B:12T,TL2=250,波特率57600
C:12T,TL2=253,波特率115200

void init()//串口初始化
{
SCON=0x50; //SCON:串行口工作方式1, 8-bit UART,允许串行接收位(REN=1)
TL2=RCAP2L=250;//或253
TH2=RCAP2H=255;
T2CON=0x34;//

EA=1; //开总中断
ES=1; //开串口中断

}

测试结果:
A:会丢失第n*3个字符(n为自然数)
B、C正常,自动发送一千多个字符,一个不落收到
从整个程序分析,流程是串口初始化并延时1ms,进入死循环等待中断。
接收中断发送后,清中断标志,把串口SBUF复制给P0口和中间变量a,把a放入receive数组,再把receive数组的内容逐个送到SBUF让串口发送,很简单很直接,应该没有问题。
又测试了6T,TL2=244,波特率57600的模式,丢第n*5个字符。
所以,应该是STC的串口在6T模式下不能可靠工作,或者不能与其它器件很好地配合。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

以下内容中,小编将对波特率的相关内容进行着重介绍和阐述,希望本文能帮您增进对波特率的了解,和小编一起来看看吧。

关键字: 波特率 码元

波特率9600的传输速率为每秒9600个比特,而波特率115200的传输速率为每秒115200个比特,因此,115200的传输速度比9600快得多。

关键字: 波特率 传输速度 MCU

比特率:在数字信道中,比特率是数字信号的传输速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数bit/s(bps)。

关键字: 波特率 比特率 信道

在通信领域中,波特率与数据传输速率是两个关键的性能指标。波特率通常用于描述模拟通信系统中的信号调制速率,而数据传输速率则用于描述数字通信系统中的数据传输效率。了解波特率与数据传输速率的关系对于正确选择和配置通信系统至关重...

关键字: 波特率 数据传输速率 模拟通信

晶振,即晶体振荡器,是许多电子设备中的关键元件,为电路提供稳定的时钟信号。当晶振出现故障或损坏时,会对电子设备的性能产生影响。本文将详细讨论晶振坏了的现象。

关键字: 晶振 振荡器 电子设备

晶振,即晶体振荡器,是一种利用晶体物理特性制作的电子元件,它在现代电子设备中发挥着重要的作用。本文将详细介绍晶振的作用和原理。

关键字: 晶振 振荡器 电子元件

晶振,也称为晶体振荡器,是一种基于晶体振荡原理的电子元件。晶振在许多电子设备中都扮演着关键的角色,提供稳定的计时基准。然而,有时晶振可能会损坏或性能下降,这就需要我们进行测量以确定其好坏。本文将详细介绍如何测量晶振的好坏...

关键字: 晶振 振荡器 电子元件

时钟电路和晶振电路不一样,晶振电路是时钟电路,但是时钟电路不一定是用晶振电路。

关键字: 晶振电路 时钟电路 晶振

晶体振荡器,包括HC-49/S、HC-S/SMD、HC-46SSMD、SMD谐振器、SMD振荡器及圆柱26、38系列等,能满足不同领域和不同应用场景的需求。

关键字: 晶振 晶体振荡器 SMD谐振器

串行通信是一种通信方式,其中数据按顺序一位一位地传输。与并行通信不同,串行通信在一条线路上传输数据,因此需要较少的数据线。串行通信主要用于长距离通信,因为它的功耗低、成本低、简单易实现。

关键字: 串行通信 波特率
关闭
关闭