这里我先把我弄到的历年考试类型给大家,但是这图只能参考,经历这届蓝桥杯我深有体会,考试当天早上我还在想要不要看看矩阵键盘,但是想着这个考点概率就没去看隔着摆烂,结果真考了按键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灯。可惜最后继电器会干扰蜂鸣器,使蜂鸣器不正常工作。搞的头晕(下次努力!!!)。有什么问题可以评论说,我把经验分享给大家。