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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1139|回復: 8
收起左側

51單片機串口通信求助

[復制鏈接]
ID:962485 發表于 2024-4-20 15:13 | 顯示全部樓層 |閱讀模式
為何手動選擇數據不能發送,串口助手接收到的全是null或者亂碼,接收中斷返回來的又正確
#include "reg52.h"

typedef unsigned int u16;        //對系統默認數據類型進行重定義
typedef unsigned char u8;




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

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

}


// 發送單個字符的函數
void uart_send_char(u8 da1)
{
    while(TI); // 等待上次發送完成(通過檢查TI標志)
    SBUF = da1; // 將字符放入發送緩沖區SBUF
          while(!TI);                //等待發送數據完成
          TI=0;                        //清除發送完成標志位       
}

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

/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/

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


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


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


回復

使用道具 舉報

ID:883242 發表于 2024-4-20 16:42 | 顯示全部樓層
能收說明波特率對,發送的數據接收錯誤,可能是停止位時間不夠。
回復

使用道具 舉報

ID:1116897 發表于 2024-4-20 22:11 | 顯示全部樓層
你串口助手顯示奇怪漢字還是符號啊,調一下串口助手,選文本顯示呢,別選信息位啥的,發個數字看看
回復

使用道具 舉報

ID:1116897 發表于 2024-4-20 22:25 | 顯示全部樓層
我沒看出來什么錯,估計是串口助手沒調對,這是我之前寫的
  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. }
復制代碼
回復

使用道具 舉報

ID:384109 發表于 2024-4-21 16:31 | 顯示全部樓層
去掉串口中斷函數
回復

使用道具 舉報

ID:962485 發表于 2024-4-21 18:30 | 顯示全部樓層
DC大魔王 發表于 2024-4-20 22:11
你串口助手顯示奇怪漢字還是符號啊,調一下串口助手,選文本顯示呢,別選信息位啥的,發個數字看看

先謝謝老哥,不過即使我不放循環里只跑一次他還是一直重復發送空值回來,有時候又亂碼,請問老哥有解嗎
回復

使用道具 舉報

ID:962485 發表于 2024-4-21 18:30 | 顯示全部樓層
DC大魔王 發表于 2024-4-20 22:25
我沒看出來什么錯,估計是串口助手沒調對,這是我之前寫的
#include
#define u8 unsigned char

謝謝,我學習一下你的
回復

使用道具 舉報

ID:962485 發表于 2024-4-21 18:31 | 顯示全部樓層
Hephaestus 發表于 2024-4-20 16:42
能收說明波特率對,發送的數據接收錯誤,可能是停止位時間不夠。

這個停止位時間怎么弄呢,請問老哥
回復

使用道具 舉報

ID:962485 發表于 2024-4-21 22:09 | 顯示全部樓層
解決了,各位,是因為采用12Mhz晶振的問題,采用9600比特率通信誤差太大不穩定之類的void ,采用4800比特率,同時對串口通信的操作從底層開始
void uartSendData(u8 ucData)
{
    u8 ucCnt;
    UART_TX_LOW(); //串口起始位開始
    TR1 = 1; //定時器1開始計時
    ET1 = 1; //使能定時器1中斷
    bUartFlag = ON;
    while(bUartFlag == ON);
        /*
         *由地位開始,將數據通過串口輸出
        */
    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;
}
記錄一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美中文字幕在线观看 | 春色av| 一级少妇女片 | 国产a区 | www.狠狠操| 蜜桃毛片 | 亚洲天堂999| 久久伊人精品一区二区三区 | 久久精品国产一区 | 人人玩人人添人人澡欧美 | 久久伊人精品一区二区三区 | 成人免费一级视频 | 日本不卡在线观看 | 欧美在线a | 毛片在线看片 | 亚洲精品日韩在线 | 一级做a爰片久久毛片免费看 | 色久电影 | 成人三级网址 | 亚洲精品一 | 欧美 日韩 国产 成人 | 91av在线看| 91大神在线资源观看无广告 | 欧美性久久 | 91精品国产综合久久福利软件 | 久久久久久免费毛片精品 | 99精品欧美一区二区三区综合在线 | 99精品免费| 国产91丝袜在线播放 | 日韩中文一区二区三区 | 国产日韩欧美一区 | 婷婷去俺也去 | 九九热国产精品视频 | 91在线精品一区二区 | 久久久精品一区 | 99一级毛片| 亚洲国产成人精品在线 | 欧美网站一区 | 成人精品一区二区户外勾搭野战 | 国产在线精品一区二区 | 亚洲一区久久 |