第十届蓝桥杯考察的知识点有:
1.数码管显示;2.LED灯显示;3.独立按键;4.AD转换;5.DAC输出;6.NE555。
本次考试考察了NE555的使用,可以通过定时器来计数脉冲数,进而计算频率。
用定时器0使用8位重装的方法来计数,定时器1定时1s来采样数据。
关于定时器的代码如下:
void timer_init()
{
TMOD=0X16;
TH0=0XFF;
TL0=0XFF;
TH1=0X3C;
TL1=0XB0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void timer0() interrupt 1
{
count++;
}
void timer1() interrupt 3
{
TH1=0X3C;
TL1=0XB0;
i++;
if(i==20)
{
count_f=count;
count=0;
i=0;
}
}
全部代码如下:
main.c
#include<stc15f2k60s2.h>
#include"iic.h"
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
sbit L5=P0^4;
unsigned int count;
unsigned int count_f;
long v;
unsigned char i;
unsigned char wei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xc1};
unsigned char tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char qie=1;
unsigned char mod=1;
unsigned char LED_flag=1;
unsigned char SEG_flag=1;
void allinit()
{
P2=0X80;P0=0XFF;
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void timer_init()
{
TMOD=0X16;
TH0=0XFF;
TL0=0XFF;
TH1=0X3C;
TL1=0XB0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void delay(int i)
{
while(i--);
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
i = 22;
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;
}
void display1()
{
SEG(0,count_f%10);
if(count_f>=10)
SEG(1,count_f%100/10);
if(count_f>=100)
SEG(2,count_f%1000/100);
if(count_f>=1000)
SEG(3,count_f%10000/1000);
if(count_f>=10000)
SEG(4,count_f%100000/10000);
if(count_f>=100000)
SEG(4,count_f%1000000/100000);
SEG(7,10);
}
void display2()
{
SEG(7,11);
SEG(0,v%10);
SEG(1,v/10%10);
SEG1(2,v/100);
}
void DAC_key()
{
if(mod==0)
DAC(v);
if(mod==1)
DAC(102);
}
void LED()
{
if(qie==1)
{
P2=0X80;
L1=0;
}
else
{
P2=0X80;
L1=1;
}
if(qie==0)
{
P2=0X80;
L2=0;
}
else
{
P2=0X80;
L2=1;
}
if(v<150)
{
P2=0X80;
L3=1;
}
else if(v>=150&&v<250)
{
P2=0X80;
L3=0;
}
else if(v>=250&&v<350)
{
P2=0X80;
L3=1;
}
else if(v>=350)
{
P2=0X80;
L3=0;
}
if(count_f<1000)
{
P2=0X80;
L4=1;
}
else if(count_f>=1000&&count_f<5000)
{
P2=0X80;
L4=0;
}
else if(count_f>=5000&&count_f<10000)
{
P2=0X80;
L4=1;
}
else if(count_f>=10000)
{
P2=0X80;
L4=0;
}
if(mod==0)
{
P2=0X80;
L5=0;
}
else
{
P2=0X80;
L5=1;
}
// P2=0X00;
// P0=0Xff;
}
void main()
{
timer_init();
allinit();
while(1)
{
v=read_v();
DAC_key();
v=v*500/255;
if(LED_flag==1)
LED();
if(qie==0&&SEG_flag==1)
display1();
if(qie==1&&SEG_flag==1)
display2();
if(P33==0)
{
delay(10);
if(P33==0)
{
qie=!qie;
}
while(P33==0)
{
v=read_v();
DAC_key();
v=v*500/255;
if(qie==0&&SEG_flag==1)
display1();
if(qie==1&&SEG_flag==1)
display2();
if(LED_flag==1)
LED();
}
}
if(P32==0)
{
delay(10);
if(P32==0)
{
mod=!mod;
}
while(P32==0)
{
v=read_v();
DAC_key();
v=v*500/255;
if(qie==0&&SEG_flag==1)
display1();
if(qie==1&&SEG_flag==1)
display2();
if(LED_flag==1)
LED();
}
}
if(P31==0)
{
delay(10);
if(P31==0)
{
LED_flag=!LED_flag;
P2=0X80;
P0=0Xff;
}
while(P31==0)
{
v=read_v();
DAC_key();
v=v*500/255;
if(qie==0&&SEG_flag==1)
display1();
if(qie==1&&SEG_flag==1)
display2();
if(LED_flag==1)
LED();
}
}
if(P30==0)
{
delay(10);
if(P30==0)
{
SEG_flag=!SEG_flag;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
while(P30==0)
{
v=read_v();
DAC_key();
v=v*500/255;
if(qie==0&&SEG_flag==1)
display1();
if(qie==1&&SEG_flag==1)
display2();
if(LED_flag==1)
LED();
}
}
}
}
void timer0() interrupt 1
{
count++;
}
void timer1() interrupt 3
{
TH1=0X3C;
TL1=0XB0;
i++;
if(i==20)
{
count_f=count;
count=0;
i=0;
}
}
iic.c
#include<stc15f2k60s2.h>
#include "iic.h"
sbit SDA = P2^1; /* 数据线 */
sbit SCL = P2^0; /* 时钟线 */
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 DAC(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
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 DAC(unsigned char dat);
#endif