STC15定时器2模式0作为波特率发生器示例程序

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15定时器2模式0作为波特率发生器示例程序相关的知识,希望对你有一定的参考价值。

【STC15】定时器2模式0作为波特率发生器示例程序


  • 在此期间使用自制的STC开发板STC15W408ASSTC15F2K60S2分别测试了定时器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作为波特率发生器示例程序的主要内容,如果未能解决你的问题,请参考以下文章

STC15系列单片机外设参考资料

STC15不同配置模式下的串口输出方式总结

STC15不同配置模式下的串口输出方式总结

STC15系列STC15虚拟串口输出打印示例程序

STC89C52高级定时器简介

STC89C52高级定时器简介