第十届蓝桥杯省赛真题Word下载.docx
《第十届蓝桥杯省赛真题Word下载.docx》由会员分享,可在线阅读,更多相关《第十届蓝桥杯省赛真题Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
unsignedcharled_mode=0xff;
//LED灯点亮模式
unsignedintf_num=0;
//频率数值
unsignedcharj=0;
//频率测量里面的等待中断标志
unsignedchardiya_num=0;
//储存模数转换返回的电压值
unsignedchartimer=0;
bits4_mode=1;
//1为电压测量模式,0为频率测量模式
bits5_mode=0;
//1为输出2.0v电压,为0跟随PCF8591三通道电压输出
bits6_mode=1;
//1为开启LED灯显示,0为关显示
bits7_mode=1;
//1为开启数码管显示,0为关显示
bitgensui=0;
//0为不跟随电压输出,1为跟随电压输出
unsignedcharuseg_num[]={0x3e,0,0,0,0,0,0,0};
//电压数值数组
unsignedcharfseg_num[]={0x71,0,0,0,0,0,0,0};
//频率数值数组
voidkey_scan();
//按键扫描函数原型
unsignedchardian_ya_ce_liang();
//电压测量函数原型
voidTimerInit();
//定时计数初始化函数原型
/************************************************************************************************/
/******************************************函数**************************************************/
voidmain()//主函数
{
HAREWARE_init();
//关闭外部设备
DIG_init();
//数码管初始化
LED_init();
//LED灯初始化
TimerInit();
//定时器1初始化
P20=1;
while
(1)//等待中断
{
key_scan();
//按键扫描
if(~s5_mode)//判断是否是电压跟随模式
PCF_DA(103);
//没有跟随
gensui=0;
}
else
gensui=1;
//跟随电压
if(s4_mode)//判断是否为电压测量模式
diya_num=dian_ya_ce_liang();
led_mode=0xfe;
//电压测量模式指示灯亮
if(((diya_num*0.01953125>
=1.5)&
&
(diya_num*0.01953125<
2.5))||(diya_num*0.01953125>
=3.5))
led_mode&
=0xfb;
//满足条件第三个指示灯亮
if(gensui)
=0xef;
//电压跟随第五个指示灯亮
PCF_NUM=diya_num*1.953125;
//变成十进制的数字,把小数乘一百
useg_num[5]=DIG_CODE[PCF_NUM/100];
//百位数字
PCF_NUM=PCF_NUM%100;
useg_num[6]=DIG_CODE[PCF_NUM/10];
//十位数字
PCF_NUM%=10;
useg_num[7]=DIG_CODE[PCF_NUM];
//个位数字
LED_show(led_mode);
//LED等显示
DIG_show(useg_num);
//数码管显示
if(gensui)//判断是否是电压跟随模式
PCF_DA(diya_num);
else//频率测量模式
TR1=1;
//开始计时
TR0=1;
//开始计数
j=1;
//等待中断标志置1
while(j);
//等待中断
}
}
////////////////////////////////////////////////////
voidTimerInit()//定时计数器初始化函数
{
AUXR&
=0x3F;
//12分频
TMOD&
=0x00;
//TMOD(定时/计数器模式寄存器)清零
TMOD|=0x15;
//T0设置为模式1,计数;
T1设置为模式1,定时
TH0=TL0=0;
//计数器清零
TL1=0xF0;
//设置定时初值
TH1=0xD8;
EA=1;
//开总中断
ET1=1;
//开定时器1中断
///////////////////////////////////////////////////////
unsignedchardian_ya_ce_liang()
returnPCF_AD(3);
//返回模数转换值
//////////////////////////////////////////////////////
voidkey_scan()//键盘扫描函数
P3|=0x0f;
//P3低4位设为全1
if(~s4)//判断S4按键
delay1ms(5);
//按键消抖
s4_mode=~s4_mode;
if(~s5)//判断S5按键
if(s4_mode)//如果在电压测量模式则改变电压跟随标志
s5_mode=~s5_mode;
//s5_mode取反
if(~s6)//判断S6按键
s6_mode=~s6_mode;
if(~s6_mode)
//关LED灯
if(~s7)//判断S7按键
s7_mode=~s7_mode;
//取反
if(~s7_mode)//如果数码管开关标志为0,关数码管显示
//关数码管
while(~s4||~s5||~s6||~s7)//松手检测
if(s4_mode)//如果为电压测量模式,数码管显示电压值,防止出现数码管黑屏现象
//数码管显示电压测量值
//LED显示电压测量模式
else//如果为频率测量模式,数码管显示频率值,防止出现数码管黑屏现象
DIG_show(fseg_num);
//数码管显示频率测量值
//LED显示频率测量模式
/*//////////////////////////////////////////
///////////定时器1中断函数/////////////////
//////////////////////////////////////////*/
voidT1()interrupt3//定时器1中断函数
unsignedchari=0;
unsignedintf_num2=0;
P20=~P20;
TR0=0;
//停止计数
TR1=0;
//停止定时
//设置定时初值
timer++;
//计数器加1
j=0;
//等待中断标志清零
if(timer==20)
f_num=(TH0*256+TL0)*5;
//计算频率
timer=0;
TL0=TH0=0;
for(i=7;
i>
2;
i--)//重新初始化频率数值数组
fseg_num[i]=0;
//除数组的第一位和第二位其他的初始化为0
if((f_num>
=1000&
f_num<
5000)||(f_num>
=10000))
led_mode=0XF5;
//满足条件led4亮
led_mode=0XFD;
for(i=7;
2&
f_num!
=0;
i--)
fseg_num[i]=DIG_CODE[f_num%10];
f_num/=10;