久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3249|回復: 15
打印 上一主題 下一主題
收起左側

STC8A8K64S4A12單片機串口2程序問題 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:560941 發表于 2021-10-17 20:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
程序:void uart_init()
{        
        /* ----------------------------------------------------串口2初始化------------------------------*/
        S2CON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        if(com2_baud == 1)
        {
                T2L = 0xE0;                //設定定時初值 9600
                T2H = 0xFE;                //設定定時初值
        }
        AUXR |= 0x10;                //啟動定時器2
        /*引腳選擇*/

                      P_SW2 |= 0x81;        //RXD2_2/P4.0, TXD2_2/P4.2
                          P_SW2 &= ~0x80;//關閉訪問擴展特殊寄存器        
        }
        IE2 |= 0x01;         //使能串口2中斷
}

/******************************************
函數名:putbuf
功能:輸出一個字符
*******************************************/
void putbuf(char dat)
{
        S2BUF = dat;
        while(S2CON&S2TI==0);
}

/******************************************
函數名:Delay1000ms()
功能:延遲1s
*******************************************/
void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 57;
        j = 27;
        k = 112;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

/******************************************
函數名:sendstring(char * dat)
功能:輸出字符串
*******************************************/
void sendstring(char * dat)
{
        while(*dat != '\0')
        {
                putbuf(*dat++);
        }
}

/******************************************
函數名:com2_isr() interrupt 8
功能:串口2中斷服務函數
*******************************************/
void com2_isr() interrupt 8
{
        unsigned char res; //串口2接收數據臨時存放區
    if (S2CON & S2RI)
    {        
        S2CON &= ~S2RI;                         //清中斷標志      
    }
    if (S2CON & S2TI)
    {
        S2CON &= ~S2TI;                         //清中斷標志        
    }
}

void main(void)
{
        uart_init();
        EA =1;
        while(1)
        {
                sendstring("TEST ! \r\n");
                Delay1000ms();
        }
}


////接到串口助手,一直顯示數據:0A(HEX格式),怎么回事???哪里出錯了??

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:560941 發表于 2021-10-17 21:49 | 只看該作者
最新發現:連續發送字符串,比如“ABC”,只會輸出最后一個字符。同樣我上面程序里輸出“TEST ! \r\n”,只會輸出‘\n’,為什么會這樣啊
回復

使用道具 舉報

板凳
ID:624769 發表于 2021-10-17 23:40 | 只看該作者
       while(S2CON&S2TI==0);

這個不能偷懶,要這樣寫:    while((S2CON&S2TI)==0);
回復

使用道具 舉報

地板
ID:65956 發表于 2021-10-18 08:26 | 只看該作者
你要測試輸出,先把接收中斷關閉試試就知道什么原因了,按你這個發送也進入中斷,肯定會和你發送字符這個函數沖突的
回復

使用道具 舉報

5#
ID:277550 發表于 2021-10-18 10:03 | 只看該作者

發送情況,加一個全局的“忙”變量來處理,開始發送設置“忙”,中斷中設置不忙。這樣防止沖突。
回復

使用道具 舉報

6#
ID:560941 發表于 2021-10-18 19:06 | 只看該作者
188610329 發表于 2021-10-17 23:40
while(S2CON&S2TI==0);

這個不能偷懶,要這樣寫:    while((S2CON&S2TI)==0);

不是這個原因,試了不行。。
回復

使用道具 舉報

7#
ID:560941 發表于 2021-10-18 19:39 | 只看該作者
aking991 發表于 2021-10-18 08:26
你要測試輸出,先把接收中斷關閉試試就知道什么原因了,按你這個發送也進入中斷,肯定會和你發送字符這個函 ...

后面試了,不開中斷也這樣
回復

使用道具 舉報

8#
ID:560941 發表于 2021-10-18 19:44 | 只看該作者
devcang 發表于 2021-10-18 10:03
發送情況,加一個全局的“忙”變量來處理,開始發送設置“忙”,中斷中設置不忙。這樣防止沖突。

這個方法確實是可行的,但是我就不懂為什么串口1可以用中斷標志位來設置等待,串口2就不可以了。。
回復

使用道具 舉報

9#
ID:560941 發表于 2021-10-18 20:01 | 只看該作者
devcang 發表于 2021-10-18 10:03
發送情況,加一個全局的“忙”變量來處理,開始發送設置“忙”,中斷中設置不忙。這樣防止沖突。

大神,可不可以幫我解答這個問題
回復

使用道具 舉報

10#
ID:624769 發表于 2021-10-18 20:31 | 只看該作者
mlz159357 發表于 2021-10-18 19:06
不是這個原因,試了不行。。

你整個程序, 除了 while(S2CON&S2TI==0); 寫錯之外,其他地方看下來都沒有問題.

要么,你換引腳看看?  用標準引腳試試看?
回復

使用道具 舉報

