木槿呀 2024-03-26 17:17 采纳率: 72.2%
浏览 7
已结题

蓝桥杯第十届电压输出的值不对劲

我在做蓝桥杯第十届的时候, 在以下的代码中,如果把u=u100/51;这句话换成u=u500/255;那么结果显示的电压值就只能在0-255之间变化,如果我改成u=u5/255100;结果显示的电压值就会只有400,300,500这样的整百数,为什么?并且我的L3的状态按理说应该随着U的大小变化,但是也没变,为什么?
main.c

#include<STC15F2K60S2.H>
#include"hardware.h"
#include"iic.h"
bit stat=0;//S5电压切换
bit stat2=0;//S7数码管开关
bit stat3=0;//电压频率切换
bit flag=0;//led功能
unsigned int u=200;
unsigned int f=0;
unsigned char other_led_stat=0xff;
//--------------------------------------------------------------------------
void Workingkey()
{
   if(timer10ms>=10)
   {
     timer10ms=0;
     Scankey();
     if(key_value==7 && key_stat==2)//数码管开关
     {
        stat2=~stat2;
     }
     else if(key_value==4 && key_stat==2 && stat2==0)//电压频率切换
     {
        stat3=~stat3;
     }
     else if(key_value==5 && key_stat==2 && stat2==0 && stat3==0)//电压切换
     {
        stat=~stat; 
     }
    else if(key_value==6 && key_stat==2 )
    {
       flag=~flag;
    }
   }
}
//--------------------------------------------------------------------------
void SMG_Display()
{
  if(stat2==0)
  {
   if(stat3==0)
   {
   if(stat==0)
   {
      SMG_buf[0]=25;
      SMG_buf[1]=16;
      SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=16;
      SMG_buf[5]=u/100+32;
      SMG_buf[6]=u%100/10;
      SMG_buf[7]=u%10;
   }
   else if(stat==1)
   {
      SMG_buf[0]=25;
      SMG_buf[1]=16;
      SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=16;
      SMG_buf[5]=u/100+32;
      SMG_buf[6]=u%100/10;
      SMG_buf[7]=u%10; 
   }
   }
   else if(stat3==1)
   {
     SMG_buf[0]=15;
      SMG_buf[1]=16;
      if(f/100000!=0)
      {
      SMG_buf[2]=f/100000;
      SMG_buf[3]=f%100000/10000;
      SMG_buf[4]=f%10000/1000;
      SMG_buf[5]=f%1000/100;
      SMG_buf[6]=f%100/10;
      SMG_buf[7]=f%10; 
      }
      else if(f/10000!=0)
      {
       SMG_buf[2]=16;
      SMG_buf[3]=f/10000;
      SMG_buf[4]=f%10000/1000;
      SMG_buf[5]=f%1000/100;
      SMG_buf[6]=f%100/10;
      SMG_buf[7]=f%10;
      }
      else if(f/1000!=0)
      {
        SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=f/1000;
      SMG_buf[5]=f%1000/100;
      SMG_buf[6]=f%100/10;
      SMG_buf[7]=f%10;
      }
      else if(f/100!=0)
      {
         SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=16;
      SMG_buf[5]=f/100;
      SMG_buf[6]=f%100/10;
      SMG_buf[7]=f%10;
      }
      else if(f/10!=0)
      {
      SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=16;
      SMG_buf[5]=16;
      SMG_buf[6]=f/10;
      SMG_buf[7]=f%10;  
      }
      else 
      {
          SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=16;
      SMG_buf[5]=16;
      SMG_buf[6]=16;
      SMG_buf[7]=f; 
      }

   }
  }
  else if(stat2==1)
  {
      SMG_buf[0]=16;
      SMG_buf[1]=16;
      SMG_buf[2]=16;
      SMG_buf[3]=16;
      SMG_buf[4]=16;
      SMG_buf[5]=16;
      SMG_buf[6]=16;
      SMG_buf[7]=16; 
  }
}
//--------------------------------------------------------------------------
void led_display()
{
  if(timer10ms2>=10)
  {
   timer10ms2=0;
   other_led_stat=led_buf&0xfc;
   if(flag==0)//启用
   {
     if(stat2==0 && stat3==0)//电压
     {
        led_buf=other_led_stat|0x02;
        led_output();
     }
     else if(stat2==0 && stat3==1)//频率
     {
        led_buf=other_led_stat|0x01;
        led_output();
     }
     if(stat==0)
    {
      led_buf=led_buf|0x10;
      led_output();
     if(u<150)
     {
       led_buf=led_buf|0x04;
       led_output();
     }
     else if(u>=150 && u<250)
     {
       led_buf=led_buf&0xfb;
       led_output();
     }
     else if(u>=250 && u<350)
     {
       led_buf=led_buf|0x04;
       led_output();
     }
     else if(u>=350)
     {
       led_buf=led_buf&0xfb;
       led_output();
     }
    }
    else if(stat==1)
    {
      led_buf=led_buf&0xef;
      
      led_output(); 
    }
     if(f<1000)
     {
       led_buf=led_buf|0x08;
       led_output();
     }
     else if(f>=1000 && f<5000)
     {
       led_buf=led_buf&0xf7;
       led_output();
     }
     else if(f>=5000 && f<10000)
     {
       led_buf=led_buf|0x08;
       led_output();
     }
     else if(f>=10000)
     {
       led_buf=led_buf&0xf7;
       led_output();
     }     
   }
   else if(flag==1)
   {
        led_buf=0xff;
     led_output();
   }
  }
}
//--------------------------------------------------------------------------
void Read_rb2()
{
  if(stat==0)
   u=200;
   else if(stat==1)
   {
     I2CStart();
     I2CSendByte(0x90);
     I2CWaitAck();
     I2CSendByte(0x03);
     I2CWaitAck();
     I2CStop();

     I2CStart();
     I2CSendByte(0x91);
     I2CWaitAck();
     u=I2CReceiveByte();
     u=u*100/51;
     I2CSendAck(1);
     I2CStop();
   }
}
//--------------------------------------------------------------------------
void f_read()
{
  if(bz1s==1)//1s读一次计数的值,组合在一起是频率
  {
    bz1s=0;
    TR0=0;//关闭计数
    f=TH0*256+TL0;//组合
    TH0=0;
    TL0=0;//计数初值清0
    TR0=1;//打开计数
  }
}
//--------------------------------------------------------------------------
void main()
{
   led_output();
   ws_output();
   Timer1Init();
   Timer0Init();
   while(1)
   {
        Workingkey();
     SMG_Display();
     if(timer300ms>=200)
     {
       timer300ms=0;
       Read_rb2();
     }
       f_read();
     led_display();
   }
}

