找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1042|回复: 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 单片机教程网

快速回复 返回顶部 返回列表