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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 702|回復: 17
打印 上一主題 下一主題
收起左側

求大神看看為什么串口發不了對應的數據

[復制鏈接]
跳轉到指定樓層
樓主
ID:33548 發表于 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;
        }
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:123917 發表于 2026-3-18 18:34 | 只看該作者
沒有dat=1,=2,=3,
回復

使用道具 舉報

板凳
ID:33548 發表于 2026-3-18 18:47 | 只看該作者

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

使用道具 舉報

地板
ID:123917 發表于 2026-3-18 19:12 | 只看該作者
允許串口中斷呢?好像也沒有
回復

使用道具 舉報

5#
ID:33548 發表于 2026-3-18 19:30 | 只看該作者
wjfw 發表于 2026-3-18 19:12
允許串口中斷呢?好像也沒有

串口通信可以用中斷,也可以不用中斷
回復

使用道具 舉報

6#
ID:227818 發表于 2026-3-19 00:11 | 只看該作者
串口用的哪個管腳?有的單片機默認是高阻,配置為準雙向看看?
回復

使用道具 舉報

7#
ID:123917 發表于 2026-3-19 09:33 | 只看該作者
cjtdz 發表于 2026-3-18 19:30
串口通信可以用中斷,也可以不用中斷

哦,那我也不懂啊,讓你見笑了
回復

使用道具 舉報

8#
ID:384109 發表于 2026-3-19 09:49 | 只看該作者
P1口設置為輸出,怎么檢測按鍵
回復

使用道具 舉報

9#
ID:123917 發表于 2026-3-19 10:10 | 只看該作者
人中狼 發表于 2026-3-19 09:49
P1口設置為輸出,怎么檢測按鍵

都是雙向口,,先看看成熟的例子或者實驗班附帶的例程,或許會有收獲,
回復

使用道具 舉報

10#
ID:384109 發表于 2026-3-19 10:38 | 只看該作者
wjfw 發表于 2026-3-19 10:10
都是雙向口,,先看看成熟的例子或者實驗班附帶的例程,或許會有收獲,

挺好,看來你沒用過STC或NXP的51單片機
回復

使用道具 舉報

11#
ID:1136941 發表于 2026-3-19 10:40 | 只看該作者
P1M0 = 0x03; P1M1 = 0x00;  
LED1,LED2配置為推挽。K1,K2,K3配置為準雙向口
回復

使用道具 舉報

12#
ID:1109793 發表于 2026-3-19 11:10 | 只看該作者
人中狼 發表于 2026-3-19 09:49
P1口設置為輸出,怎么檢測按鍵

看電路的,按鍵直接連接,對于推挽口也可以用的,雖然不建議這樣搞。但是30MA的電流對于開關也沒啥壓力的。
回復

使用道具 舉報

13#
ID:1133081 發表于 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. }
復制代碼
回復

使用道具 舉報

14#
ID:33548 發表于 2026-3-19 20:58 | 只看該作者
可能STC15W202S沒有定時器1,但是換成定時器0也不行
回復

使用道具 舉報

15#
ID:1133081 發表于 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開始計時
}
回復

使用道具 舉報

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

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

原因請自己找吧。
回復

使用道具 舉報

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

樓主的初始化代碼是工具軟件給出的
貌似不行?
要選8位自動重載才行?
回復

使用道具 舉報

18#
ID:624769 發表于 2026-3-22 20:57 | 只看該作者
cjtdz 發表于 2026-3-19 20:58
可能STC15W202S沒有定時器1,但是換成定時器0也不行

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表