m0_58531419 2021-05-23 21:22 采纳率: 0%
浏览 136

仿真的时候led灯不亮

#include #define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管真值表uchar code DSY_CODE1[]={0XBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xEF,0xDF};sbit CLK=P2^4;sbit ST=P2^5;sbit ECO=P2^6;sbit OE=P2^7;sbit LED=P3^4;float d; //读取的转换数值void DelayMs(uint ms) //延时函数{ uchar i; while(ms--) for(i=0;i<120;i++);}void Disp_result(d) //数码管显示函数 { d=(d/255.000)*5000; P2=0xfe; //11111110 P0=DSY_CODE1[d/1000]; DelayMs(5); P2=0xfd; //11111101 P0=DSY_CODE[(d/100)%10]; DelayMs(5); P2=0xfb; //11111011 P0=DSY_CODE[(d/10)%10]; DelayMs(5); P2=0xf7; //11110111 P0=DSY_CODE[d%10]; DelayMs(5); if(d>3210) LED=0; else LED=1; } void main() //主函数{ TMOD=0x02; TH0=0x14; TL0=0x00; IE = 0X82; TR0 = 1; P3=0x3f; LED=1; while(1) //主循环 { ST=0; ST=1; ST=0; while(ECO==0); OE=1; Disp_result(P1); OE=0; } } void Timer0_INT() interrupt 1 //定时器中断服务函数 { CLK=~CLK; }

  • 写回答

1条回答 默认 最新

  • &春风有信 2024-04-01 13:43
    关注

    首先,我要指出的是,你的代码中有一些语法错误和不规范的地方,这可能是导致你仿真时LED灯不亮的原因之一。以下是我对你代码的修正和一些建议:

    在#include和#define指令之间,你应该添加一个空格。
    在Disp_result(d)函数的参数列表中,你应该使用float d而不是d。
    你应该确保在调用Disp_result(P1)之前,P1端口已经被正确地初始化和配置,以接收你希望显示的数据。
    在Disp_result(d)函数中,d是一个浮点数,但你试图将它用于数组索引。你应该在使用它之前,先将它转换为整数。
    在Disp_result(d)函数中,LED=0和LED=1可能并不会导致LED灯亮起或熄灭,这取决于你的硬件连接和LED的定义。你可能需要根据你的硬件设计来调整这部分代码。

    修正后的代码如下:

    c
    #include <reg51.h> // 包含51单片机的头文件
    
    #define uchar unsigned char
    #define uint unsigned int
    
    uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管真值表
    uchar code DSY_CODE1[]={0XBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xEF,0xDF};
    sbit CLK=P2^4;
    sbit ST=P2^5;
    sbit ECO=P2^6;
    sbit OE=P2^7;
    sbit LED=P3^4;
    float d; //读取的转换数值
    
    void DelayMs(uint ms) //延时函数
    {
        uchar i;
        while(ms--)
            for(i=0;i<120;i++);
    }
    
    void Disp_result(float d) //数码管显示函数
    {
        d=(d/255.000)*5000;
        P2=0xfe; //11111110
        P0=DSY_CODE1[(int)(d/1000)]; // 将d/1000转换为整数
        DelayMs(5);
        P2=0xfd; //11111101
        P0=DSY_CODE[(int)((d/100)%10)]; // 将(d/100)%10转换为整数
        DelayMs(5);
        P2=0xfb; //11111011
        P0=DSY_CODE[(int)((d/10)%10)]; // 将(d/10)%10转换为整数
        DelayMs(5);
        P2=0xf7; //11110111
        P0=DSY_CODE[(int)(d%10)]; // 将d%10转换为整数
        DelayMs(5);
    
        if(d>3210.0) // 确保d是浮点数
            LED=0;
        else
            LED=1;
    }
    
    void main() //主函数
    {
        TMOD=0x02;
        TH0=0x14;
        TL0=0x00;
        IE = 0X82;
        TR0 = 1;
        P3=0x3f;
        LED=1;
    
        while(1) //主循环
        {
            ST=0;
            ST=1;
            ST=0;
            while(ECO==0);
            OE=1;
            Disp_result(P1); // 确保P1已经被正确配置和初始化
            OE=0;
        }
    }
    
    void Timer0_INT() interrupt 1 //定时器中断服务函数
    {
        CLK=~CLK;
    }
    
    

    请注意,这些修改只是基于你提供的代码进行的,如果还有其他部分的代码或硬件设置,可能还需要进一步的调整。

    另外,如果你在使用Proteus进行仿真时,LED灯不亮,你也应该检查你的硬件连接是否正确,包括LED灯的连接、单片机的引脚设置等。你还可以尝试在代码中添加一些调试语句,比如使用Proteus的仿真功能来观察变量的值,以确保代码的逻辑是正确的。

    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题