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

標題: 大家幫幫我看一下單片機串口通訊亂碼問題?有點搞不懂了 [打印本頁]

作者: 廖振基    時間: 2022-1-8 21:52
標題: 大家幫幫我看一下單片機串口通訊亂碼問題?有點搞不懂了
我的開發板晶振是12MHZ的,第一個是別人寫的,在2400波特率下可以正常通訊,第二個我的,在任何波特率下都是亂碼,大家幫我看下哪里不同了,謝謝大家了。                                                         
                                                                                                                /**************************************************************************************
實驗名稱:串口通信實驗
接線說明:        
實驗現象:下載程序后,當串口助手發送數據給單片機,單片機原封不動轉發給串口助手顯示
注意事項:使用黃色跳線帽將CH340旁的P5端子的UTX和P30短接,URX和P31短接,出廠默認已短接好                                                                                                                                                                  
***************************************************************************************/
#include "reg52.h"

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


/*******************************************************************************
* 函 數 名       : uart_init
* 函數功能                 : 串口通信中斷配置函數,通過設置TH和TL即可確定定時時間
* 輸    入       : baud:波特率對應的TH、TL裝載值
* 輸    出             : 無
*******************************************************************************/
void uart_init(u8 baud)
{
        TMOD|=0X20;        //設置計數器工作方式2
        SCON=0X50;        //設置為工作方式1
        PCON=0X80;        //波特率加倍
        TH1=0xe6;        //計數器初始值設置
        TL1=0xe6;
        ES=1;                //打開接收中斷
        EA=1;                //打開總中斷
        TR1=1;                //打開計數器               
}

/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        uart_init(0XFA);//波特率為2400

        while(1)
        {                        
                                                        
        }               
}

void uart() interrupt 4 //串口通信中斷函數
{
        u8 rec_data;

        RI = 0;                        //清除接收中斷標志位
        rec_data=SBUF;        //存儲接收到的數據
        SBUF=rec_data;        //將接收到的數據放入到發送寄存器
        while(!TI);                //等待發送數據完成
        TI=0;                        //清除發送完成標志位                                

}   

這是我的

  #include<reg52.h>
        #define uchar unsigned char
        #define uint unsigned int
        unsigned char flag, a, i;
        uchar code table[]="i get";
        void init()
        {
          TMOD=0x20;
          SCON=0x50;
         PCON=0x80;
         
          TH1=0xe6;
          TL1=0xe6;
          TR1=1;
           EA=1;
           ES=1;
         }

         void main()
         {
                   init();
                   while(1)
          {
         if(flag==1)
           {
                  ES=0;
                  for(i=0;i<6;i++)
           {
                        SBUF=table[ i];
                        while(!TI);
                         TI=0;

          }
                  SBUF=a;
                  while(!TI);
                  TI=0;
                  ES=1;
                  flag=0;
          }
          }

          }
          void ser() interrupt 4

          {
                 RI=0;
                   a=SBUF;
                   flag=1;
          }

作者: 188610329    時間: 2022-1-8 23:10
串口中斷里面放while……
  你想不亂碼……
只能  在上位機 一個字符一個字符 的發……
作者: zhangxiaozi    時間: 2022-1-9 14:19
過程錯誤,肯定是亂發的,中斷接到一個數,你在中斷發了一個數,也不管它發完了,程序到主程序又開始發送,中斷里的數肯定沒發完,主程序發了一數后,又進中斷了,中斷又發,中斷不讓主程序過好日子,主程序也不讓中斷過好日子,你發不完,我就發,總之大家都沒好日子過!
作者: zhangxiaozi    時間: 2022-1-9 14:25
我看錯了,中斷不是發,主程序也禁止串口中斷了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1