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

QQ登錄

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

搜索
查看: 4364|回復(fù): 18
收起左側(cè)

為什么STC8F單片機(jī)串口通訊發(fā)不出去啊?

[復(fù)制鏈接]
ID:735654 發(fā)表于 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; /*啟動(dòng)內(nèi)部擴(kuò)展區(qū)寄存器訪問(wèn)功能*/
  20.   XOSCCR|=0xc0; /*啟動(dòng)外部晶振*/
  21.   while(!(XOSCCR & 1)); /*待晶振頻率穩(wěn)定*/
  22.   CLKDIV=0x00; /*晶振不分頻*/
  23.   CKSEL=0x01; /*選用外部晶振*/
  24.   }
  25. SCON=0x50;   /*設(shè)定串口工作方式*/
  26. PCON=0x7f;  /*波特率不倍速*/
  27. TMOD|=0x20;  /*設(shè)置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; /*啟動(dòng)定時(shí)器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中斷設(shè)置為高優(yōu)先*/
  60.         IPH=0x10; /*將串口1中斷設(shè)置為最高優(yōu)先*/
  61.         }
  62.   }
  63. REN=1; /*允許接收串口數(shù)據(jù)*/
  64. EA=1;  /*打開(kāi)總中斷*/
  65. ES=1; /*打開(kāi)串口中斷*/
  66. P3M1=0x01; /*00000001*/
  67. P3M0=0x02; /*00000010,將串口接收口設(shè)為高阻輸入模式,發(fā)送口設(shè)置為強(qiáng)推挽模式*/
  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. }
復(fù)制代碼


/*下面是主程序*/
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

我已經(jīng)焦頭爛額了,比這簡(jiǎn)單的都搞過(guò)了,就TM是發(fā)布出去啊!
回復(fù)

使用道具 舉報(bào)

ID:822755 發(fā)表于 2020-12-18 19:24 | 顯示全部樓層
那是因?yàn)镻_SW2沒(méi)有在設(shè)置外部時(shí)鐘后,沒(méi)有P_SW2=0,恢復(fù)操作傳統(tǒng)寄存器。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:735654 發(fā)表于 2020-12-19 13:58 | 顯示全部樓層
本帖最后由 翼龍俠 于 2020-12-19 14:06 編輯
KongQuan 發(fā)表于 2020-12-18 19:24
那是因?yàn)镻_SW2沒(méi)有在設(shè)置外部時(shí)鐘后,沒(méi)有P_SW2=0,恢復(fù)操作傳統(tǒng)寄存器。

謝謝啊,不過(guò)設(shè)置了也不行啊
回復(fù)

使用道具 舉報(bào)

ID:863358 發(fā)表于 2020-12-19 14:17 | 顯示全部樓層
試著一部分一部分的來(lái),看看是哪部分出了問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:735654 發(fā)表于 2020-12-19 16:32 | 顯示全部樓層
我簡(jiǎn)化了一下。
  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;   /*設(shè)定串口工作方式*/
  18. PCON=0x7f;  /*波特率不倍速*/
  19. TMOD|=0x20;  /*設(shè)置T0T1寄存器*/
  20. AUXR=0xfc;  /*配置輔助寄存器*/
  21. TL1=TH1=0xb8;
  22. REN=1; /*允許接收串口數(shù)據(jù)*/
  23. EA=1;  /*打開(kāi)總中斷*/
  24. ES=1; /*打開(kāi)串口中斷*/
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:822755 發(fā)表于 2020-12-19 22:56 | 顯示全部樓層
翼龍俠 發(fā)表于 2020-12-19 16:32
我簡(jiǎn)化了一下。

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

使用道具 舉報(bào)

ID:735654 發(fā)表于 2020-12-20 13:52 | 顯示全部樓層
KongQuan 發(fā)表于 2020-12-19 22:56
你是沒(méi)理解P_SW2=0的作用吧。亂放位置。
  P_SW2 = 0x80; /*啟動(dòng)內(nèi)部擴(kuò)展區(qū)寄存器訪問(wèn)功能*/
  XOSCCR| ...

我已經(jīng)不用外部晶振了,P_SW2 = 0;我也寫(xiě)了
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:453974 發(fā)表于 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;                  
}
回復(fù)

使用道具 舉報(bào)

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

要是電路問(wèn)題,根本燒不進(jìn)去!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:420836 發(fā)表于 2020-12-20 23:52 | 顯示全部樓層
試試不同的單片機(jī)時(shí)鐘頻率
回復(fù)

使用道具 舉報(bào)

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

我用11.0592 12 22.1184 24
回復(fù)

使用道具 舉報(bào)

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

再說(shuō)波特率不符的話(huà),會(huì)收到亂碼,而我的電腦上根本檢測(cè)不到單片機(jī)發(fā)來(lái)的字節(jié)!
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表