第十三届蓝桥杯单片机省赛模拟题(客观题程序题)

 蓝桥杯单片机省赛将近,小伙伴们都在抓紧时间准备做省赛真题,下面是我为大家分享一下模拟题。

 

 

main.c程序

#include "stc15f2k60s2.h"
#include "iic.h"
#define uchar unsigned char 
#define uint unsigned int 
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//0~9数字
                  0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,//0~9数字带小数点
                  0XBF,0XFF,0x8e,0xc1,0xc8,0xbf};
uint yemian,LED_buff,zhouqi, dianya=0,AD=0;
uchar yi,er,san,si,wu,liu,qi,ba;
uchar t=0,tongdao=0;
uint count,count_f;
uint pinlv,pinlv_s,AD_s;
void led_dis();
void init_timer0();
void delayms(int ms);          //延时函数
void Allinit();                //初始化函数
void keyscan();             //独立按键函数
void display1(uchar yi,uchar er);   //第一、二段数码管函数
void display2(uchar san,uchar si);  //第三、四段数码管函数
void display3(uchar wu,uchar liu);  //第五、六段数码管函数
void display4(uchar qi,uchar ba);   //第七、八段数码管函数



							
void main()
{
	Allinit();
	init_timer0();
	pinlv_s=EERPOM_read(0x00);delayms(5);//读取频率采集的电压
	AD_s=EERPOM_read(0X01);delayms(5);//读取rb2采集的电压
	while(1)
	{
			if(P30==0)
	{
		delayms(5);
		t++;
		if(t==1)//短按频率采集
		{
			EERPOM_write(0x00,pinlv);delayms(5);
		}
		if(t==50)//长按是S7按键led点亮,或者熄灭
		{
			LED_buff=~LED_buff;
			t=0;
		}
		
	}
		dianya=AD_read(0X03)*1.91;
		AD=AD_read(0x01)*1.91;
		
		 if(yemian==0)//频率显示页面
		{
		
			if(pinlv>=10000){yi=22;er=21;san=21;si=pinlv/10000;wu=pinlv%10000/1000;liu=pinlv%1000/100;qi=pinlv%100/10;ba=pinlv%10;}
			
		else if(pinlv>=1000){yi=22;er=21;san=21;si=21;wu=pinlv/1000;liu=pinlv%1000/100;qi=pinlv%100/10;ba=pinlv%10;}
		else if(pinlv>=100){yi=22;er=21;san=21;si=21;wu=21;liu=pinlv/100;qi=pinlv%100/10;ba=pinlv%10;}
		else if(pinlv>=10){yi=22;er=21;san=21;si=21;wu=21;liu=21;qi=pinlv%100/10;ba=pinlv%10;	}
		}

		else if(yemian==1)//频率周期显示页面
		{
			
			if(zhouqi>=10000){yi=23;er=21;san=21;si=zhouqi/10000;wu=zhouqi%10000/1000;liu=zhouqi%1000/100;qi=zhouqi%100/10;ba=zhouqi%10;}
			
		else if(zhouqi>=1000){yi=23;er=21;san=21;si=21;wu=zhouqi/1000;liu=zhouqi%1000/100;qi=zhouqi%100/10;ba=zhouqi%10;}
		else if(zhouqi>=100){yi=23;er=21;san=21;si=21;wu=21;liu=zhouqi/100;qi=zhouqi%100/10;ba=zhouqi%10;}
		else if(zhouqi>=10){yi=23;er=21;san=21;si=21;wu=21;liu=21;qi=zhouqi%100/10;ba=zhouqi%10;	}
		}
		else if(yemian==2)//电压显示页面
		{
		
			if(tongdao==0)//reb2电压显示
			{
			yi=23;er=25;san=1;si=21;wu=21;liu=dianya/100+10;qi=dianya%100/10;ba=dianya%10;
			}
			else if(tongdao==1)//光敏电阻显示
			{
				yi=23;er=25;san=3;si=21;wu=21;liu=AD/100+10;qi=AD%100/10;ba=AD%10;
			}
		}
		
	  led_dis();
		keyscan();
		display1(yi,er); 
		display2(san,si);
		display3(wu,liu);
		display4(qi,ba); 
	}
}

