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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4500|回復: 18
收起左側

為什么STC8F單片機串口通訊發不出去啊?

[復制鏈接]
ID:735654 發表于 2020-12-16 19:44 | 顯示全部樓層 |閱讀模式
  1. /*UART.H*/
  2. #define uc unsigned char
  3. #define ui unsigned int
  4. #define ul unsigned long
  5. #define iuc idata unsigned char
  6. #define iui idata unsigned int
  7. #define iul idata unsigned long
  8. #define bt bit
  9. #define swch switch
  10. #define cs case
  11. #define whl while
  12. #define rtn return
  13. #define brk break
  14. #define itrpt interrupt

  15. uart_init(ul baud,ui prty,bt xos)
  16. {
  17. if(xos==1)
  18.   {
  19.   P_SW2|=0x80; /*啟動內部擴展區寄存器訪問功能*/
  20.   XOSCCR|=0xc0; /*啟動外部晶振*/
  21.   while(!(XOSCCR & 1)); /*待晶振頻率穩定*/
  22.   CLKDIV=0x00; /*晶振不分頻*/
  23.   CKSEL=0x01; /*選用外部晶振*/
  24.   }
  25. SCON=0x50;   /*設定串口工作方式*/
  26. PCON=0x7f;  /*波特率不倍速*/
  27. TMOD|=0x20;  /*設置T0T1寄存器*/
  28. AUXR=0xfc;  /*配置輔助寄存器*/
  29. swch(baud)
  30.   {
  31.   cs 4800:   TH1=TL1=0x70;
  32.   cs 9600:   TH1=TL1=0xb8;
  33.   cs 19200:  TH1=TL1=0xdc;
  34.   cs 28800:  TH1=TL1=0xe8;
  35.   cs 38400:  TH1=TL1=0xee;
  36.   cs 57600:  TH1=TL1=0xf4;
  37.   cs 86400:  TH1=TL1=0xf8;
  38.   cs 115200: TH1=TL1=0xfa;
  39.   cs 230400: TH1=TL1=0xfd;
  40.   cs 460800: TH1=TL1=0xfe;
  41.   cs 691200: TH1=TL1=0xff;
  42.   }
  43. TR1=1; /*啟動定時器1*/
  44. swch(prty)
  45.   {
  46.   cs 0: {
  47.         PS=0;
  48.         IPH=0x00;
  49.         }
  50.   cs 1: {
  51.         PS=1;
  52.         IPH=0x00;
  53.         }
  54.   cs 2: {
  55.         PS=0;
  56.         IPH=0x10;
  57.         }
  58.   cs 3: {
  59.         PS=1;  /*將串口1中斷設置為高優先*/
  60.         IPH=0x10; /*將串口1中斷設置為最高優先*/
  61.         }
  62.   }
  63. REN=1; /*允許接收串口數據*/
  64. EA=1;  /*打開總中斷*/
  65. ES=1; /*打開串口中斷*/
  66. P3M1=0x01; /*00000001*/
  67. P3M0=0x02; /*00000010,將串口接收口設為高阻輸入模式,發送口設置為強推挽模式*/
  68. }

  69. uart_txd(uc udat[])
  70. {
  71. ui i;
  72. ui j=sizeof(udat);
  73. TI=RI=0;
  74. for(i=0;i<j;i++)
  75.   {
  76.   SBUF=udat[i];
  77.   while(TI==0)
  78.     {
  79.     ;
  80.     }
  81.   TI=0;
  82.   }
  83. }
復制代碼


/*下面是主程序*/
  1. #include <STC8x.H>
  2. #include <UART.H>

  3. iui k,j;
  4. iui txdbuf[13]={'H','E','L','L','O','\x20','W','O','R','L','D','!','\0'};

  5. main()
  6. {
  7. uart_init(9600,3,1);
  8. while(1)
  9.   {
  10.   uart_txd(txdbuf);
  11.   }
  12. }
復制代碼
回復

使用道具 舉報

ID:65956 發表于 2020-12-17 08:17 | 顯示全部樓層
你這個串口配置也搞得太麻煩了吧,先改用一個最簡單的試試,試可以發送后再去搞這種比較復雜配置的

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:735654 發表于 2020-12-18 18:25 | 顯示全部樓層
aking991 發表于 2020-12-17 08:17
你這個串口配置也搞得太麻煩了吧,先改用一個最簡單的試試,試可以發送后再去搞這種比較復雜配置的

我已經焦頭爛額了,比這簡單的都搞過了,就TM是發布出去啊!
回復

