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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1175|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)串口通信求助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:962485 發(fā)表于 2024-4-20 15:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
為何手動(dòng)選擇數(shù)據(jù)不能發(fā)送,串口助手接收到的全是null或者亂碼,接收中斷返回來(lái)的又正確
#include "reg52.h"

typedef unsigned int u16;        //對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類(lèi)型進(jìn)行重定義
typedef unsigned char u8;




void delay_1_second(void)
{
    unsigned int i, j;
    for (i = 0; i < 12000; i++) { // 假設(shè)每個(gè)大循環(huán)約耗時(shí)1ms
        for (j = 0; j < 120; j++) { // 這里是填充的小循環(huán),具體數(shù)量需要根據(jù)實(shí)際情況調(diào)整
            // 空循環(huán),用于消耗時(shí)間
        }
    }
}

/*******************************************************************************
* 函 數(shù) 名       : uart_init
* 函數(shù)功能                 : 串口通信中斷配置函數(shù),通過(guò)設(shè)置TH和TL即可確定定時(shí)時(shí)間
* 輸    入       : baud:波特率對(duì)應(yīng)的TH、TL裝載值
* 輸    出             : 無(wú)
*******************************************************************************/
void uart_init(void)
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        TMOD &= 0x0F;                //清除定時(shí)器1模式位
        TMOD |= 0x20;                //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
        TL1 = 0xFD;                        //設(shè)定定時(shí)初值
        TH1 = 0xFD;                        //設(shè)定定時(shí)器重裝值               
        TR1 = 1;                        //啟動(dòng)定時(shí)器1
        ET1 = 0;                //禁止定時(shí)器1中斷
        EA=1;                                //開(kāi)放總中斷
        ES=1;                                //開(kāi)放串口中斷

}


// 發(fā)送單個(gè)字符的函數(shù)
void uart_send_char(u8 da1)
{
    while(TI); // 等待上次發(fā)送完成(通過(guò)檢查T(mén)I標(biāo)志)
    SBUF = da1; // 將字符放入發(fā)送緩沖區(qū)SBUF
          while(!TI);                //等待發(fā)送數(shù)據(jù)完成
          TI=0;                        //清除發(fā)送完成標(biāo)志位       
}

