⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 太欣单片机STK6031的测试程序
💻 C
字号:

#include "STK6031.h"

//********************************************************************************
//定义数据类型
typedef unsigned char uint8;
typedef unsigned int  uint16;

//下面宏定义用来选择UART 的接受或发送及是否使用中断方式
#define  USE_INT              0
#define  SEND_REC            1  

/*
********************************************************************************  
* 	函 数 名:InitMCU
* 	功能描述:初始化MCU,其中包括初始化各I/O口,CHIPCON,
                              CKCON,选择I/O口的功能
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/	

void InitMcu(void)
{
	P0		= 0xFF;      //初始化各I/O 口
	P1		= 0xFF;
	P2 		= 0xFF;
	P3		= 0xFF;
	P4 		= 0x0F;
	
	CHIPCON = 0x1A;  // 设置CPUCLK=XTAL1/3
	CKCON = 0x39;  // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4
}


#if USE_INT

	#if SEND_REC

/*
********************************************************************************  
* 	函 数 名:
* 	功能描述: 使用查询方式控制串行口通信,工作在模式1,
				   TIMER1 作为波特率发生器。设波特率为6250 b/s 
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/

//UART, 通过TxD 脚发送,查询方式

void main(void)
{
	InitMcu();
	SCON = 0x52;   // UART 工作在模式1
	TMOD = 0x21;  // TIMER1 工作在模式2,自动装载初值模式
//	TH1 = 256-(31250/6250); // 晶振为12MHz
	TH1 = 256-(62500/6250); // 晶振为24 MHz
	TR1 = 1;  // TIMER1 定时开始
	while(1)
	 {
	   if(TI) // 查询发送中断标志位有没变化
		{
	   	TI = 0; //当发送中断置位后清除该标志位
	   	SBUF = 0xF0; // 发送数据
	   	}
	 }
}

	#else 

//UART, 通过RxD 脚接收,查询方式

void main(void)
{
	InitMcu();
	uint8 temp = 0;  //接收寄存器
	SCON = 0x52;   // UART 工作在模式1
	TMOD = 0x21;  // TIMER1 工作在模式2,自动装载初值模式
	TH1 = 256-(31250/6250); // 12MHz
	//TH1 = 256-(62500/6250); // 24 MHz 
	TR1 = 1;
	while(1)
	 {
	  if(RI) // 查询接收中断标志位有没变化
	  	{
	  	RI = 0;
	  	temp = SBUF; // 接收数据
	  	}
	}
}

	#endif

#else

	

	#if  SEND_REC

/*
********************************************************************************  
* 	函 数 名:
* 	功能描述: 使用中断方式控制串行口通信,工作在模式1,
				   TIMER2 作为波特率发生器。设波特率为2500 b/s 
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/

//UART, 通过TxD 脚发送,中断方式

void main(void)
{
	InitMcu();
	SCON = 0x52;   // UART 工作在模式1
	TCLK = 1;  // 使用T2 作为波特率发生器的发送时钟
	C_T2 = 0; // 配置T2 为定时器
	TL2 = 0x9C; // 设置初值
	TH2 = 0xFF;
	RCAP2L = 0x9C;  // 设置装载值
	RCAP2H = 0xFF;
	ES = 1;  // 允许UART 中断
	EA = 1;  // CPU 开中断
	TR2 = 1;  // TIMER2 定时开始
	while(1);   // 等待中断
}

//中断程序4,串行口中断

void ISR_UART(void) interrupt INTERRUPT_SERIAL
{      
	TI = 0; //当发送中断置位后清除该标志位
	SBUF = 0x0F; // 发送数据
}	

	#else

//UART, 通过RxD 脚接收,中断方式

uint8 rectemp;  // 接收寄存器

void main(void)
{	
	InitMcu();
	SCON = 0x52;   // UART 工作在模式1
	RCLK = 1;  // 使用T2 作为波特率发生器的接收时钟
	C_T2 = 0; // 配置T2 为定时器
	TL2 = 0x9C;
	TH2 = 0xFF;
	RCAP2L = 0x9C;
	RCAP2H = 0xFF;
	ES = 1;  // 允许UART 中断
	EA = 1;  // CPU 开中断
	TR2 = 1;  // TIMER2 定时开始
	while(1);   // 等待中断
}

//中断程序4,串行口中断

void ISR_UART(void) interrupt INTERRUPT_SERIAL
{      
	RI = 0; //当接收中断置位后清除该标志位
	rectemp = SBUF; // 发送数据
}	

	#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -