蓝桥杯单片机组第十一届省赛代码

第十一届蓝桥杯考察的知识点有:

        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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值