第十一届省赛程序设计题--电压测量蓝桥杯真题—07
Posted 谏书稀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一届省赛程序设计题--电压测量蓝桥杯真题—07相关的知识,希望对你有一定的参考价值。
#include <STC15F2K60S2.H>
#include <IIC.H>
sbit r1=P3^0;
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P3^4;
sbit c2=P3^5;
sbit c3=P4^2;
sbit c4=P4^4;
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
void led_run();
unsigned char table[]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;
unsigned char table1[10]=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;
int v_rb2;//存放转换后的电压值
int ain3; //电压值暂存
unsigned char p;//存放设置的电压值
unsigned char p1;//设置电压值暂存
unsigned int num=0; //计数值
unsigned char mode=0; //模式
unsigned char keynum=0;//无效操作按键标志位
unsigned char count=0; //定时器计数
/*==================================================================
数码管相关函数
==================================================================*/
void delay_ms(unsigned char n)
int i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
void delay(unsigned char n)
while(n--);
void select_hc(unsigned char n)
switch(n)
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 show_bit(unsigned char w,unsigned char n)
select_hc(7);
P0=0xff;
select_hc(6);
P0=0x01<<w-1;
select_hc(7);
P0=n;
delay(500);
void show_all(unsigned char dat)
select_hc(6);
P0=0xff;
select_hc(7);
P0=dat;
delay(500);
/*==================================================================
电压读取函数 AIN3通道 Rb2
==================================================================*/
void init_rb2()
IIC_Start();
IIC_SendByte(0x90); //写地址
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
unsigned char read_rb2()
unsigned char dat;
IIC_Start();
IIC_SendByte(0x91); //读地址
IIC_WaitAck();
dat=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
return dat;
/*==================================================================
24c02读写函数
==================================================================*/
void write_24c02(unsigned char add,unsigned char dat)
IIC_Start();
IIC_SendByte(0xa0); //写
IIC_WaitAck();
IIC_SendByte(add); //将数据写到哪个地址
IIC_WaitAck();
IIC_SendByte(dat); //将数据写进去
IIC_WaitAck();
IIC_Stop();
unsigned char read_24c02(unsigned char add)
unsigned char date;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add); //读取哪一个地址的数据
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1); //读
IIC_WaitAck();
date=IIC_RecByte(); //读
IIC_WaitAck();
IIC_Stop();
return date;
/*==================================================================
定时器T0 定时10ms
==================================================================*/
void init_timer0()
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;
//TR0=1;
EA=1;
void service_timer0() interrupt 1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
count++;
if(count>=50) //计数满0.5S
select_hc(4);
L1=0;
count=0;
/* if(v_rb2<p1)
count++;
if(count>=50)
select_hc(4);
L1=0;
count=0;
*/
/*==================================================================
显示相关函数 数码管显示电压函数 参数设置显示函数 计数显示函数
==================================================================*/
void show_u()
float rec; //存放读取AIN3通道的值
rec=read_rb2();
v_rb2=rec/51*100;
ain3=v_rb2;
show_bit(1,0xc1);
show_bit(6,table1[v_rb2/100]);
show_bit(7,table[v_rb2/10%10]);
show_bit(8,table[v_rb2%10]);
show_all(0xff);
void show_p()
show_bit(1,0x8c);
show_bit(6,table1[p/10]);
show_bit(7,table[p%10]);
show_bit(8,table[0]);
show_all(0xff);
void show_n()
show_bit(1,0xc8);
show_bit(7,table[num/10]);
show_bit(8,table[num%10]);
show_all(0xff);
void show_smg()
if(mode==0)
show_u();
delay_ms(1);
else if(mode==1)
show_p();
delay_ms(1);
else if(mode==2)
show_n();
delay_ms(1);
/*==================================================================
矩阵键盘扫描函数
==================================================================*/
void scan_key()
//将第一行置0,扫描每一列
r1=0;
r2=r3=r4=1;
c1=c2=c3=c4=1;
if(c1==0||c2==0||c3==0||c4==0)
while(c1==0||c2==0||c3==0||c4==0)
led_run();
show_smg();
keynum++;
//将第二行置0,扫描每一列
r2=0;
r1=r3=r4=1;
c1=c2=c3=c4=1;
if(c1==0||c2==0||c3==0||c4==0)
while(c1==0||c2==0||c3==0||c4==0)
led_run();
show_smg();
keynum++;
//将第三行置0,扫描每一列
r3=0;
r1=r2=r4=1;
c1=c2=c3=c4=1;
if(c2==0) //S13被按下
while(c2==0)
led_run();
show_smg();
keynum=0;
if(mode==2)
num=0;
else if(c1==0) //S17被按下
while(c1==0)
led_run();
show_smg();
keynum=0;
if(mode==1)
p=p-5;
if(p<0)
p=50;
else if(c3==0)
while(c3==0)
led_run();
show_smg();
keynum++;
else if(c4==0)
while(c4==0)
led_run();
show_smg();
keynum++;
//将第四行置0,扫描每一列
r4=0;
r1=r2=r3=1;
c1=c2=c3=c4=1;
if(c2==0)
while(c2==0)//S12被按下
led_run();
show_smg();
keynum=0;
mode++;
if(mode>2)
write_24c02(0x00,p);
if(mode>=3)
mode=0;
else if(c1==0) //S16被按下
while(c1==0)
led_run();
show_smg();
keynum=0;
if(mode==1)
p=p+5;
if(p>50)
p=0;
else if(c3==0)
while(c3==0)
led_run();
show_smg();
keynum++;
else if(c4==0)
while(c4==0)
led_run();
show_smg();
keynum++;
/*==================================================================
LED灯指示灯
==================================================================*/
void led_run()
select_hc(4);
if(v_rb2<p1)
TR0=1;
else
TR0=0;
if(num%2!=0)
L2=0;
else
L2=1;
if(keynum!=0&&keynum>=3)
L3=0;
else
L3=1;
/*==================================================================
主函数
==================================================================*/
void main()
int i=0;
select_hc(5);
P0=0x00;
select_hc(4);
P0=0xff;
select_hc(0);
init_rb2();
p=read_24c02(0x00);
while(1)
p1=p*10;
show_smg();
scan_key();
led_run();
switch(i) //下降波形电压判断
case(0): if(v_rb2>=p1) i++;break;
case(1): if(v_rb2<p1) i=0;num++;break;
第十届省赛程序设计题--电压频率测量蓝桥杯真题—01
《蓝桥杯真题》:2021单片机省赛第二场暨第十三届蓝桥杯赛前模拟试题