欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3313|回復(fù): 8
收起左側(cè)

請(qǐng)教STC15單片機(jī)串口4的發(fā)送數(shù)據(jù)的程序問題

[復(fù)制鏈接]
ID:899981 發(fā)表于 2022-6-27 15:04 | 顯示全部樓層 |閱讀模式
如題,只發(fā)一次就不發(fā)了。單片機(jī)代碼如下:

void serial_port4_initial(){

        S4CON = 0x10;                //8位數(shù)據(jù),可變波特率
        S4CON |= 0x40;                //串口4選擇定時(shí)器4為波特率發(fā)生器
        T4T3M &= 0xDF;                //定時(shí)器時(shí)鐘12T模式
        T4L = 0xDD;                //設(shè)置定時(shí)初始值
        T4H = 0xFF;                //設(shè)置定時(shí)初始值
        T4T3M |= 0x80;                //定時(shí)器4開始計(jì)時(shí)

        IE2 |= 0x10;         //ES4 = 1;
        P_SW2=0x04;         //串口2、3、4的位置
        EA = 1;

}


void send_UART4(uchar dat)
{
         uchar temp = 0;
        

        S4CON = S4CON & 0xfd;  //S4TI = 0;

                S4BUF = dat;
                do
                {
                        temp = S4CON;
                        temp = temp & 0x02;                //temp=S2TI
                }while(temp == 0);
                S4CON = S4CON & 0xfd;            //S4TI = 0;
        

}

主函數(shù):
serial_port4_initial();
        while(1)
        {        


                delayms(500);
        
                send_UART4(0X28);
               
        }        
意思是500毫秒發(fā)一次,結(jié)果發(fā)一次就不發(fā)了。  
回復(fù)

使用道具 舉報(bào)

ID:913577 發(fā)表于 2022-6-27 16:34 | 顯示全部樓層
看下delayms函數(shù),可能是這個(gè)函數(shù)的問題
回復(fù)

使用道具 舉報(bào)

ID:899981 發(fā)表于 2022-6-27 17:37 | 顯示全部樓層
mornbin 發(fā)表于 2022-6-27 16:34
看下delayms函數(shù),可能是這個(gè)函數(shù)的問題

謝謝,是這里問題:
void Usart4() interrupt 18
{
        UART4_INT_DISABLE();       
        if(RI4)
        {
                CLR_RI4();                               //清除RI位
               
        }
        void Usart4() interrupt 18
{
        UART4_INT_DISABLE();       
        if(RI4)
        {
                CLR_RI4();                               //清除RI位
               
        }
        UART4_INT_ENABLE();       
}       
}要把這個(gè)加上,但現(xiàn)在是報(bào)警告,UART4_INT_ENABLE();UART4_INT_DISABLE();        這兩個(gè)警告不管能發(fā),然后定義這兩個(gè)就不能發(fā)。 //#define                UART4_INT_DISABLE()                IE2 &= ~(1<<4)        //允許串口3中斷
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-6-27 17:49 | 顯示全部樓層
定義運(yùn)算,要加";"號(hào)于結(jié)尾
#define  UART4_INT_DISABLE() IE2 &= ~(1<<4);        //允許串口3中斷
回復(fù)

使用道具 舉報(bào)

ID:899981 發(fā)表于 2022-6-27 18:52 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-27 17:49
定義運(yùn)算,要加";"號(hào)于結(jié)尾
#define  UART4_INT_DISABLE() IE2 &= ~(1

謝謝,加不加這個(gè)好像不影響。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-6-27 20:29 | 顯示全部樓層
既然串口用了中斷,就不用再在發(fā)送函數(shù)中等待發(fā)送完成
因?yàn)?一旦發(fā)送完成,優(yōu)先是進(jìn)入中斷的,我不知道中斷觸發(fā)后,不清除中斷標(biāo)志位(S4TI),程序會(huì)不會(huì)是一直卡在中斷中
個(gè)人感覺就是因?yàn)镾4TI沒有清除,而你又開了中斷,所以,程序是發(fā)送一次之后,中斷觸發(fā)了,就一直卡在中斷中出不來了
推薦增加一個(gè)中斷標(biāo)志位,然后在中斷觸發(fā)后清除
while(busy);busy=1;S4BUF = dat;


