shyhkaelo 发表于 2023-3-10 11:10:32

STC15W4K48S4 P2 输出问题


对于现供货的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-3-10 13:29:20

设置为推挽输出,可以用一个1K电阻,一端接IO,输出高电平则另一端接GND,输出低电平则另一端接VCC,测量此时电阻电压,至少4.5V@5V工作时。
如果电压很低,则没有设置正确。

shyhkaelo 发表于 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

这是为什么

梁工 发表于 2023-3-10 15:15:52

用下面3句程序测试,告诉我结果。如果仍然不正常,回寄样品,我看一下这个神奇的问题。

void main(void)
{
   P2M1 = 0x00;
   P2M0 = 0xff;
   P2 = 0xff;
       
   while(1)
   {
   }
}

神农鼎 发表于 2023-3-10 15:22:33

你程序错了,先用下面这个准双向口的测试程序测试下




可以直接下载进去测试

神农鼎 发表于 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;
    }
}

shyhkaelo 发表于 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;
      }
}

梁工 发表于 2023-3-10 17:37:02

要仔细查哦,看一眼我看不出来的。

shyhkaelo 发表于 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;      
      
}

神农鼎 发表于 2023-3-10 21:08:53



用自动化工具
页: [1]
查看完整版本: STC15W4K48S4 P2 输出问题