第十一届省赛程序设计题--电压测量【蓝桥杯真题—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;
		}																	   
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

root@z~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值