找回密码
 立即注册
查看: 266|回复: 1

stc8a8k64d4串口3开机3分多钟死机 其它功能没有死机

[复制链接]

该用户从未签到

2

主题

1

回帖

20

积分

新手上路

积分
20
发表于 2023-8-14 12:24:01 | 显示全部楼层 |阅读模式
程序哪边有问题
#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.1  2023813
//            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********************************************/       

回复 送花

使用道具 举报

该用户从未签到

2

主题

1

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2023-8-14 12:25:09 | 显示全部楼层
#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.1  2023813
//            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********************************************/       
回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-14 11:01 , Processed in 0.056558 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表