找回密码
 立即注册
查看: 1863|回复: 9

STC15W4K48S4 P2 输出问题

[复制链接]

4

主题

8

回帖

51

积分

注册会员

积分
51
发表于 2023-3-10 11:10:32 | 显示全部楼层 |阅读模式

对于现供货的STC15W4K32S4系列A版本单片机的I/O口,请注意:
1. ...
2. PWM2PWM7相关的12口[ P3.7/PWM2, P2.1/PWM3, P2.2/PWM4, P2.3/PWM5, P1.6/ PWM6, P1.7/PWM7, P2.7/PWM2_2, P4.5/PWM3_2, P4.4/PWM4_2, P4.2/PWM5_2, P0.7/ PWM6_2, P0.6/PWM7_2 ],上电复位后是高阻输,要对外能输出,要软件将其改设强推挽输出或准向口/弱上拉
手册中有特别标注这段话,然而我尝试将 P2.1 P2.2 P2.3 设置为强推挽输出,仍无法顺利将这三只脚输出 1

并且读回的值也显示这三只脚为 0

截圖 2023-03-10 上午11.07.59.png

截圖 2023-03-10 上午11.08.31.png

截圖 2023-03-10 上午11.08.49.png

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-17 10:15:05

74

主题

6092

回帖

1万

积分

超级版主

积分
12731
发表于 2023-3-10 13:29:20 | 显示全部楼层
设置为推挽输出,可以用一个1K电阻,一端接IO,输出高电平则另一端接GND,输出低电平则另一端接VCC,测量此时电阻电压,至少4.5V@5V工作时。
如果电压很低,则没有设置正确。

4

主题

8

回帖

51

积分

注册会员

积分
51
发表于 2023-3-10 14:42:34 | 显示全部楼层
梁*** 发表于 2023-3-10 13:29
设置为推挽输出,可以用一个1K电阻,一端接IO,输出高电平则另一端接GND,输出低电平则另一端接VCC,测量此 ...

同样的硬件接法,我在 P2.0 P2.4 P2.5 P2.6 都可以

并且同样的程序我换到 STC15F2K60S2 就能输出 P2.1 P2.2 P2.3

这是为什么
  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-17 10:15:05

74

主题

6092

回帖

1万

积分

超级版主

积分
12731
发表于 2023-3-10 15:15:52 | 显示全部楼层
用下面3句程序测试,告诉我结果。如果仍然不正常,回寄样品,我看一下这个神奇的问题。

void main(void)
{
     P2M1 = 0x00;
     P2M0 = 0xff;
     P2 = 0xff;
         
     while(1)
     {
     }
}
  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

733

主题

1万

回帖

1万

积分

管理员

积分
16661
发表于 2023-3-10 15:22:33 | 显示全部楼层
你程序错了,先用下面这个  准双向口的测试程序测试下
1.png


1.png
可以直接下载进去测试
  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

733

主题

1万

回帖

1万

积分

管理员

积分
16661
发表于 2023-3-10 15:24:06 | 显示全部楼层

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
sbit P15 = P1^5;
sbit P16 = P1^6;
sbit P17 = P1^7;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
sbit P30 = P3^0;
sbit P31 = P3^1;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit P34 = P3^4;
sbit P35 = P3^5;
sbit P36 = P3^6;
sbit P37 = P3^7;

sfr P4   = 0xC0;
sbit P40 = P4^0;
sbit P41 = P4^1;
sbit P42 = P4^2;
sbit P43 = P4^3;
sbit P44 = P4^4;
sbit P45 = P4^5;
sbit P46 = P4^6;
sbit P47 = P4^7;

sfr P5   = 0xC8;
sbit P50 = P5^0;
sbit P51 = P5^1;
sbit P52 = P5^2;
sbit P53 = P5^3;
sbit P54 = P5^4;
sbit P55 = P5^5;
sbit P56 = P5^6;
sbit P57 = P5^7;

sfr P6   = 0xE8;
sbit P60 = P6^0;
sbit P61 = P6^1;
sbit P62 = P6^2;
sbit P63 = P6^3;
sbit P64 = P6^4;
sbit P65 = P6^5;
sbit P66 = P6^6;
sbit P67 = P6^7;