使用道具 舉報

ID:822755 發表于 2020-12-18 19:24 | 顯示全部樓層
那是因為P_SW2沒有在設置外部時鐘后,沒有P_SW2=0,恢復操作傳統寄存器。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:735654 發表于 2020-12-19 13:58 | 顯示全部樓層
本帖最后由 翼龍俠 于 2020-12-19 14:06 編輯
KongQuan 發表于 2020-12-18 19:24
那是因為P_SW2沒有在設置外部時鐘后,沒有P_SW2=0,恢復操作傳統寄存器。

謝謝啊,不過設置了也不行啊
回復

使用道具 舉報

ID:863358 發表于 2020-12-19 14:17 | 顯示全部樓層
試著一部分一部分的來,看看是哪部分出了問題
回復

使用道具 舉報

ID:735654 發表于 2020-12-19 16:32 | 顯示全部樓層
我簡化了一下。
  1. /*UART.H*/
  2. #define uc unsigned char
  3. #define ui unsigned int
  4. #define ul unsigned long
  5. #define iuc idata unsigned char
  6. #define iui idata unsigned int
  7. #define iul idata unsigned long
  8. #define bt bit
  9. #define swch switch
  10. #define cs case
  11. #define whl while
  12. #define rtn return
  13. #define brk break
  14. #define itrpt interrupt

  15. uart_init()
  16. {
  17. SCON=0x50;   /*設定串口工作方式*/
  18. PCON=0x7f;  /*波特率不倍速*/
  19. TMOD|=0x20;  /*設置T0T1寄存器*/
  20. AUXR=0xfc;  /*配置輔助寄存器*/
  21. TL1=TH1=0xb8;
  22. REN=1; /*允許接收串口數據*/
  23. EA=1;  /*打開總中斷*/
  24. ES=1; /*打開串口中斷*/
  25. P_SW1=0x00;
  26. }

  27. uart_txd(uc udat[])
  28. {
  29. ui i;
  30. ui j=sizeof(udat);
  31. TI=RI=0;
  32. for(i=0;i<j;i++)
  33.   {
  34.   SBUF=udat[i];
  35.   while(TI==0)
  36.     {
  37.     ;
  38.     }
  39.   TI=0;
  40.   }
  41. }
  42. /*主程序*/
  43. #include <STC8x.H>
  44. #include <UART.H>

  45. iui txdbuf[13]={'H','E','L','L','O','\x20','W','O','R','L','D','!','\0'};

  46. main()
  47. {
  48. uart_init();
  49. P_SW2=0x00;
  50. while(1)
  51.   {
  52.   uart_txd(txdbuf);
  53.   }
  54. }
復制代碼
回復

使用道具 舉報

ID:822755 發表于 2020-12-19 22:56 | 顯示全部樓層

你是沒理解P_SW2=0的作用吧。亂放位置。
  P_SW2 = 0x80; /*啟動內部擴展區寄存器訪問功能*/
  XOSCCR|=0xc0; /*啟動外部晶振*/
  while(!(XOSCCR & 1)); /*待晶振頻率穩定*/
  CLKDIV=0x00; /*晶振不分頻*/
  CKSEL=0x01; /*選用外部晶振*/
P_SW2 = 0;
回復

使用道具 舉報

ID:735654 發表于 2020-12-20 13:52 | 顯示全部樓層
KongQuan 發表于 2020-12-19 22:56
你是沒理解P_SW2=0的作用吧。亂放位置。
  P_SW2 = 0x80; /*啟動內部擴展區寄存器訪問功能*/
  XOSCCR| ...

我已經不用外部晶振了,P_SW2 = 0;我也寫了
回復

使用道具 舉報

ID:453974 發表于 2020-12-20 18:15 | 顯示全部樓層
試試吧,不行的話檢查一下電路
回復

使用道具 舉報

ID:453974 發表于 2020-12-20 18:19 | 顯示全部樓層
#include "STC8.H"
#include "intrins.h"


#define MAIN_Fosc                11059200L        
#define  uint32   unsigned long
#define  uint16   unsigned int  
#define  uint8    unsigned char  


                     
sbit led1=P0^0;            
sbit led2=P0^1;            


#define  TRUE    1
#define  FALSE   0
      
#define Buf_Max 50

volatile uint8 Flag=FALSE;

uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;                        
uint8 uart1temp;


void delay_ms(uint16 x)
{  
        uint16 j,i;   
        for(j=0;j<x;j++)   
        {   
                for(i=0;i<1100;i++);   
        }  
}