11#
ID:401564 發表于 2021-10-18 20:36 | 只看該作者
以下是我用STC8A4K照著官方寫的,已經在開發板上驗證成功了
手頭上沒有現成的8A8K電路板,但實際都是8A系列的,是一樣的
你對比一下
/*================================
Stc8a4k串口2測試程序
單片機型號:STC8A4K
波特率:9600
==================================*/
#include "Stc8a.h"
bit busy;
char wptr;
char rptr;
char buffer[16];
//===========================================================
//函數名:Delay1000ms()
//功能:延遲1s
void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 57;
        j = 27;
        k = 112;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
//===========================================================
void Uart2Isr() interrupt 8
{
    if (S2CON & S2TI)
    {
        S2CON &= ~S2TI;
        busy = 0;
    }
    if (S2CON & S2RI)
    {
        S2CON &= ~S2RI;
    }
}
//===========================================================
void Uart2Init()
{
    S2CON = 0x50;                //8位數據,可變波特率:9600
        AUXR &= 0xFB;                //定時器時鐘12T模式
        T2L = 0xE8;                //設置定時初始值
        T2H = 0xFF;                //設置定時初始值
        AUXR |= 0x10;                //定時器2開始計時
}
//===========================================================
void Uart2Send(char dat)
{
    while (busy);
    busy = 1;
    S2BUF = dat;
}
//===========================================================
void Uart2SendStr(char *p)
{
    while (*p!= '\0')
    {
        Uart2Send(*p++);
    }
}
//===========================================================
void main()
{
    Uart2Init();
    IE2 = 0x01;
    EA = 1;
    while (1)
    {      
            Uart2SendStr("Uart Test !\r\n");
            Delay1000ms();
    }
}
//===========================================================
回復

使用道具 舉報

12#
ID:560941 發表于 2021-10-20 14:47 | 只看該作者
Y_G_G 發表于 2021-10-18 20:36
以下是我用STC8A4K照著官方寫的,已經在開發板上驗證成功了
手頭上沒有現成的8A8K電路板,但實際都是8A系列 ...

嗯嗯,后來我也按照stc官方參考手冊改了程序,也成功了。問題在于我的程序是用的中斷標志位去設置等待發送完畢,官方手冊是用一個全局變量“busy”來設置等待發送完畢。可我就是想不通為什么用中斷標志位設置等待不可行呢?
回復

使用道具 舉報

13#
ID:560941 發表于 2021-10-20 14:47 | 只看該作者
188610329 發表于 2021-10-18 20:31
你整個程序, 除了 while(S2CON&S2TI==0); 寫錯之外,其他地方看下來都沒有問題.

要么,你換引腳看看?   ...

引腳換了也不行。。。。
回復

使用道具 舉報

14#
ID:401564 發表于 2021-10-20 15:13 | 只看該作者
mlz159357 發表于 2021-10-20 14:47
嗯嗯,后來我也按照stc官方參考手冊改了程序,也成功了。問題在于我的程序是用的中斷標志位去設置等待發 ...

這個串口2的中斷標志位位于9AH寄存器
這個寄存器不支持位尋址
&是按位與
所以,結果是怎么不重要,肯定不會是正確的
回復

使用道具 舉報

15#
ID:401564 發表于 2021-10-20 15:17 | 只看該作者
mlz159357 發表于 2021-10-20 14:47
嗯嗯,后來我也按照stc官方參考手冊改了程序,也成功了。問題在于我的程序是用的中斷標志位去設置等待發 ...

串口1的TI和RI支持位尋址,你可以試一下就知道我說的了
回復

使用道具 舉報

16#
ID:560941 發表于 2021-10-20 15:39 | 只看該作者
Y_G_G 發表于 2021-10-20 15:17
串口1的TI和RI支持位尋址,你可以試一下就知道我說的了

明白了,感覺有道理
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人在线观看 | 欧美一级免费看 | 久久九九影视 | 日韩三级一区 | 91精品国产综合久久久久久丝袜 | 免费三级网站 | 成人av免费 | 国产精品久久久久久亚洲调教 | 色婷婷综合久久久中字幕精品久久 | 一级毛片视频在线 | 欧美精三区欧美精三区 | 古装人性做爰av网站 | 日韩毛片 | 日韩尤物视频 | 亚洲区在线 | 欧美激情国产日韩精品一区18 | 97久久超碰| 羞羞网站在线免费观看 | 一区二区三区亚洲精品国 | 欧美操操操 | 日韩成人精品在线 | 国产精品久久精品 | av中文字幕网 | 久久久精品视频一区二区三区 | 久久精品一区二区三区四区 | 91欧美激情一区二区三区成人 | 欧产日产国产精品国产 | 欧美一区二区三区大片 | 中文字幕在线中文 | 国产精品久久久久久久久久久久久久 | 激情小视频 | 国产精品美女久久久久久免费 | 天堂一区二区三区 | 美女二区 | 国产一区影院 | 你懂的国产 | 亚洲精品短视频 | 成人亚洲网 | 欧美性tv | 免费观看av网站 | 亚洲精品女人久久久 |