sfr P7   = 0xF8;
sbit P70 = P7^0;
sbit P71 = P7^1;
sbit P72 = P7^2;
sbit P73 = P7^3;
sbit P74 = P7^4;
sbit P75 = P7^5;
sbit P76 = P7^6;
sbit P77 = P7^7;

void delay()
{
    int i, j;

    for (i=0; i<1000; i++)
    for (j=0; j<500; j++);
}


void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    P10 = 0;
    delay();
    P10 = 1;
    P11 = 0;
    delay();
    P11 = 1;
    P12 = 0;
    delay();
    P12 = 1;
    P13 = 0;
    delay();
    P13 = 1;
    P14 = 0;
    delay();
    P14 = 1;
    P15 = 0;
    delay();
    P15 = 1;
    P16 = 0;
    delay();
    P16 = 1;
    P17 = 0;
    delay();
    P17 = 1;

//    P30 = 0;          //P3.0/P3.1为仿真口和USB下载口时不可演示
//    delay();
//    P30 = 1;
//    P31 = 0;
//    delay();
//    P31 = 1;
    P32 = 0;
    delay();
    P32 = 1;
    P33 = 0;
    delay();
    P33 = 1;
    P34 = 0;
    delay();
    P34 = 1;
    P35 = 0;
    delay();
    P35 = 1;
    P36 = 0;
    delay();
    P36 = 1;
    P37 = 0;
    delay();
    P37 = 1;

    P20 = 0;
    delay();
    P20 = 1;
    P21 = 0;
    delay();
    P21 = 1;
    P22 = 0;
    delay();
    P22 = 1;
    P23 = 0;
    delay();
    P23 = 1;
    P24 = 0;
    delay();
    P24 = 1;
    P25 = 0;
    delay();
    P25 = 1;
    P26 = 0;
    delay();
    P26 = 1;
    P27 = 0;
    delay();
    P27 = 1;

    P00 = 0;
    delay();
    P00 = 1;
    P01 = 0;
    delay();
    P01 = 1;
    P02 = 0;
    delay();
    P02 = 1;
    P03 = 0;
    delay();
    P03 = 1;
    P04 = 0;
    delay();
    P04 = 1;
    P05 = 0;
    delay();
    P05 = 1;
    P06 = 0;
    delay();
    P06 = 1;
    P07 = 0;
    delay();
    P07 = 1;

    P40 = 0;
    delay();
    P40 = 1;
    P41 = 0;
    delay();
    P41 = 1;
    P42 = 0;
    delay();
    P42 = 1;
    P43 = 0;
    delay();
    P43 = 1;
    P44 = 0;
    delay();
    P44 = 1;
    P45 = 0;
    delay();
    P45 = 1;
    P46 = 0;
    delay();
    P46 = 1;
    P47 = 0;
    delay();
    P47 = 1;

    P50 = 0;
    delay();
    P50 = 1;
    P51 = 0;
    delay();
    P51 = 1;
    P52 = 0;
    delay();
    P52 = 1;
    P53 = 0;
    delay();
    P53 = 1;
    P54 = 0;
    delay();
    P54 = 1;
    P55 = 0;
    delay();
    P55 = 1;
    P56 = 0;
    delay();
    P56 = 1;
    P57 = 0;
    delay();
    P57 = 1;

    P60 = 0;
    delay();
    P60 = 1;
    P61 = 0;
    delay();
    P61 = 1;
    P62 = 0;
    delay();
    P62 = 1;
    P63 = 0;
    delay();
    P63 = 1;
    P64 = 0;
    delay();
    P64 = 1;
    P65 = 0;
    delay();
    P65 = 1;
    P66 = 0;
    delay();
    P66 = 1;
    P67 = 0;
    delay();
    P67 = 1;

    P70 = 0;
    delay();
    P70 = 1;
    P71 = 0;
    delay();
    P71 = 1;
    P72 = 0;
    delay();
    P72 = 1;
    P73 = 0;
    delay();
    P73 = 1;
    P74 = 0;
    delay();
    P74 = 1;
    P75 = 0;
    delay();
    P75 = 1;
    P76 = 0;
    delay();
    P76 = 1;
    P77 = 0;
    delay();
    P77 = 1;

    while (1)
    {
        P0 = 0x00;
        delay();
        P0 = 0xff;

        P1 = 0x00;
        delay();
        P1 = 0xff;

        P3 = 0x03;          //P3.0/P3.1为仿真口和USB下载口时不可演示
        delay();
        P3 = 0xff;

        P2 = 0x00;
        delay();
        P2 = 0xff;

        P4 = 0x00;
        delay();
        P4 = 0xff;

        P5 = 0x00;
        delay();
        P5 = 0xff;

        P6 = 0x00;
        delay();
        P6 = 0xff;

        P7 = 0x00;
        delay();
        P7 = 0xff;
    }
}

