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
设置为推挽输出,可以用一个1K电阻,一端接IO,输出高电平则另一端接GND,输出低电平则另一端接VCC,测量此时电阻电压,至少4.5V@5V工作时。
如果电压很低,则没有设置正确。 梁工 发表于 2023-3-10 13:29
设置为推挽输出,可以用一个1K电阻,一端接IO,输出高电平则另一端接GND,输出低电平则另一端接VCC,测量此 ...
同样的硬件接法,我在 P2.0 P2.4 P2.5 P2.6 都可以
并且同样的程序我换到 STC15F2K60S2 就能输出 P2.1 P2.2 P2.3
这是为什么 用下面3句程序测试,告诉我结果。如果仍然不正常,回寄样品,我看一下这个神奇的问题。
void main(void)
{
P2M1 = 0x00;
P2M0 = 0xff;
P2 = 0xff;
while(1)
{
}
} 你程序错了,先用下面这个准双向口的测试程序测试下
可以直接下载进去测试
//本示例在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: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;
}
} 要仔细查哦,看一眼我看不出来的。 找到問題了
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;
}
用自动化工具
页:
[1]