void led_dis()//led灯亮灭状态
{
	uchar led1 ,led2;
	if(pinlv>=pinlv_s){P2=(P2&0X1F)|0X80;P0=0XFd|LED_buff;led1=0xfd;}
  if(pinlv<pinlv_s){P2=(P2&0X1F)|0X80;P0=0XFf|LED_buff;led1=0xff;}
	if(AD>=AD_s){P2=(P2&0X1F)|0X80;P0=(0XFE&led1)|LED_buff;led2=P0;}
	if(AD<AD_s) {P2=(P2&0X1F)|0X80;P0=(0XFF&led1)|LED_buff;led2=P0;}
	if(yemian==0){P2=(P2&0X1F)|0X80;P0=((0XFB&led1)&led2)|LED_buff;}
	if(yemian==1){P2=(P2&0X1F)|0X80;P0=((0XF7&led1)&led2)|LED_buff;}
	if(yemian==2){P2=(P2&0X1F)|0X80;P0=((0XEF&led1)&led2)|LED_buff;}
}
void init_timer0()
{
	TMOD=0X16;
	TH0=0XFF;
	TL0=0XFF;
	TH1=(65535-50000)/255;
	TL1=(65535-50000)%255;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
	EA=1;
}
void timer0() interrupt 1   //计数器,一秒钟来一个脉冲溢出一次,计数一次
{
	count ++;
}
void timer1() interrupt 3   //定时50毫秒
{
	TH1=(65535-50000)/255;
	TL1=(65535-50000)%255;
	count_f++;
	if(count_f==20)
	{
		pinlv=count;
		count =0;
		count_f=0;
	}
	zhouqi=1000000/pinlv;
}
void keyscan()//独立按键函数
{

 if(P31==0)
	{
		delayms(5);
		if(P31==0)
		{
			if ((yemian==2)&&(tongdao==1))
			{
				EERPOM_write(0x01,AD);delayms(5);//采集通道3的电压,存到EERPOM
			}
		}
		while(!P31);
	}
	else if(P32==0)
	{
		delayms(5);
		if(P32==0)
		{
			if((yemian==2)&&(tongdao==0))//RB3和光敏电阻通道切换
			{
				tongdao=1;
			}
			else if ((yemian==2)&&(tongdao==1))//RB3和光敏电阻通道切换
			{
				tongdao=0;
			}
		}
		while(!P32);
	}
	else if(P33==0)
	{
		delayms(5);
		if(P33==0)
		{
			if(yemian==0){yemian=1;}//页面切换
			else if(yemian==1){yemian=2;}//页面切换
			else if(yemian==2){yemian=0;}//页面切换
		}
		while(!P33);
	}
	
}
void display1(uchar yi,uchar er)//第一、二段数码管函数
{
	P2=0XC0;P0=0X01;               //选中第一个数码管位选
	P2=0XFF;P0=tab[yi];            //让第一个数码管显示yi指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X02;               //选中第二个数码管位选
	P2=0XFF;P0=tab[er];            //让第一个数码管显示er指向的值
	delayms(1);	                   //延时1ms
}
void display2(uchar san,uchar si)//第三、四段数码管函数
{
	P2=0XC0;P0=0X04;               //选中第s三个数码管位选
	P2=0XFF;P0=tab[san];           //让第一个数码管显示san指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X08;               //选中第四个数码管位选
	P2=0XFF;P0=tab[si];            //让第一个数码管显示si指向的值
	delayms(1);	                   //延时1ms
}
void display3(uchar wu,uchar liu)//第五、六段数码管函数
{
	P2=0XC0;P0=0X10;               //选中第五个数码管位选
	P2=0XFF;P0=tab[wu];            //让第一个数码管显示wu指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X20;               //选中第六个数码管位选
	P2=0XFF;P0=tab[liu];           //让第一个数码管显示liu指向的值
	delayms(1);	                   //延时1ms
}
void display4(uchar qi,uchar ba)//第七、八段数码管函数
{
	P2=0XC0;P0=0X40;               //选中第七个数码管位选
	P2=0XFF;P0=tab[qi];            //让第一个数码管显示qi指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X80;               //选中第八个数码管位选
	P2=0XFF;P0=tab[ba];            //让第一个数码管显示ba指向的值
	delayms(1);                    //延时1ms
	P2=0XC0;P0=0X80;               //选中第八个数码管位选
	P2=0XFF;P0=0XFF;               //让第八个数码管熄灭             
}
void delayms(int ms) //延时函数
{
	uint i,j;
	for(i=ms;i>0;i--)
	for(j=845;j>0;j--);
}
void Allinit()//初始化函数
{
	P2=0X80;P0=0XFF;
	P2=0XA0;P0=0X00;
	P2=0XC0;P0=0XFF;
	P2=0XFF;P0=0XFF;
}

 iic.c程序

#include "stc15f2k60s2.h"
#include "intrins.h"

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}    


#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */


//总线启动条件
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop;
	SDA = 1;
}

bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop;
	}
	return da;
}
unsigned char AD_read(unsigned char dat)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	return temp;
}
unsigned int EERPOM_read(unsigned int add)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0xA0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0xA1);
	IIC_WaitAck();
	temp=IIC_RecByte();
	return temp;
}
void EERPOM_write(unsigned int dat ,unsigned int add)
{
	IIC_Start();
	IIC_SendByte(0xA0);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
}

iic.h程序

#ifndef _IIC_H
#define _IIC_H

void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned char AD_read(unsigned char dat);
unsigned int EERPOM_read(unsigned int add);
void EERPOM_write(unsigned int dat ,unsigned int add);
#endif

这套题整体来说还是比较简单的,

  • 10
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值