4

主题

8

回帖

51

积分

注册会员

积分
51
发表于 2023-3-10 15:33:00 | 显示全部楼层
本帖最后由 shyhkaelo 于 2023-3-10 15:41 编辑
梁*** 发表于 2023-3-10 15:15
用下面3句程序测试,告诉我结果。如果仍然不正常,回寄样品,我看一下这个神奇的问题。

void main(void)

竟然可以了,是我什么中断设置导致的吗?

void GPIO_config()
{     
        //Port 0
        P0M0 |= 0x00;
        P0M1 |= 0x00;
        
        //Port 1
        P1M0 = 0x0F;
        P1M1 = 0x00;

        //Port 2
        P2M0 |= 0x7F;
        P2M1 |= 0x00;      
        
}

void serial_init()           //9600
{
        SCON = 0x50;             //8bit and variable baudrate
        AUXR |= 0x40;            //Timer1's clock is Fosc (1T)
        AUXR &= 0xFE;            //Use Timer1 as baudrate generator
        TMOD &= 0x0F;            //Set Timer1 as 16-bit auto reload mode
        TL1 = (65536 - (MAIN_Fosc/4/9600));//0xC7;              //Initial timer value
        TH1 = (65536 - (MAIN_Fosc/4/9600))>>8;//0xFE;              //Initial timer value
        ET1 = 0;                 //Disable Timer1 interrupt
        TR1 = 1;                 //Timer1 running
        TI = 1;
        ES = 1;
        EA = 1;
}

void Timer0_init()
{
  TR0 = 0;  

  #if (Timer0_Reload < 64)  
    #error "Timer0 too fast!"   

  #elif ((Timer0_Reload/12) < 65536UL)  
    ET0 = 1;                        //interrupt enable
    TMOD &= ~0x03;
    TMOD |= 0;                      //mode 0: 16 bit aubtoReload
    TMOD &= ~0x04;  
    INT_CLKO &= ~0x01;  

    #if (Timer0_Reload < 65536UL)
      AUXR |=  0x08;         //1T mode
      TH0 = (u8)((65536UL - Timer0_Reload) / 256);
      TL0 = (u8)((65536UL - Timer0_Reload) % 256);
    #else
      AUXR &= ~0x80;              //12T mode
      TH0 = (u8)((65536UL - Timer0_Reload/12) / 256);
      TL0 = (u8)((65536UL - Timer0_Reload/12) % 256);
    #endif

    TR0 = 1;                     //start timer

  #else
    #error "Timer0 too slow!"
  #endif
}

void UART1_Interrupt() interrupt 4 using 1
{  
        //static unsigned char uc;        
        if(RI)
        {            
                RI = 0;
                UAR[0] = SBUF;
        }
}
  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-06-17 10:15:05

74

主题

6092

回帖

1万

积分

超级版主

积分
12731
发表于 2023-3-10 17:37:02 | 显示全部楼层
要仔细查哦,看一眼我看不出来的。

4

主题

8

回帖

51

积分

注册会员

积分
51
发表于 2023-3-10 20:14:36 | 显示全部楼层
找到問題了

void GPIO_config()
{     
        //Port 0
        P0M0 |= 0x00;
        P0M1 |= 0x00;
        
        //Port 1
        P1M0 = 0x0F;
        P1M1 = 0x00;

        //Port 2
        P2M0 |= 0x7F;
        P2M1 |= 0x00;      
        
}

應該改成

void GPIO_config()
{     
        //Port 0
        P0M0 = 0x00;
        P0M1 = 0x00;
        
        //Port 1
        P1M0 = 0x0F;
        P1M1 = 0x00;

        //Port 2
        P2M0 = 0x7F;
        P2M1 = 0x00;      
        
}
  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

733

主题

1万

回帖

1万

积分

管理员

积分
16661
发表于 2023-3-10 21:08:53 | 显示全部楼层
1.png

用自动化工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 11:35 , Processed in 0.160577 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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