#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的仿真功能来观察变量的值,以确保代码的逻辑是正确的。
解决 1无用