hardware.c

#include<STC15F2K60S2.H>
#include"hardware.h"
/*************  本地常量声明    **************/
unsigned char code t_display[]={                       //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};      //位码
unsigned char led_buf=0xff;
unsigned char ws_buf=0x00;
unsigned char SMG_buf[]={16,16,16,16,16,16,16,16};
unsigned int timer10ms=0;
unsigned int timer10ms2=0;
unsigned int timer300ms=0;
unsigned int timer600ms=0;
unsigned int timer1s=0;
bit bz1s=0;
unsigned char key_stat=0;
unsigned char key_value=0;
//----------------------------------------------------------------------
void Timer1Init()        //1毫秒@12.000MHz
{
    AUXR |= 0x40;        //定时器时钟1T模式
    TMOD &= 0x0F;        //设置定时器模式
    TL1 = 0x20;        //设置定时初值
    TH1 = 0xD1;        //设置定时初值
    TF1 = 0;        //清除TF1标志
    TR1 = 1;        //定时器1开始计时
    ET1=1;
    EA=1;
}
//---------------------------------------------------------------------
void Timer0Init()        //1毫秒@12.000MHz,NE555
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD |= 0x05;        //设置计时器模式
    TL0 = 0;        //设置定时初值
    TH0 = 0;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
}
//---------------------------------------------------------------------
void SelectHC573(unsigned char channel)
{
    switch(channel)
    {
       case 4:
         P2=(P2 & 0x1f)|0x80;
       break;
       case 5:
         P2=(P2 & 0x1f)|0xa0;
       break;
       case 6:
         P2=(P2 & 0x1f)|0xc0;
       break;
       case 7:
         P2=(P2 & 0x1f)|0xe0;
       break;
       case 0:
         P2=(P2 & 0x1f)|0x00;
       break;
    }
}
//---------------------------------------------------------------------
void led_output()
{          
    P0=led_buf;
    SelectHC573(4);
    SelectHC573(0);
}
//---------------------------------------------------------------------
void ws_output()
{
       
    P0=ws_buf;
    SelectHC573(5);
    SelectHC573(0);
}
//---------------------------------------------------------------------
void SMG_output()
{
   static unsigned char SMG_com=0;

       
    P0=0x00;
    SelectHC573(6);
    SelectHC573(0);

    
    P0=T_COM[SMG_com];
    SelectHC573(6);
    SelectHC573(0);

    
    P0=~t_display[SMG_buf[SMG_com]];
    SelectHC573(7);
    SelectHC573(0);

    if(++SMG_com>=8)
    {
      SMG_com=0;
    }
}
//---------------------------------------------------------------------
void ServiceTimer()interrupt 3
{
   SMG_output();
   timer10ms++;
   timer300ms++;
   timer1s++;
   if(timer1s>=1000)
    {
      timer1s=0;
      bz1s=1;
    }
    timer600ms++;
    timer10ms2++;
}
//----------------------------------------------------------------------


