STC15定时器2模式0作为波特率发生器示例程序
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15定时器2模式0作为波特率发生器示例程序相关的知识,希望对你有一定的参考价值。
【STC15】定时器2模式0作为波特率发生器示例程序
-
在此期间使用自制的STC开发板
STC15W408AS
和STC15F2K60S2
分别测试了定时器2和定时器1作为波特率发生器,STC15F2K60S2
单片机使用的是外部11.0592MHz
的晶振都两个定时器都测试没有问题,STC15W408AS
使用的是外部晶振16MHz
的,使用定时器2作为波特率发生器没有问题,在使用定时器1死活程序运行不起来。代码是按照官方文档上的示例代码写的。 -
最后查明原因是
STC15W408AS
没有定时器1
。 -
STC15系统单片机定时器数量以及外设参考资料,请看《STC15系列单片机外设参考资料》
-
定时器2模式0(16位自动重装载)作为波特率发生器示例程序
采用的是STC15W408AS,使用的是外部16MHz的晶振。
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */
/*---------------------------------------------------------------------*/
/************* 功能说明 **************
双串口全双工中断方式收发通讯程序。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
#include "config.h"
#include "stdio.h"
#include "USART.h"
void delay_ms(unsigned int ms)
unsigned int i;
do
i = MAIN_Fosc / 13000;
while(--i) ; //14T per loop
while(--ms);
//========================================================================
// 函数: void main(void)
// 描述: 主函数。
//========================================================================
void main(void)
unsigned int n;
// P0M1 = 0; P0M0 = 0; //设置为准双向口
// P1M1 = 0; P1M0 = 0; //设置为准双向口
// P2M1 = 0; P2M0 = 0; //设置为准双向口
P3M1 = 0; P3M0 = 0; //设置为准双向口
// P4M1 = 0; P4M0 = 0; //设置为准双向口
// P5M1 = 0; P5M0 = 0; //设置为准双向口
// P6M1 = 0; P6M0 = 0; //设置为准双向口
// P7M1 = 0; P7M0 = 0; //设置为准双向口
S1_USE_P30P31();
InitSerialPort(); //初始化串口,波特率9600,8bit数据位,1停止位,无校验
EA = 1; //允许总中断
// PrintString1("STC15F2K60S2 UART1 Test Prgramme!\\r\\n"); //SUART1发送一个字符串
while (1)
delay_ms(500);
n = ~0;
printf("uint = ~0:%u \\r\\n",n); //SUART1发送一个字符串
n = !0;
printf("uint = !0:%u \\r\\n",n); //SUART1发送一个字符串
P10 = !P10;
- usart.c
/*----------------------------------------------------------
* 项目名称:
串口通信驱动程序
* 功能描述:
1、串口初始化
2、查询法接收一个字节
3、串口发送一个字节
4、串口发送一个字符串
5、串口中断方式接收一个字符
* 配置说明:
MCU: STC15W408AS
开发板: STC15W408AS开发板
晶振: 内部时钟:11.0592MHz
扩展模块: -
软件: Keil.C51.V9.01
* 备注:
- 将开发板的串口与电脑串口连接
----------------------------------------------------------*/
#include "USART.h"
//#define BaudRate1 9600L
//#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 1 重装值, 对应300KHZ
unsigned char *pchar; //定义一个全局指针
bit busy;
//----------------------------------------------------------
// 函数名称:void IniSerialPort(void)
// 函数功能:串口初始化
//----------------------------------------------------------
void InitSerialPort(void)
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01;
AUXR |= 0x04; //定时器时钟为Fosc,1T模式
// T2L = 0x5F; //设置定时2初始值9600bps@外部晶振16MHz
// T2H = 0xFE; //设置定时初始值
AUXR |= 0x10; //启动定时器
T2L= (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
ES = 1; //使能串口中断
ET0 = 0; //禁止定时器1中断
REN=1; //串口为工作方式1,允许接收数据
SM0=0; //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定
SM1=1;
//----------------------------------------------------------
// 函数名称:unsigned char ReceiveByte(void)
// 函数功能:查询法接收一个字节
//----------------------------------------------------------
unsigned char ReceiveByte(void)
unsigned char rbyte;
while(!RI); //查询接收标志位,是否有数据到达缓冲区
RI=0; //清零接收标志位
rbyte=SBUF; //从缓冲区读取数据
return rbyte;
//----------------------------------------------------------
// 函数名称:putchar(unsigned char c)
// 函数功能:串口发送一个字节
//----------------------------------------------------------
char putchar(unsigned char c)
SBUF = c; //发送数据
while(!TI); //等待发送完成
TI=0; //清零发送标志位;
return c;
//----------------------------------------------------------
// 函数名称:void SendString(unsigned char *pstr)
// 函数功能:串口发送一个字符串
//----------------------------------------------------------
//void SendString(unsigned char *pstr)
//
// while(*pstr!='\\0') //字符串是否发完
//
// SendByte(*pstr); //发送字符串数据
// pstr++; //指向下一个字符
//
//
//----------------------------------------------------------
// 函数名称:void SerialPortInte(void)
// 函数功能:串口中断方式接收一个字符
//----------------------------------------------------------
void SerialPortInte(void) interrupt 4 using 1
if(RI)
RI=0; //清零接收标志位
*pchar=SBUF; //读取缓冲区的数据
if(TI)
TI=0;//清除TI位
busy = 0;//清忙标志
/**********************************THE END**********************************/
程序源码
链接:https://pan.baidu.com/s/1MM6Y1H_B0AztS97IeU9tFg
提取码:ex6a
以上是关于STC15定时器2模式0作为波特率发生器示例程序的主要内容,如果未能解决你的问题,请参考以下文章