第十届省赛程序设计题--电压频率测量蓝桥杯真题—01

Posted 谏书稀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十届省赛程序设计题--电压频率测量蓝桥杯真题—01相关的知识,希望对你有一定的参考价值。

【题目要求】




【实现代码】

#include <STC15F2K60S2.H>
#include <IIC.H>

sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;

unsigned char flag_s4=0;//0显示电压,1显示频率
unsigned char flag_s5=0;//DAC输出模式切换按键
unsigned char flag_s6=0;//LED 指示灯功能控制按键
unsigned char flag_s7=0;//数码管显示功能控制
unsigned char flag=0;//ADC采样与DAC输出切换标志位


unsigned char table[]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf;
unsigned char table1[]=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;//有小数点段选
unsigned int count;//定时器1定时标志位
unsigned int f;//计算频率
unsigned int dat_f;//NE555的频率
unsigned int dat_v;//rb2的电压
unsigned int dat_rb2;//rb2采样值


//====================================读取电位器 RB2 输出的模拟电压==============================
void Read_RB2()

    //进行写操作,选择电位器rb2,AIN3,通道3
	IIC_Start(); 
	IIC_SendByte(0x90); //PCF8591的写设备地址
	IIC_WaitAck(); 
	IIC_SendByte(0x43); //选择通道3,即RB2
	IIC_WaitAck();
	IIC_Stop();

	//进行读取RB2,AIN3通道的电压
	IIC_Start();
	IIC_SendByte(0x91); //PCF8591的读设备地址
	IIC_WaitAck(); 
	dat_rb2=IIC_RecByte();//通道3,即RB2的电压读取存放到dat_v当中
	IIC_Ack(0);         //产生非应答信号
	IIC_Stop();
	
	dat_v=dat_rb2*2;  //计算实际电压值	


//DAC输出
void SetData_DAC(unsigned char dat)

	IIC_Start(); 
	IIC_SendByte(0x90); //PCF8591的写设备地址
	IIC_WaitAck(); 
	IIC_SendByte(0x40); //DAC电压输出设置
	IIC_WaitAck();
	IIC_SendByte(dat); //设置电压输出参数
	IIC_WaitAck();
	IIC_Stop();

//==================================定时器0计数,1定时,进行频率测量==============================
void Init_Timer()

    //定时器0用作计数,8位重装方式
	TH0=0XFF;
	TL0=0XFF;
	//定时器1用作定时50ms,测量1s的频率
	TH1=(65536-50000)/256;
	TH1=(65536-50000)%256;

	TMOD=0x16;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
	EA=1;

void Service_Time0() interrupt 1

	f++;	

void Service_Time1() interrupt 3

//	TH1=(65536-50000)/256;
//	TH1=(65536-50000)%256;
	count++;
	if(f%5==0)  
		flag=~flag; 
	if(count==20)//20个50ms,取出1s的频率值
	
		dat_f=f;
		f=0;
		count=0;
			


//===================================数码管显示与寄存器选择相关函数=================================
void delay_ms(int n)

	int i,j;
	for(i=n;i>0;i--)
		for(j=110;j>0;j--);

void SelectHC(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;
	

//第w个数码管显示n,n为对应16进制
void show(unsigned char w,unsigned char n)

	SelectHC(6);
	P0=0X01<<w;
	SelectHC(7);
	P0=n;
	delay_ms(5);
	P0=0xff;
	P2&=0x1f;

//========================================数码管显示电压和频率=======================================
void Show_F()

	show(0,0x8e);
	delay_ms(1);
	show(1,0xff);
	delay_ms(1);
	show(2,0xff);
	delay_ms(1);
	if(dat_f>9999)
	
		show(3,table[dat_f/10000]);
		delay_ms(1);
	
	if(dat_f>999)
	
		show(4,table[dat_f/1000%10]);
		delay_ms(1);
	
	if(dat_f>99)
	
		show(5,table[dat_f/100%10]);
		delay_ms(1);
	
	if(dat_f>9)
	
		show(6,table[dat_f/10%10]);
		delay_ms(1);
	
	show(7,table[dat_f/1%10]);
	delay_ms(1);

void Show_V()

	show(0,0xc1);
	delay_ms(1);
	show(1,0xff);
	delay_ms(1);
	show(2,0xff);
	delay_ms(1);
	show(3,0xff);
	delay_ms(1);
	show(4,0xff);
	delay_ms(1);
	show(5,table1[(dat_v/100)%10]);
	delay_ms(1);
	show(6,table[(dat_f/10)%10]);
	delay_ms(1);
	show(7,table[dat_f%10]);
	delay_ms(1);

//========================================LED指示电压和频率=======================================
void LED_F()

	if(dat_f<1000)
		P0|=0x04;
	if(dat_f<5000)
		P0&=~0x04;
	if(dat_f<100000)
	    P0|=0x04;
	else
		P0&=~0x04;

void LED_V()

	if(dat_v<150)
		P0|=0x08;
	if(dat_v<250)
		P0&=~0x08;
	if(dat_v<350)
		P0|=0x08;
	else
		P0&=~0x08;


//=======================================LED功能指示函数=======================================
void displayLED()

	P2=P2&0X1F;
	if(flag_s6==0)
	
		if(flag_s4==0)
		
			P0=0xfe;
			LED_V();
		
		else
		
			P0=0xfd;
			LED_F();
		
		if(flag_s5==0)
			P0|=0x10;  //DAC输出2V电压指示灯
		else 
	   		P0&=~0x10;
	
	else
		P0=0XFF;
	SelectHC(4);	

//=====================================LED与数码管显示函数====================================
void  display()

	if(flag_s7==0)
	
		if(flag_s4==0)
			Show_V();
		else 
		    Show_F();
	
	else  //数码管显示禁止
	
		SelectHC(6);
		P0=0XFF;
		SelectHC(7);
		P0=0XFF;
	
	displayLED();
	P2&=0X1F;


//========================================按键开关扫描=======================================
void keys()

	if(s4==0)
	
		delay_ms(1);
		flag_s4=~flag_s4;
		while(s4==0)
		display();
	
	if(s5==0)
	
		delay_ms(1);
		flag_s5=~flag_s5;
		while(s5==0)
		display();
	
	if(s6==0)
	
		delay_ms(1);
		flag_s6=~flag_s6;
		while(s6==0)
		display();
	
	if(s7==0)
	
		delay_ms(1);
		flag_s7=~flag_s7;
		while(s7==0)
		display();
		



void main()

    SelectHC(5);
	P0=0x00;
	P2&=0x1f;
	Init_Timer();
	while(1)
	
	    keys();
		if(flag==0)
		
			Read_RB2();
		
		else
		
			if(flag_s5==0)
				SetData_DAC(102);//DAC输出2V电压
			else
			    SetData_DAC(dat_rb2);//DAC输出电压随RB2变化
		
		display();   			
	

以上是关于第十届省赛程序设计题--电压频率测量蓝桥杯真题—01的主要内容,如果未能解决你的问题,请参考以下文章

第十一届省赛程序设计题--电压测量蓝桥杯真题—07

《蓝桥杯真题》:2019年单片机省赛(第十届)

《蓝桥杯真题》:2019年单片机省赛(第十届)

《蓝桥杯真题》:2019年单片机省赛(第十届)

《蓝桥杯真题》:2021单片机省赛第二场暨第十三届蓝桥杯赛前模拟试题

《蓝桥杯真题》:2021单片机省赛第二场(第十二届第二场)暨第十三届蓝桥杯赛前模拟试题