tgqoholu 发表于 6 天前

AI8051U, P4口异常 始终就是0, 其他口正常

ai8051u P4口异常 始终就是0, 其他口正常,求帮忙找问题。

#include "AI8051U.h"
#include "stdio.h"
#include "intrins.h"

typedef         unsigned char      u8;
typedef         unsigned int      u16;
typedef         unsigned long      u32;

#define MAIN_Fosc      24000000UL

void main(void)
{
    WTST = 0;
    EAXFR = 1;
    CKCON = 0;

    P0M1 = 0x00;   P0M0 = 0xff;   
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;

    P40 = 1;
    P40 = 0;               
    P40 = 1;
      

    while(1);
}



tgqoholu 发表于 6 天前

C51正常,C251就不行,换其他电脑也是一样的问题。

tgqoholu 发表于 6 天前

和硬件没有关系,软件仿真也不正常。

神农鼎 发表于 6 天前


用下面这个程序来修改



#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。

void Delay500ms(void)               //延时函数,主频40MHz
{
    unsigned long edata i;          //定义变量
    _nop_();                        //空指令
    _nop_();
    i = 4999998UL;                  //变量初始化
    while (i) i--;                  //循环等待
}
                                    //上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。

void main(void)
{
    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
                                    //(32 位模式请使用这句,注释下一句)
//P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
                                    //(8位模式请使用这句,注释上一句)。
    WTST = 0;                     //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间
                                    
    P0M0 = 0x00; P0M1 = 0x00;       //设置P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;       //设置P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;       //设置P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;       //设置P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;       //设置P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;       //设置P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;       //设置P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;       //设置P7口为准双向口模式
                                    //上面的将所有I/O口都初始化为准双向口工作模式的程序,
                                    //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。
                                    
    P40 = 0;                        //打开LED部分的供电
    while(1)                        
    {                               //LED循环自动闪烁部分
      P0 = ~P0;                   //对P0端口取反
//      P00 = ~P00;                //对单个端口取反
      Delay500ms();               //调用延时函数,延时0.5s
    }
}


神农鼎 发表于 6 天前

#include <AI8051U.H>                //包含AI8051U的头文件
#include "intrins.h"                //使用_nop_()函数所必须要包含的头文件,
                                    //否则延时函数中调用的_nop_()函数没有被头文件引用过来,
                                    //会导致编译器找不到这个而函数而报错。

void Delay500ms(void)               //延时函数,主频40MHz
{
    unsigned long edata i;          //定义变量
    _nop_();                        //空指令
    _nop_();
    i = 4999998UL;                  //变量初始化
    while (i) i--;                  //循环等待
}
                                    //上面延时函数部分代码可使用AIapp-ISP软件的“软件延时计算器”工具来生成。

void main(void)
{
    EAXFR = 1;                      //允许访问扩展的特殊寄存器,XFR
                                    //(32 位模式请使用这句,注释下一句)
//P_SW2 |= 0x80;                  //允许访问扩展的特殊寄存器,XFR
                                    //(8位模式请使用这句,注释上一句)。
    WTST = 0;                     //设置取程序代码等待时间,
                                    //赋值为 0表示不等待,程序以最快速度运行
    CKCON = 0;                      //设置访问片内的 xdata速度,
                                    //赋值为 0表示用最快速度访问,不增加额外的等待时间

    P0M0 = 0x00; P0M1 = 0x00;       //设置P0口为准双向口模式
    P1M0 = 0x00; P1M1 = 0x00;       //设置P1口为准双向口模式
    P2M0 = 0x00; P2M1 = 0x00;       //设置P2口为准双向口模式
    P3M0 = 0x00; P3M1 = 0x00;       //设置P3口为准双向口模式
    P4M0 = 0x00; P4M1 = 0x00;       //设置P4口为准双向口模式
    P5M0 = 0x00; P5M1 = 0x00;       //设置P5口为准双向口模式
    P6M0 = 0x00; P6M1 = 0x00;       //设置P6口为准双向口模式
    P7M0 = 0x00; P7M1 = 0x00;       //设置P7口为准双向口模式
                                    //上面的将所有I/O口都初始化为准双向口工作模式的程序,
                                    //可以使用AIapp-ISP软件的“I/O口配置工具”来生成。

//   P40 = 0;                        //打开LED部分的供电
    while(1)                        
    {                               //LED循环自动闪烁部分
      P40 = 1;
      Delay500ms();               //调用延时函数,延时0.5s
      P40 = 0;
      Delay500ms();               //调用延时函数,延时0.5s
    }
}


ercircle 发表于 6 天前

软件仿真BUG吧,用硬件仿真

tgqoholu 发表于 6 天前

一样的问题哦!P40口的值始终就是0

tgqoholu 发表于 6 天前

这里能发小视频吗?可以的话我发一个单步的小视频。

tgqoholu 发表于 6 天前

换C51就正常。

ercircle 发表于 6 天前

tgqoholu 发表于 2025-6-11 15:05
一样的问题哦!P40口的值始终就是0

看我上面硬件截图不一样噢
发视频可以用高级模式点这个:

页: [1] 2
查看完整版本: AI8051U, P4口异常 始终就是0, 其他口正常