第十一届蓝桥杯考察的知识点有:
1.数码管显示;2.LED灯显示;3.矩阵按键;4.AD转换;5.AT24C02;6.定时器。
比赛的的这个计数值加1是一个难点,要在VAIN3下降时和Vp相等使V加1,而在上升时和Vp相等不加。我的思路是,在加1之前VAIN3一定大于Vp,所以只要先写一个VAIN3>Vp的条件,如果符合的话就执行条件中的语句,在条件中再次读取VAIN3,判断VAIN3是否小于等于Vp,如果符合的话,就让计数值加1。
void count_key()
{
if(v>can)
{
v=read_v();
v=v*500/255;
if(v<=can)
count++;
}
}
其他功能实现相对较容易。
全部代码:
main.c
#include<stc15f2k60s2.h>
#include"seg.h"
#include"iic.h"
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
long v;
long can=300;
unsigned char count=0;
unsigned char qie=0;
unsigned char a;
unsigned char flag;
unsigned char flag1;
unsigned char i;
void allinit()
{
P2=0X80;P0=0XFF;
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void timerinit()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
}
void display1()
{
SEG(7,10);
SEG(0,v%10);
SEG(1,v/10%10);
SEG1(2,v/100);
}
void display2()
{
SEG(7,11);
SEG(0,can%10);
SEG(1,can/10%10);
SEG1(2,can/100);
}
void display3()
{
SEG(7,12);
SEG(0,count%10);
SEG(1,count/10%10);
SEG(2,count/100);
}
void LED()
{
if(v<can)
{
TR0=1;
}
else
{
TR0=0;
i=0;
flag1=0;
}
if(flag1==1)
{
P2=0X80;
L1=0;
}
if(flag1==0)
{
P2=0X80;
L1=1;
}
if(count%2==1)
{
P2=0X80;
L2=0;
}
else
{
P2=0X80;
L2=1;
}
if(flag>=3)
{
P2=0X80;
L3=0;
}
else
{
P2=0X80;
L3=1;
}
P2=0X00;
P0=0XFF;
}
void count_key()
{
if(v>can)
{
v=read_v();
v=v*500/255;
if(v<=can)
count++;
}
}
void main()
{
allinit();
can=read()*10;
timerinit();
while(1)
{
while(1)
{
count_key();
LED();
if(qie==0)
display1();
if(qie==1)
display2();
if(qie==2)
display3();
v=read_v();
v=v*500/255;
P44=1;P42=1;P3=0XDF;
if(P3==0XD7||P3==0XDB)//s12s13
break;
P44=1;P42=1;P3=0XEF;
if(P3==0XE7||P3==0XEB)//s16s17
break;
}
a=P3;
switch(a)
{
case 0XD7:qie++;
if(qie==2)write(can/10);
flag=0;break;//s12
case 0XDB:if(qie==2){count=0;flag=0;}
else flag++;break;//s13
case 0XE7:if(qie==1){can+=50;flag=0;}
else flag++;break;//s16
case 0XEB:if(qie==1){can-=50;flag=0;}
else flag++;break;//s17
};
if(can==550)
{
can=0;
}
else if(can==-50)
{
can=500;
}
if(qie==3)
qie=0;
while(P3==a)
{
if(qie==0)
display1();
if(qie==1)
display2();
if(qie==2)
display3();
}
}
}
void timer0() interrupt 1
{
TH0=0X3C;
TL0=0XB0;
i++;
if(i==100)
{
flag1=1;
}
}
seg.c
#include<stc15f2k60s2.h>
#include"seg.h"
unsigned char wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0x8c,0xc8};
unsigned char tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void SEG(int a,int b)
{
P2=0XC0;P0=wei[a];
P2=0XE0;P0=tab[b];
Delay1ms();
P2=0X00;
P0=0XFF;
}
void SEG1(int a,int b)
{
P2=0XC0;P0=wei[a];
P2=0XE0;P0=tab1[b];
Delay1ms();
P2=0X00;
P0=0XFF;
}
seg.h
void SEG(int a,int b);
void SEG1(int a,int b) ;
void Delay1ms() ;
iic.c
#include<stc15f2k60s2.h>
#include "iic.h"
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
long V_Rb2;
long V_Rb1;
void Delay6us() //@11.0592MHz
{
unsigned char i;
i = 14;
while (--i);
}
//总线启动条件
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;
}
//应答位控制
void IIC_Ack(unsigned char ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}
//等待应答
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;
Delay6us();
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
Delay6us();
}
return da;
}
unsigned char read_v()
{
unsigned char v;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
v=IIC_RecByte();
return v;
}
void write(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char read()
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(0x01);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
dat=IIC_RecByte();
return dat;
}
iic.h
#ifndef _IIC_H
#define _IIC_H
#include<stc15f2k60s2.h>
#include "intrins.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
//总线引脚定义
//函数声明
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(unsigned char ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
unsigned char read_v();
void write(unsigned char dat);
unsigned char read();
#endif