//----------------------------------------------------------------------
void Scankey()
{
  P3|=0x0f;
  if(~P3&0x0f)
  {
     if(key_stat<255)
       key_stat++;
     if(P33==0)
       key_value=4;
     if(P32==0)
       key_value=5;
     if(P31==0)
       key_value=6;
     if(P30==0)
       key_value=7;
  }
  else 
  {
    key_stat=0;
    key_value=0;
  }
}

  • 写回答

2条回答 默认 最新

  • 关注

    木槿呀 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    根据你提供的代码,我们可以分析以下几个问题:

    1. 如果将"u=u100/51;"修改为"u=u500/255;",结果显示的电压值就只能在0-255之间变化。这是因为变量u是一个unsigned int类型,它的取值范围是0-65535。当使用"u=u100/51;"的计算方式时,结果的范围是0-255,因为100/51的结果是一个小于1的浮点数,然后将浮点数转换成整数,所以结果只能是0或1,再乘以255就只能得到0或255。但是当使用"u=u500/255;"的计算方式时,500/255的结果是一个大于1的浮点数,转换成整数后结果就是2,再乘以255就得到510,超出了unsigned int的取值范围,所以最终结果是510除以2取整得到255。

      • 解决方案:修改计算方式,可以使用整数除法来得到正确的结果。例如可以使用u=(unsigned int)(u500/255.0*100);将浮点数先转换为整数再进行计算,这样可以得到正确的结果。
    2. 如果将"u=u5/255100;",结果显示的电压值会只有400,300,500这样的整百数。这是因为变量u是一个unsigned int类型,它的取值范围是0-65535。当使用"u=u5/255100;"的计算方式时,5/255100的结果是一个小于1的浮点数,转换成整数后结果就是0,再乘以100就得到0。所以最终结果只能是0或者整百数。

      • 解决方案:修改计算方式,可以使用整数除法来得到正确的结果。例如可以使用u=(unsigned int)(u5/100.0*255);将浮点数先转换为整数再进行计算,这样可以得到正确的结果。
    3. 对于 L3 状态没有按照预期随着 U 的大小变化,可能是因为代码中没有对 L3 进行更新的操作。需要检查代码中是否有修改 L3 的地方,并确保在 U 变化时更新 L3 的状态。

      • 解决方案:查找代码中涉及 L3 的操作,确保在 U 变化时进行相应的更新操作。

    修改后的代码:

    if (stat == 0)
    {
        SMG_buf[0] = 25;
        SMG_buf[1] = 16;
        SMG_buf[2] = 16;
        SMG_buf[3] = 16;
        SMG_buf[4] = 16;
        SMG_buf[5] = u / 100 + 32;
        SMG_buf[6] = u % 100 / 10;
        SMG_buf[7] = u % 10;
    }
    else if (stat == 1)
    {
        SMG_buf[0] = 25;
        SMG_buf[1] = 16;
        SMG_buf[2] = 16;
        SMG_buf[3] = 16;
        SMG_buf[4] = 16;
        SMG_buf[5] = u / 1000 + 32;
        SMG_buf[6] = u % 1000 / 100;
        SMG_buf[7] = u % 100 / 10;
    }
    
    // 修改 u 的计算方式
    u = (unsigned int)(u * 500.0 / 255); // 使用整数除法得到正确的结果
    
    

    以上是针对你提供的代码中电压输出结果不对的问题进行的分析和解决方案。希望能对你有所帮助!如有其他问题,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 AnolisOs7.9如何安装 Qt_5.14.2的运行库
  • ¥20 求:怎么实现qt与pcie通信
  • ¥50 前后端数据顺序不一致问题,如何解决?(相关搜索:数据结构)
  • ¥15 基于蒙特卡罗法的中介效应点估计代码
  • ¥15 罗技G293和UE5.3
  • ¥20 Tesla 特斯拉K80显卡 如果需要使用该设备,你需要禁用系统上的另一个设备。
  • ¥30 QT调用百度智能云千帆模型无法取得返回文本
  • ¥50 CCD工业视觉相机检测出现光边
  • ¥60 二次元手游日常任务自动化代肝(相关搜索:自动化)
  • ¥15 mysql将查询的结果作为动态列名怎么实现