蓝桥杯单片机备考必看内容,学习一周,保底省三!

这里我先把我弄到的历年考试类型给大家,但是这图只能参考,经历这届蓝桥杯我深有体会,考试当天早上我还在想要不要看看矩阵键盘,但是想着这个考点概率就没去看隔着摆烂,结果真考了按键12,13,16,17的运用。。。。但是有一点要说的是,这届选择题很多历届题,大家务必要去看往届题。值得一提的是这届选择题15分,编程题85分。废话不说了,下面给大家我考前看的考点板块。

请添加图片描述

温度读取 (这届考了)

#include <STC15F2K60S2.H>
#include "OneWire.h"
#include "absacc.h"
void Displaytemp();
void Delays(unsigned int t);
void Readtemp();
unsigned int temp;
unsigned char SMGNoDot_CA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char SMGDot_CA[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

void Delay(unsigned int t)
{
	while(t--);
}

void CLOSEled()
{
	P2=(P2&0X1F)|0X80;
	P0=0XFF;
}


void closebz()
{
	P2=(P2&0X1F)|0Xa0;
	P0=0X00;
}
void DidplaySMG(unsigned char pos,unsigned char dat)
{
	P2=(P2&0X1F)|0XC0;
	P0=0X01<<pos;
	P2=(P2&0X1F)|0XE0;
	P0=dat;
//	XBYTE[0XE000]=0xff;	
//	XBYTE[0XC000]=0X01<<pos;
//	XBYTE[0XE000]=dat;
//	
}



	
//	if((temp&0xf800)==0x0000)
//	{
//		temp>>=4;
//		temp=temp*10;
//		temp=temp+(LT&0xf0)*0.625;
//		
//	}

//void Display_all(unsigned char dat)
//{
//	XBYTE[0XC000]=0Xff;
//	XBYTE[0XE000]=dat;
//}

void Displaytemp()
{

	
	DidplaySMG(7,SMGNoDot_CA[temp%10]);
	Delay(100);
	DidplaySMG(6,SMGDot_CA[(temp%100)/10]);
		Delay(100);
	DidplaySMG(5,SMGNoDot_CA[temp/100]);
		Delay(100);
	DidplaySMG(4,0xff);
		Delay(100);
	DidplaySMG(3,0xff);
		Delay(100);
	DidplaySMG(2,0xff);
		Delay(100);
	DidplaySMG(1,0xff);
		Delay(100);
	DidplaySMG(0,0xff);
		Delay(100);

}



void Readtemp()
{
	unsigned char LT,HT;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay(1000);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LT=Read_DS18B20();
	HT=Read_DS18B20();
	
	temp = HT ;
	temp = temp << 8 ;		//左移8位,使MSB中的数据变为temp的高八位,低八位补零
	temp = temp | LT;	
	if((temp & 0xf800) == 0x0000)    //正温度的处理办法
	{
		temp >>= 4;         //取出温度结果的整数部分
		temp = temp*10;    //放大10倍
		temp = temp + (LT&0x0f)*0.625;	//加上小数部分
	}	


}

void main()
{
	closebz();
	CLOSEled();
//	XBYTE[0x8000] = 0XFF;
	while(1)
	{
		Readtemp();
		Displaytemp();
		
	}
}

PWM的运用(呼吸灯)


#include <STC15F2K60S2.H>

unsigned char zhankongbi=0;
	unsigned int i=0;
	unsigned int count=0;
void closeled()
{
	P2=(P2&0X1F)|0X80;
	P0=0xff;
}

void closeBUZ()
{
	P2=(P2&0X1F)|0Xa0;
	P0=0x00;
}
void InitT0()
{
		//璁剧疆瀹氭椂鍣ㄦā寮?
	TMOD |= 0x01;		//璁剧疆瀹氭椂鍣ㄦā寮?
	TH0=(65535-100)/256;
	TL0=(65535-100)%256;
	EA=1;
	ET0=1;

	
}

void Delay(unsigned int t)
{
	while(t--);
}

void Keycont()
{

	if(P30==0)
	{
		Delay(100);
		if(P30==0)
		{
			switch(i)
			{
			case 0:
				P00=0;
				zhankongbi=10;
				TR0=1;
				i=1;
				count = 0;
			break;
			
			case 1:
				zhankongbi=50;
				i=2;
				count = 0;
			break;
			
			case 2:
				zhankongbi=90;
				i=3;
				count = 0;
			break;
			
			case 3:
				P00=1;
				
				TR0=0;
				i=0;
				count = 0;
			break;
			}
			while(P30== 0);
		}
	
	}

}


void ServeT0() interrupt 1
{
	TH0=(65535-100)/256;
	TL0=(65535-100)%256;
	count++;
	if(count==zhankongbi)
	{
		
		P00=1;
	}
	else if(count>100)
	{
		
		P00=0;
		count=0;
	}

	
}


void main()
{
	closeBUZ();
	closeled();  //led放后面 p2锁定在Y4

	InitT0();

	while(1)
	{
	Keycont();
	}
}

时钟(这届考了)

#include <STC15F2K60S2.H>
#include "DS1302.h"

unsigned char writeadrr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char readadrr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

unsigned char time[7]={0x50,0x59,0x10,0x05,0x04,0x02,0x22};

unsigned char SMGNoDot_CA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void set1302()
{
	unsigned int n;
	DS1302_Init();
	DS1302_WriteByte(0x8e,0x00);
	for(n=0;n<7;n++)
	{
		DS1302_WriteByte(writeadrr[n],time[n]);
	}
	DS1302_WriteByte(0x8e,0x80);

}

void read1302()
{
	unsigned char n;
	for(n=0;n<7;n++)
	{
		time[n] = DS1302_ReadByte(readadrr[n]);
	}
}
void Delay(unsigned char t)
{
	while(t--);
}
void smgplay(unsigned char pos,unsigned dat)
{
	P2=(P2&0X1F)|0XC0;
	P0=0X01<<pos;
	P2=(P2&0x1f)|0xE0;
	P0=dat;
}
void smgplaytime()
{
	smgplay(0,SMGNoDot_CA[time[2]/16]);
	Delay(100);
		smgplay(1,SMGNoDot_CA[time[2]%16]);
	Delay(100);
		smgplay(2,0xbf);
	Delay(100);
		smgplay(3,SMGNoDot_CA[time[1]/16]);
	Delay(100);
		smgplay(4,SMGNoDot_CA[time[1]%16]);
	Delay(100);
		smgplay(5,0xbf);
	Delay(100);
		smgplay(6,SMGNoDot_CA[time[0]/16]);
	Delay(100);
		smgplay(7,SMGNoDot_CA[time[0]%16]);
	Delay(100);
}
void closeledbizz()
{
	P2=(P2&0X1F)|0X80;
	P0=0XFF;
	P2=(P2&0x1f)|0xa0;
	P0=0X00;
}


void main()
{
	closeledbizz();
	set1302();
	while(1)
	{
		read1302();
		smgplaytime();
	}

}

AD采集 电压读取

#include <STC15F2K60S2.H>

#include "iic.h"
void Displaytemp();
void Delays(unsigned int t);
void Readtemp();
unsigned int temp;
unsigned int dat;
unsigned char SMGNoDot_CA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char SMGDot_CA[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

void Delay(unsigned int t)
{
	while(t--);
}



void closebz()
{
	P2=(P2&0X1F)|0Xa0;
	P0=0X00;
		P2=(P2&0X1F)|0X80;
	P0=0XFF;
}
void DidplaySMG(unsigned char pos,unsigned char dat)
{
	P2=(P2&0X1F)|0XC0;
	P0=0X01<<pos;
	P2=(P2&0X1F)|0XE0;
	P0=dat;
//	XBYTE[0XE000]=0xff;	



}

void initv()
{


 IIC_Start();		 //总线起始信号
 IIC_SendByte(0x90); //字节写地址
 IIC_WaitAck();		 //等待应答
 IIC_SendByte(0x03); //发送控制字
 IIC_WaitAck();
 
 IIC_Start(); 
 IIC_SendByte(0x91); //字节读地址
 IIC_WaitAck();
 dat=IIC_RecByte();
 IIC_WaitAck();	              //不要乱去省略等待指令,单片机要扯拐
 IIC_Ack(0); 
 IIC_Stop(); 

}

void readv()
{

	dat=dat*10/51;

	DidplaySMG(0,SMGDot_CA[dat/10]);
Delay(100);
		DidplaySMG(1,SMGNoDot_CA[dat%10]);
	Delay(100);
			DidplaySMG(2,SMGNoDot_CA[dat%10]);
	Delay(100);
}

//******D/A转换 写进去的数字 函数 iic通讯******


void main()
{
	closebz();


//	XBYTE[0x8000] = 0XFF;
	while(1)
	{
		initv();
		
		readv();
//		Readtemp();
//		Displaytemp();
		
	}
}

555频率调整

#include <STC15F2K60S2.H>

unsigned int count_t0,count_t1;
unsigned int num;
unsigned char  smg_nodot[10]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
};
void Delay(unsigned char t)
{
	while(t--);
}

void clsledbz()
{
	P2=(P2&0X1F)|0XA0;
	P0=0X00;
	P2=(P2&0X1F)|0X80;
	P0=0XFF;	
}

void smgplay(unsigned char pos,unsigned char dat)
{
	   P2=0xE0;P0=0xff;
	P2=(P2&0X1F)|0Xc0;
	P0=0X01<<pos;
	P2=(P2&0X1F)|0Xe0;
	P0=dat;
}

void InitT01()
{
	TMOD=0X16;
	TH0=0xff;
	TL0=0xff;
	TH1=(65535-50000)/256;
	TL1=(65535-50000)%256;
	EA=1;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
}

void servieT0() interrupt 1
{
	count_t0++;

}

void servieT1() interrupt 3
{
	count_t1++;

	if(count_t1==20)
	{
		num=count_t0;
		count_t0=0;
		count_t1=0;
	}
}


void smgplayhz()
{

	if(num>9999)
	{
		smgplay(3,smg_nodot[num/10000]);
	Delay(100);
	}
	if(num>999)
	{
		smgplay(4,smg_nodot[(num/1000)%10]);
	Delay(100);	
	}
	if(num>99)
	{
		smgplay(5,smg_nodot[(num/100)%10]);
	Delay(100);	
	}

	if(num>9)
	{	smgplay(6,smg_nodot[(num/10)%10]);
	Delay(100);	
	
	}
	smgplay(7,smg_nodot[num%10]);
	Delay(100);
	P2=0xC0;P0=0xff;//消隐
   P2=0xE0;P0=0xff;
}


void main()
{
	clsledbz();
	InitT01();
	while(1)
	{
	smgplayhz();
		
	}
}

当然除了这些之外,LED灯,数码管,继电器和蜂鸣器也要会运用,毕竟这届我们考了继电器和LED灯。可惜最后继电器会干扰蜂鸣器,使蜂鸣器不正常工作。搞的头晕(下次努力!!!)。有什么问题可以评论说,我把经验分享给大家。

  • 11
    点赞
  • 180
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值