void Uart1_Init(void)
{               
        PCON &= 0x3f;               
        SCON = 0x50;               
        AUXR |= 0x40;               
        AUXR &= 0xfe;               
        TMOD &= 0x0f;               
        TMOD |= 0x20;               
        TL1 = 0xDC;                  
        TH1 = 0xDC;                  
        ET1 = 0;                    
        TR1 = 1;                    
        ES = 1;                                       
        EA = 1;                                       
}


void SendDataByUart1(uint8 dat)
{
    SBUF = dat;                 
        while(TI == 0);            
        TI = 0;                     
}


void USART1_Tx_Puts(void)
{
          if(Flag)               
        {      
                ES = 0;                                             
            SendDataByUart1(uart1temp);      
            SendDataByUart1(0x0D);            
            SendDataByUart1(0x0A);            
                ES = 1;                                 
                Flag=FALSE;                       
          }
}


int main()
{
          P3M1 &= 0xFE;        P3M0 &= 0xFE;                          
        P3M1 &= 0xFD;        P3M0 |= 0x02;                          

        Uart1_Init();

        while(1)
        {
                USART1_Tx_Puts();   
        }
}


void Uart1() interrupt 4 using 1
{
        ES = 0;                           
        Flag=TRUE;                  
        if (RI)                     
          {
              RI = 0;                 
                uart1temp = SBUF;      
           }
           if (TI)                    
           {
              TI = 0;                 
           }
        ES =  1;                  
}
回復

使用道具 舉報

ID:735654 發表于 2020-12-20 18:53 | 顯示全部樓層
累不死的狗 發表于 2020-12-20 18:15
試試吧,不行的話檢查一下電路

要是電路問題,根本燒不進去!
回復

使用道具 舉報

ID:278179 發表于 2020-12-20 23:44 | 顯示全部樓層
不知道你使用的晶振頻率時多少,和波特率是不是相符,重新都定義一下
回復

使用道具 舉報

ID:420836 發表于 2020-12-20 23:52 | 顯示全部樓層
試試不同的單片機時鐘頻率
回復

使用道具 舉報

ID:735654 發表于 2020-12-21 12:26 | 顯示全部樓層
TTQ001 發表于 2020-12-20 23:52
試試不同的單片機時鐘頻率

我用11.0592 12 22.1184 24
回復

使用道具 舉報

ID:735654 發表于 2020-12-21 12:27 | 顯示全部樓層
TTQ001 發表于 2020-12-20 23:52
試試不同的單片機時鐘頻率

再說波特率不符的話,會收到亂碼,而我的電腦上根本檢測不到單片機發來的字節!
回復

使用道具 舉報

ID:735654 發表于 2020-12-21 17:17 | 顯示全部樓層
TTQ001 發表于 2020-12-20 23:52
試試不同的單片機時鐘頻率

而且我用示波器看了,一直是高電平,檢測不到起始位的下降沿
回復

使用道具 舉報

ID:864875 發表于 2020-12-21 17:21 | 顯示全部樓層
可以看看串口接口是不是松掉了
回復

使用道具 舉報

ID:735654 發表于 2021-1-6 14:21 | 顯示全部樓層
已解決,謝謝大家!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天影视综合 | 成人妇女免费播放久久久 | 国产一二区视频 | 国产日韩欧美激情 | 成人精品网 | 91精品国产综合久久香蕉麻豆 | 三级av网址 | 成人九区 | 天天操天天射天天 | 国产成人免费在线 | 天天综合成人网 | 性高朝久久久久久久3小时 av一区二区三区四区 | 玖玖视频国产 | 亚洲精品视频二区 | 午夜成人免费视频 | 久久一区精品 | 成人国产精品久久久 | 在线看亚洲 | 日本小电影在线 | av网站观看| 国产精品久久久久久久久免费丝袜 | www久| 国产精品欧美一区二区 | 欧美精品在线播放 | 久久国产精品一区二区三区 | 欧美日韩黄色一级片 | 久久久久九九九女人毛片 | 亚洲电影在线播放 | 天堂色区 | 高清视频一区二区三区 | 日本一区二区三区在线观看 | 亚洲高清视频一区二区 | 亚洲啊v| 久久看看 | 黄a免费看 | 国产欧美日韩在线观看 | 欧美激情 一区 | 在线视频中文字幕 | 精品国产一区二区久久 | 精品国产乱码久久久久久果冻传媒 | 国产视频在线观看一区二区三区 |