busy在串口中斷觸發(fā)后,在中斷中清除,并清除S4TI
這樣可以提高中斷的效率
回復(fù)

使用道具 舉報(bào)

ID:899981 發(fā)表于 2022-6-28 10:09 | 顯示全部樓層
本帖最后由 ZHAOBAO511 于 2022-6-28 10:16 編輯
Y_G_G 發(fā)表于 2022-6-27 20:29
既然串口用了中斷,就不用再在發(fā)送函數(shù)中等待發(fā)送完成
因?yàn)?一旦發(fā)送完成,優(yōu)先是進(jìn)入中斷的,我不知道中斷觸 ...

謝謝,您這個(gè)方法可以,已正常運(yùn)行,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:1080312 發(fā)表于 2023-5-28 00:06 | 顯示全部樓層
mornbin 發(fā)表于 2022-6-27 16:34
看下delayms函數(shù),可能是這個(gè)函數(shù)的問題

能幫我看看嗎?我用的是串口3進(jìn)行數(shù)據(jù)收發(fā)。但串口3只能發(fā),外面的數(shù)據(jù)讀進(jìn)不了單片機(jī)中。
void UART3_Init()
{       
    P_SW2 &= ~S3_S0;                  //切換到 P0.0\P0.1
        S3CON = 0x10;                //8位數(shù)據(jù),可變波特率;允許接收
        //S3CON &= 0xBF;                //串口3選擇定時(shí)器2為波特率發(fā)生器
        T2L = 0xE0;                   //設(shè)置定時(shí)初始值
        T2H = 0xFE;                   //設(shè)置定時(shí)初始值
    AUXR = 0x14;       //T2為1T模式, 并啟動(dòng)定時(shí)器2
    IE2 = 0x08;         //使能串口3中斷
    EA = 1;
}

void uart3_inte() interrupt 17
{
   unsigned char num=0;
    //接收
   if(S3CON & 0x02)                   //發(fā)送中斷標(biāo)志S3TI=1
   {
      S3CON &=0xFD;;           //發(fā)送中斷標(biāo)志清零S3TI=0
     
          if (S3CON & 0x01)
      {
        S3CON &=0xFE;        //清除S3TI位
                //R_table[count]=S3BUF;    //busy=0;
                num = S3BUF;
                num++;
                S3BUF = num;                                //返回?cái)?shù)值
      }           
   }
}
回復(fù)

使用道具 舉報(bào)

ID:1080312 發(fā)表于 2023-5-28 00:09 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-27 17:49
定義運(yùn)算,要加";"號(hào)于結(jié)尾
#define  UART4_INT_DISABLE() IE2 &= ~(1

大佬,我這個(gè)用串口3收發(fā)數(shù)據(jù),但現(xiàn)在只能收,發(fā)的單片機(jī)讀不進(jìn)去。現(xiàn)在不知道啥原因?求教
void UART3_Init()
{       
    P_SW2 &= ~S3_S0;                  //切換到 P0.0\P0.1
        S3CON = 0x10;                //8位數(shù)據(jù),可變波特率;允許接收
        //S3CON &= 0xBF;                //串口3選擇定時(shí)器2為波特率發(fā)生器
        T2L = 0xE0;                   //設(shè)置定時(shí)初始值
        T2H = 0xFE;                   //設(shè)置定時(shí)初始值
    AUXR = 0x14;       //T2為1T模式, 并啟動(dòng)定時(shí)器2
    IE2 = 0x08;         //使能串口3中斷
    EA = 1;
}

void uart3_inte() interrupt 17
{
   unsigned char num=0;
    //接收
   if(S3CON & 0x02)                   //發(fā)送中斷標(biāo)志S3TI=1
   {
      S3CON &=0xFD;;           //發(fā)送中斷標(biāo)志清零S3TI=0
     
          if (S3CON & 0x01)
      {
        S3CON &=0xFE;        //清除S3TI位
                //R_table[count]=S3BUF;    //busy=0;
                num = S3BUF;
                num++;
                S3BUF = num;                                //返回?cái)?shù)值
      }           
   }
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表