我在做蓝桥杯第十届的时候, 在以下的代码中,如果把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;
}
}