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

標題: 求大神看看為什么串口發不了對應的數據 [打印本頁]

作者: cjtdz    時間: 2026-3-18 17:14
標題: 求大神看看為什么串口發不了對應的數據
用三個鍵,控制兩個LED,按下不同的按鍵,對應的LED亮,同時分別發出01/02/03,編譯通過,就是發不出數據,求指點:
#include "STC15.H"

// 引腳定義
sbit K1  = P1^3;
sbit K2  = P1^4;
sbit K3  = P1^2;
sbit LED1= P1^0;
sbit LED2= P1^1;

// 10ms消抖延時(11.0592MHz)
void Delay10ms(void)
{
    unsigned char i, j;
    i = 108;
    j = 145;
    do { while (--j); } while (--i);
}

// 串口初始化

   void Uart1_Init(void)        //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x40;                //定時器時鐘1T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        TMOD &= 0x0F;                //設置定時器模式
        TL1 = 0xE0;                        //設置定時初始值
        TH1 = 0xFE;                        //設置定時初始值
        ET1 = 0;                        //禁止定時器中斷
        TR1 = 1;                        //定時器1開始計時
}


// 串口發送字節
void Uart1_SendByte(unsigned char dat)
{
    SBUF = dat;
    while(!TI);  // 等待發送完成
    TI = 0;
}

void main(void)
{
    unsigned char key_val;

    // 配置P1口為推挽輸出(LED/按鍵引腳)
    P1M0 = 0xFF;
    P1M1 = 0x00;

    Uart1_Init();       // 初始化串口
    LED1 = 1;
    LED2 = 1;

    // 上電發送測試字節(驗證串口通)
    Uart1_SendByte(0xAA);

    while(1)
    {
        // 按鍵掃描
        if(K1 == 0 || K2 == 0 || K3 == 0)
        {
            Delay10ms();
            if(K1 == 0)   
                                                        key_val = 1;
            else if(K2 == 0)
                                                        key_val = 2;
            else if(K3 == 0)
                                                        key_val = 3;
            else            
                                                        key_val = 0;
        }
        else
        {
            key_val = 0;
        }

        // 按鍵處理
        switch(key_val)
        {
            case 1:
                LED1 = 0;
                                                                Uart1_SendByte(0x01);
                                                                Delay10ms();
                                                                LED1 = 1;
                while(K1 == 0); // 等待松開
                break;
            case 2:
                LED2 = 0;
                                                                Uart1_SendByte(0x02);
                                                                Delay10ms();
                                                                LED2 = 1;
                while(K2 == 0);
                break;
            case 3:
                LED1=0;
                                                                LED2=0;
                                                                Uart1_SendByte(0x03);
                                                                Delay10ms();
                                                                LED1=1;
                                                                LED2=1;
                while(K3 == 0);
                break;
            default:
                LED1 = 1;
                                                                LED2 = 1;
                break;
        }
    }
}


作者: wjfw    時間: 2026-3-18 18:34
沒有dat=1,=2,=3,
作者: cjtdz    時間: 2026-3-18 18:47
wjfw 發表于 2026-3-18 18:34
沒有dat=1,=2,=3,

   有帶參的
   Uart1_SendByte(0x01);
    Uart1_SendByte(0x02);
    Uart1_SendByte(0x03);

作者: wjfw    時間: 2026-3-18 19:12
允許串口中斷呢?好像也沒有
作者: cjtdz    時間: 2026-3-18 19:30
wjfw 發表于 2026-3-18 19:12
允許串口中斷呢?好像也沒有

串口通信可以用中斷,也可以不用中斷
作者: newlined    時間: 2026-3-19 00:11
串口用的哪個管腳?有的單片機默認是高阻,配置為準雙向看看?
作者: wjfw    時間: 2026-3-19 09:33
cjtdz 發表于 2026-3-18 19:30
串口通信可以用中斷,也可以不用中斷

哦,那我也不懂啊,讓你見笑了
作者: 人中狼    時間: 2026-3-19 09:49
P1口設置為輸出,怎么檢測按鍵
作者: wjfw    時間: 2026-3-19 10:10
人中狼 發表于 2026-3-19 09:49
P1口設置為輸出,怎么檢測按鍵

都是雙向口,,先看看成熟的例子或者實驗班附帶的例程,或許會有收獲,
作者: 人中狼    時間: 2026-3-19 10:38
wjfw 發表于 2026-3-19 10:10
都是雙向口,,先看看成熟的例子或者實驗班附帶的例程,或許會有收獲,

挺好,看來你沒用過STC或NXP的51單片機
作者: 太陽雨ZW    時間: 2026-3-19 10:40
P1M0 = 0x03; P1M1 = 0x00;  
LED1,LED2配置為推挽。K1,K2,K3配置為準雙向口
作者: xiaobendan001    時間: 2026-3-19 11:10
人中狼 發表于 2026-3-19 09:49
P1口設置為輸出,怎么檢測按鍵