void uart_send_string(const char *str)
{
    while(*str) // 遍歷字符串直到遇到結(jié)束符'\0'
    {
        uart_send_char(*str++); // 發(fā)送當(dāng)前字符,并指向下一個(gè)字符
    }
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無(wú)
* 輸    出             : 無(wú)
*******************************************************************************/

void main()
{       
        uart_init();//波特率為9600
//char s2 = "ssss";


        while(1)
        {               
                uart_send_char('x');
                delay_1_second();
        }               
}


void uart() interrupt 4 //串口通信中斷函數(shù)
{
        u8 rec_data;
        RI = 0;                        //清除接收中斷標(biāo)志位
        rec_data=SBUF;        //存儲(chǔ)接收到的數(shù)據(jù)
        SBUF=rec_data;        //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while(!TI);                //等待發(fā)送數(shù)據(jù)完成
        TI=0;                        //清除發(fā)送完成標(biāo)志位                               
}


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

使用道具 舉報(bào)

沙發(fā)
ID:883242 發(fā)表于 2024-4-20 16:42 | 只看該作者
能收說(shuō)明波特率對(duì),發(fā)送的數(shù)據(jù)接收錯(cuò)誤,可能是停止位時(shí)間不夠。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1116897 發(fā)表于 2024-4-20 22:11 | 只看該作者
你串口助手顯示奇怪漢字還是符號(hào)啊,調(diào)一下串口助手,選文本顯示呢,別選信息位啥的,發(fā)個(gè)數(shù)字看看
回復(fù)

使用道具 舉報(bào)

地板
ID:1116897 發(fā)表于 2024-4-20 22:25 | 只看該作者
我沒(méi)看出來(lái)什么錯(cuò),估計(jì)是串口助手沒(méi)調(diào)對(duì),這是我之前寫(xiě)的
  1. #include <reg52.h>
  2. #define u8 unsigned char
  3. #define u16 unsigned int   
  4. u8  table[]="2";
  5. u8 a,flag;
  6. void Tim1_Init();
  7. void Serial_Init();
  8. void Serial_Interrupt_Init();
  9. void delay(u16 time_out)
  10. {
  11.     while(time_out--);
  12. }
  13. void main()
  14. {

  15.     u8 i;
  16.     Tim1_Init();
  17.     Serial_Init();
  18.     Serial_Interrupt_Init();   
  19.     while(1)
  20.     {
  21.         if(flag==1)
  22.         {
  23.         
  24.             for(i=0;i<1;i++)
  25.             {
  26.                 SBUF=table[i];
  27.                
  28.                 while(!TI);
  29.             
  30.                 TI=0;
  31.             }
  32.         
  33.             TI=0;
  34.             flag=0;
  35.         }
  36.      delay(1000);
  37.     }
  38. }

  39. void Tim1_Init()
  40. {
  41.     TMOD=0x20;
  42.     PCON=0X80;            
  43.     //波特率為9600 STC89C51 11.052MHZ
  44.     TH1=0xfA;
  45.     TL1=TH1;
  46.     TR1=1;
  47. }
  48. void Serial_Init()
  49. {
  50.     SM0=0;
  51.     SM1=1;
  52.     REN=1;
  53. }

  54. void Serial_Interrupt_Init()
  55. {
  56.     ES=1;
  57.     EA=1;
  58. }
  59. void Serial_Interrupt() interrupt 4
  60. {
  61.     RI=0;
  62.     a=SBUF;
  63.     flag=1;
  64. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:384109 發(fā)表于 2024-4-21 16:31 | 只看該作者
去掉串口中斷函數(shù)
回復(fù)

使用道具 舉報(bào)

6#
ID:962485 發(fā)表于 2024-4-21 18:30 | 只看該作者
DC大魔王 發(fā)表于 2024-4-20 22:11
你串口助手顯示奇怪漢字還是符號(hào)啊,調(diào)一下串口助手,選文本顯示呢,別選信息位啥的,發(fā)個(gè)數(shù)字看看

先謝謝老哥,不過(guò)即使我不放循環(huán)里只跑一次他還是一直重復(fù)發(fā)送空值回來(lái),有時(shí)候又亂碼,請(qǐng)問(wèn)老哥有解嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:962485 發(fā)表于 2024-4-21 18:30 | 只看該作者
DC大魔王 發(fā)表于 2024-4-20 22:25
我沒(méi)看出來(lái)什么錯(cuò),估計(jì)是串口助手沒(méi)調(diào)對(duì),這是我之前寫(xiě)的
#include
#define u8 unsigned char

謝謝,我學(xué)習(xí)一下你的
回復(fù)

使用道具 舉報(bào)

8#
ID:962485 發(fā)表于 2024-4-21 18:31 | 只看該作者
Hephaestus 發(fā)表于 2024-4-20 16:42
能收說(shuō)明波特率對(duì),發(fā)送的數(shù)據(jù)接收錯(cuò)誤,可能是停止位時(shí)間不夠。

這個(gè)停止位時(shí)間怎么弄呢,請(qǐng)問(wèn)老哥
回復(fù)

使用道具 舉報(bào)

9#
ID:962485 發(fā)表于 2024-4-21 22:09 | 只看該作者
解決了,各位,是因?yàn)椴捎?2Mhz晶振的問(wèn)題,采用9600比特率通信誤差太大不穩(wěn)定之類(lèi)的void ,采用4800比特率,同時(shí)對(duì)串口通信的操作從底層開(kāi)始
void uartSendData(u8 ucData)
{
    u8 ucCnt;
    UART_TX_LOW(); //串口起始位開(kāi)始
    TR1 = 1; //定時(shí)器1開(kāi)始計(jì)時(shí)
    ET1 = 1; //使能定時(shí)器1中斷
    bUartFlag = ON;
    while(bUartFlag == ON);
        /*
         *由地位開(kāi)始,將數(shù)據(jù)通過(guò)串口輸出
        */
    for (ucCnt = 0; ucCnt < 8; ucCnt++)
        {
        UART_TX_SET(ucData & 0x01);
        ucData >>= 1;
        bUartFlag = ON;
        while(bUartFlag == ON);
    }
    UART_TX_HIGH();
    bUartFlag = ON;
    while(bUartFlag == ON);
    TR1 = 0;
    ET1 = 0;
}
記錄一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲美乳中文字幕 | 日韩视频在线免费观看 | 精品成人在线观看 | 久久精品99国产精品日本 | 污免费网站 | 一区二区在线 | av天天干| av一区二区三区 | 欧美日韩在线一区二区 | 日本精品一区二区三区在线观看视频 | 欧美在线观看网站 | 欧美亚洲国语精品一区二区 | 久久草视频 | 午夜天堂精品久久久久 | 国产欧美精品一区二区色综合朱莉 | 国产aⅴ精品 | 91一区 | 欧美日韩国产综合在线 | 日韩超碰 | 在线播放国产一区二区三区 | 日本欧美国产 | 国产精品久久久久一区二区三区 | 好姑娘影视在线观看高清 | 四色永久| 性天堂网 | 国产精品成人在线 | 国产97在线视频 | 色欧美片视频在线观看 | 欧美一区二区三区精品免费 | 午夜视频在线 | 国产japanhdxxxx麻豆 | 婷婷狠狠 | 日韩精品视频一区二区三区 | 欧美一级久久 | 超级乱淫av片免费播放 | 国产毛片久久久久久久久春天 | 91视频网 | 99国产精品视频免费观看一公开 | 中文一区 | 国产激情片在线观看 | 韩国理论电影在线 |