* ************************************************************************************
**/
#define ALLOCATE_EXTERN
#include "HC89S105AC8.h"
unsigned char guc_Uartflag = 0; //UART判断标志位
unsigned char guc_Uartcnt = 0; //UART计数使用
unsigned char guc_Uartbuf_a[5] = {0}; //用于存放接和收收据
unsigned char guc_i; //发送数据计数
/***************************************************************************************
* @实现效果 UART1接收到上位机发送的数据后,把接收的数据再次发送给上位机
* @注意 波特率1200,8位数据,无校验位
***************************************************************************************/
void main(void)
{
/********************************系统初始化*******************************************/
WDTCCR = 0x00; //关闭看门狗
//本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
CLKCON = 0x02; //选择内部高频RC为系统时钟,Fosc=32MHz
CLKDIV = 0x02; //Fosc 2分频得到Fper,Fper=16MHz
/**********************************IO配置初始化**************************************/
P0M0 = P0M0&0xF0|0x02; //P00设置为上拉输入
P0M0 = P0M0&0x0F|0x80; //P01设置为推挽输出
/**********************************UART配置初始化**************************************/
TXD_MAP = 0x01; //TXD映射P01
RXD_MAP = 0x00; //RXD映射P00
//8位数据发送,波特率1200
//波特率计算
//波特率 = 1/16 * 时钟源频率 / (65536 - 0xFCBE)
// = 1/16 * 16000000 / 834)
// = 1199.04(误差0.05%)
//波特率1200
//反推初值
//初值 = (65536 - (Fper / 波特率) * (1 / 16))
// = (65536 - (16000000 / 1200) * (1 / 16))
// = (65536 - 833.33)
// = FCBE
SBRTH = 0xFCBE/256;
SBRTL = 0xFCBE%256;
SCON2 = 0x12; //8位UART 独立波特率,波特率可变
SCON = 0x10; //开串口接收
IE = 0x10; //使能串口中断
EA = 1; //使能总中断
while(1)
{
if(guc_Uartflag)
{
IE &=~ 0x10; //失能UART1中断
for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
{
SBUF = guc_Uartbuf_a[guc_i]; //发送数据
while(!(SCON&0x02));
SCON &=~ 0x02; //发送中断请求中断标志位清0
}
guc_Uartflag = 0; //标志位置0
guc_Uartcnt = 0;
SCON |= 0x10; //使能串口中断
IE |= 0x10; //UART1中断使能
}
}
}
/***************************************************************************************
* @说明 UART1中断服务函数
* @参数 无
* @返回值 无
* @注 无
***************************************************************************************/
void UART1_Rpt() interrupt UART1_VECTOR
{
if(SCON&0x01)
{
guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
if(guc_Uartcnt >= 5)
{
SCON &=~ 0x10; //失能串口接收
guc_Uartflag = 1;
}
SCON &=~ 0x01; //收到数据后,清除接收标志
}
}
|