看電路的,按鍵直接連接,對于推挽口也可以用的,雖然不建議這樣搞。但是30MA的電流對于開關也沒啥壓力的。
作者: WL0123    時間: 2026-3-19 15:48
cjtdz 發表于 2026-3-18 19:30
串口通信可以用中斷,也可以不用中斷
  1. #include "STC15.H"

  2. // 引腳定義

  3. sbit K1  = P1^3;
  4. sbit K2  = P1^4;
  5. sbit K3  = P1^2;

  6. bit sign=0;
  7. bit flag=0;
  8. unsigned char key_val=0;
  9. // 10ms消抖延時(11.0592MHz)
  10. void Delay10ms(void)
  11. {
  12.     unsigned char i, j;
  13.     i = 108;
  14.     j = 145;
  15.     do { while (--j); } while (--i);
  16. }

  17. // 串口初始化

  18. void Uart1_Init(void)        //9600bps@11.0592MHz
  19. {
  20.         SCON = 0x50;                //8位數據,可變波特率
  21.         AUXR |= 0x40;                //定時器時鐘1T模式
  22.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  23.         TMOD &= 0x0F;                //設置定時器模式
  24.         TL1 = 0xE0;                        //設置定時初始值
  25.         TH1 = 0xFE;                        //設置定時初始值
  26.         ET1 = 0;                        //禁止定時器中斷
  27.         TR1 = 1;                        //定時器1開始計時
  28.         TI = 0;
  29. }


  30. // 串口發送字節
  31. void Uart1_SendByte(unsigned char dat)
  32. {
  33.         SBUF = dat;
  34.         while(!TI);  // 等待發送完成
  35.         TI = 0;
  36. }

  37. void main(void)
  38. {
  39.         P0M0 = 0x00;P0M1 = 0x00;
  40.         P1M0 = 0x00;P1M1 = 0x00;
  41.         P2M0 = 0x00;P2M1 = 0x00;
  42.         P3M0 = 0x00;P3M1 = 0x00;
  43.         P4M0 = 0x00;P4M1 = 0x00;
  44.         P5M0 = 0x00;P5M1 = 0x00;
  45.         P6M0 = 0x00;P6M1 = 0x00;
  46.         P7M0 = 0x00;P7M1 = 0x00;
  47.         Uart1_Init();       // 初始化串口


  48.         // 上電發送測試字節(驗證串口通)
  49.         Uart1_SendByte(0xAA);
  50.        
  51.         while(1)
  52.         {
  53.                 // 按鍵掃描
  54.                 if(!K1||!K2||!K3)
  55.                 {
  56.                         Delay10ms();
  57.                         if((!K1||!K2||!K3)&& !sign)
  58.                         {
  59.                                 sign=1;
  60.                                 if(!K1)key_val = 1;
  61.                                 else if(!K2)key_val = 2;
  62.                                 else if(!K3)key_val = 3;
  63.                                 flag=1;
  64.                         }       
  65.                 }
  66.                 else sign=0;               
  67.                 if(flag==1)
  68.                 {       
  69.                         Uart1_SendByte(key_val);
  70.                         P1&=0xfc;
  71.                         P1|=~key_val;
  72.                         flag=0;
  73.                         key_val = 0;
  74.                 }
  75.         }
  76. }
復制代碼

作者: cjtdz    時間: 2026-3-19 20:58
可能STC15W202S沒有定時器1,但是換成定時器0也不行

作者: WL0123    時間: 2026-3-19 21:25
cjtdz 發表于 2026-3-19 20:58
可能STC15W202S沒有定時器1,但是換成定時器0也不行

定時器2
void Uart2_Init(void)        //9600bps@11.0592MHz
{
        S2CON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x04;                //定時器時鐘1T模式
        T2L = 0xE0;                        //設置定時初始值
        T2H = 0xFE;                        //設置定時初始值
        AUXR |= 0x10;                //定時器2開始計時
}

作者: ppcbug    時間: 2026-3-22 12:42
正好臨時用一下 51 , 就順手試了一下。
這個程序 串口 確實 不正常。
只要把 初始化 中三行  換掉, 就實測完全 OK了:

        TMOD=0x20;                   // 9600
        TH1=0xfd;
        TL1=0xfd;

原因請自己找吧。

作者: xiaobendan001    時間: 2026-3-22 18:48
ppcbug 發表于 2026-3-22 12:42
正好臨時用一下 51 , 就順手試了一下。
這個程序 串口 確實 不正常。
只要把 初始化 中三行  換掉, 就 ...

樓主的初始化代碼是工具軟件給出的
貌似不行?
要選8位自動重載才行?
作者: 188610329    時間: 2026-3-22 20:57
cjtdz 發表于 2026-3-19 20:58
可能STC15W202S沒有定時器1,但是換成定時器0也不行

STC15系列的串口用不了 定時器0,沒有定時器1,你只能換成定時器2。




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