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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值