stc8a8k64d4串口3开机3分多钟死机 其它功能没有死机
程序哪边有问题#include "uart.h"
volatile uint8 Flag=FALSE;
//uint8 Flag=FALSE;
uint8 uart3temp;
/***************************************************************************
* ÃèÊö : ´®¿Ú3³õʼ»¯º¯Êý
* Èë²Î : ÎÞ
* ·µ»ØÖµ : ÎÞ
±¸×¢£º²¨ÌØÂÊ9600bps ¾§Õñ11.0592MHz
**************************************************************************/
void Uart3_Init(void)
{
IE2 &= 0xF7; // ´®¿Ú3ÖÐ¶Ï¹Ø±Õ 2023813
P_SW2 &= 0xFD; //ÉèÖô®¿Ú3ʹÓÃÒý½Å:RxD--P0.0;TxD--P0.12023813
// P_SW2 = 0x00; // RXD3/P0.0, TXD3/P0.1
S3CON |= 0x10; //Æô¶¯´®ÐнÓÊÕÆ÷
// S3CON &= 0x30; //8λÊý¾Ý,¿É±ä²¨ÌØÂÊ,´®¿Ú3Ñ¡Ôñ¶¨Ê±Æ÷2Ϊ²¨ÌØÂÊ·¢ÉúÆ÷
S3CON &= 0xBF; //8λÊý¾Ý,¿É±ä²¨ÌØÂÊ,´®¿Ú3Ñ¡Ôñ¶¨Ê±Æ÷2Ϊ²¨ÌØÂÊ·¢ÉúÆ÷
AUXR |= 0x04; //¶¨Ê±Æ÷2ʱÖÓΪFosc,¼´1T
T2L = 0xE0; //É趨¶¨Ê±³õÖµ
T2H = 0xFE; //É趨¶¨Ê±³õÖµ
AUXR |= 0x10; //Æô¶¯¶¨Ê±Æ÷2
IE2 |= 0x08; // ´®¿Ú3Öжϴò¿ª
}
/***************************************************************************
* ÃèÊö : ´®¿Ú3·¢ËÍÊý¾Ýº¯Êý
* Èë²Î : uint8 Êý¾Ý
* ·µ»ØÖµ : ÎÞ
**************************************************************************/
void SendDataByUart3(uint8 dat)
{
S3BUF = dat; //дÊý¾Ýµ½UARTÊý¾Ý¼Ä´æÆ÷
while(!(S3CON&S3TI)); //ÔÚֹͣλûÓз¢ËÍʱ£¬S3TIΪ0¼´Ò»Ö±µÈ´ý
S3CON&=~S3TI; //Çå³ýS3CON¼Ä´æÆ÷¶ÔÓ¦S3TI루¸Ãλ±ØÐëÈí¼þÇåÁ㣩
}
/***************************************************************************
* ÃèÊö : ´®¿Ú3ÖжϷþÎñº¯Êý
* Èë²Î : ÎÞ
* ·µ»ØÖµ : ÎÞ
**************************************************************************/
void Uart3() interrupt 17 using 1
{
IE2 &= 0xF7; // ´®¿Ú3ÖжϹرÕ
Flag=TRUE; //½ÓÊÕµ½Êý¾Ý,½ÓÊÕ±êʶ·ûÓÐЧ
if (S3CON & S3RI) //´®ÐнÓÊÕµ½Í£Ö¹Î»µÄÖмäʱ¿Ìʱ£¬¸ÃλÖÃ1
{
S3CON &= ~S3RI; //Çå³ýS3CON¼Ä´æÆ÷¶ÔÓ¦S3RI루¸Ãλ±ØÐëÈí¼þÇåÁ㣩
uart3temp = S3BUF;
}
if (S3CON & S3TI) //ÔÚֹͣλ¿ªÊ¼·¢ËÍʱ£¬¸ÃλÖÃ1
{
S3CON &= ~S3TI; //Çå³ýS3CON¼Ä´æÆ÷¶ÔÓ¦S3TI루¸Ãλ±ØÐëÈí¼þÇåÁ㣩
// uart3temp = S3BUF; //2023.8.8
}
IE2 |= 0x08; // ´®¿Ú3Öжϴò¿ª
}
/**************************************************************************************
* ÃèÊö : ´®¿Ú3½ÓÊÕµ½Êý¾Ýºó·¢ËͳöÈ¥
* Èë²Î : ÎÞ
* ·µ»ØÖµ : ÎÞ
**************************************************************************************/
void UART3_Tx_Puts(void)
{
if(Flag) //ÓÐÐÂÊý¾Ýͨ¹ý´®¿Ú±»½ÓÊÕµ½
{
IE2 &= 0xF7; //´®¿Ú3ÖжϹرÕ
SendDataByUart3(uart3temp); //·¢ËÍ×Ö·û
SendDataByUart3(0x0D); //·¢ËÍ»»Ðзû
SendDataByUart3(0x0A); //·¢ËÍ»»Ðзû
IE2 |= 0x08; //´®¿Ú3Öжϴò¿ª
Flag=FALSE; //Çå³ý½ÓÊÕ±êʶ·û
}
}
/**************************************************************************************
* ÃèÊö : ´®¿Ú3½ÓÊÕµ½Êý¾Ýºó·¢ËÍ(²»º¬»»Ðзû)
* Èë²Î : ÎÞ
* ·µ»ØÖµ : ÎÞ
**************************************************************************************/
void UART3_Puts(void)
{
if(Flag) //ÓÐÐÂÊý¾Ýͨ¹ý´®¿Ú±»½ÓÊÕµ½
{
IE2 &= 0xF7; //´®¿Ú3ÖжϹرÕ
SendDataByUart3(uart3temp); //·¢ËÍ×Ö·û
// SendDataByUart3(0x0D); //·¢ËÍ»»Ðзû//2023812
// SendDataByUart3(0x0A); //·¢ËÍ»»Ðзû//2023812
IE2 |= 0x08; //´®¿Ú3Öжϴò¿ª
Flag=FALSE; //Çå³ý½ÓÊÕ±êʶ·û
}
}
void SendData_Uart3(uint8 dat)
{
// int *p1=malloc
IE2 &= 0xF7; //´®¿Ú3ÖжϹرÕ
S3BUF = dat; //дÊý¾Ýµ½UARTÊý¾Ý¼Ä´æÆ÷
while(!(S3CON&S3TI)); //ÔÚֹͣλûÓз¢ËÍʱ£¬S3TIΪ0¼´Ò»Ö±µÈ´ý
S3CON&=~S3TI; //Çå³ýS3CON¼Ä´æÆ÷¶ÔÓ¦S3TI루¸Ãλ±ØÐëÈí¼þÇåÁ㣩
IE2 |= 0x08; //´®¿Ú3Öжϴò¿ª
// Flag=FALSE; //Çå³ý½ÓÊÕ±êʶ·û
}
/*********************************END FILE********************************************/
#include "uart.h"
volatile uint8 Flag=FALSE;
//uint8 Flag=FALSE;
uint8 uart3temp;
/***************************************************************************
* 描述 : 串口3初始化函数
* 入参 : 无
* 返回值 : 无
备注:波特率9600bps 晶振11.0592MHz
**************************************************************************/
void Uart3_Init(void)
{
IE2 &= 0xF7; // 串口3中断关闭 2023813
P_SW2 &= 0xFD; //设置串口3使用引脚:RxD--P0.0;TxD--P0.12023813
// P_SW2 = 0x00; // RXD3/P0.0, TXD3/P0.1
S3CON |= 0x10; //启动串行接收器
// S3CON &= 0x30; //8位数据,可变波特率,串口3选择定时器2为波特率发生器
S3CON &= 0xBF; //8位数据,可变波特率,串口3选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
IE2 |= 0x08; // 串口3中断打开
}
/***************************************************************************
* 描述 : 串口3发送数据函数
* 入参 : uint8 数据
* 返回值 : 无
**************************************************************************/
void SendDataByUart3(uint8 dat)
{
S3BUF = dat; //写数据到UART数据寄存器
while(!(S3CON&S3TI)); //在停止位没有发送时,S3TI为0即一直等待
S3CON&=~S3TI; //清除S3CON寄存器对应S3TI位(该位必须软件清零)
}
/***************************************************************************
* 描述 : 串口3中断服务函数
* 入参 : 无
* 返回值 : 无
**************************************************************************/
void Uart3() interrupt 17 using 1
{
IE2 &= 0xF7; // 串口3中断关闭
Flag=TRUE; //接收到数据,接收标识符有效
if (S3CON & S3RI) //串行接收到停止位的中间时刻时,该位置1
{
S3CON &= ~S3RI; //清除S3CON寄存器对应S3RI位(该位必须软件清零)
uart3temp = S3BUF;
}
if (S3CON & S3TI) //在停止位开始发送时,该位置1
{
S3CON &= ~S3TI; //清除S3CON寄存器对应S3TI位(该位必须软件清零)
// uart3temp = S3BUF; //2023.8.8
}
IE2 |= 0x08; // 串口3中断打开
}
/**************************************************************************************
* 描述 : 串口3接收到数据后发送出去
* 入参 : 无
* 返回值 : 无
**************************************************************************************/
void UART3_Tx_Puts(void)
{
if(Flag) //有新数据通过串口被接收到
{
IE2 &= 0xF7; //串口3中断关闭
SendDataByUart3(uart3temp); //发送字符
SendDataByUart3(0x0D); //发送换行符
SendDataByUart3(0x0A); //发送换行符
IE2 |= 0x08; //串口3中断打开
Flag=FALSE; //清除接收标识符
}
}
/**************************************************************************************
* 描述 : 串口3接收到数据后发送(不含换行符)
* 入参 : 无
* 返回值 : 无
**************************************************************************************/
void UART3_Puts(void)
{
if(Flag) //有新数据通过串口被接收到
{
IE2 &= 0xF7; //串口3中断关闭
SendDataByUart3(uart3temp); //发送字符
// SendDataByUart3(0x0D); //发送换行符//2023812
// SendDataByUart3(0x0A); //发送换行符//2023812
IE2 |= 0x08; //串口3中断打开
Flag=FALSE; //清除接收标识符
}
}
void SendData_Uart3(uint8 dat)
{
// int *p1=malloc
IE2 &= 0xF7; //串口3中断关闭
S3BUF = dat; //写数据到UART数据寄存器
while(!(S3CON&S3TI)); //在停止位没有发送时,S3TI为0即一直等待
S3CON&=~S3TI; //清除S3CON寄存器对应S3TI位(该位必须软件清零)
IE2 |= 0x08; //串口3中断打开
// Flag=FALSE; //清除接收标识符
}
/*********************************END FILE********************************************/
页:
[1]