【蓝桥杯】第九届蓝桥杯单片机国赛 代码程序

第九届蓝桥杯单片机国赛 程序

题目

历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这里就不再赘述了。

hex文件

读者下载这个文件然后用烧录软件直接烧入单片机就可以用了!

有问题直接找我哟。

链接: https://pan.baidu.com/s/1ei7GwMHEivfu5Hs7yaRyNA?pwd=ab54
提取码: ab54

代码

main.c

#include "stc15.h"
#include "iic.h"
#include "onewire.h"
#define u8 unsigned char
#define u16 unsigned int


//		U:12			F:13		C:14		H:15		P16
u8 code Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0xc1,0x8e,0xc6,0x89,0x8c};
u8 smg_cnt=0;
u8 disbuff[9];


u8	 key_buf=0;


u8 dat_rb2=0;

u16 fre;
u16 fre_tt=0;

u8 mode=1;


u16 T;
u16 T_tt=0;
bit T_flag=0;

u8 dat_rb2_temp=0; 
u16 fre_temp;
u16 T_temp;


u8 dat_rb2_canshu=10;
u8 dat_rb2_canshu_temp=10;

u8 led_state=0xff;


bit rb2_flag=0;
bit L8_flag=0;
u16 L8_tt=0;


bit down_flag1=0;
bit down_flag2=0;

u16 down_tt1=0;


u16 flag_tt=0;

bit flag=0;
//************************ 初始化 程序 ********************************************
void Delay5ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}
void Init_System()
{
	P2&=0x1f;
	P0=0xff;
	P2|=0x80;
	P2&=0x1f;

   	P0=0x00;
	P2|=0xa0;
	P2&=0x1f;

	P0=0xff;
	P2|=0xc0;
	P2&=0x1f;

	P0=0xff;
	P2|=0xe0;
	P2&=0x1f;

}


//************************ 数码管 程序 ********************************************
void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	IE2|=0x04;
	EA=1;
}
void Sevice_Timer2() interrupt 12
{
	 P2&=0x1f;

	 P0=0xff;
	P2|=0xe0;
	P2&=0x1f;

	P0=1<<smg_cnt;
	P2|=0xc0;
	P2&=0x1f;
	if((mode==2||mode==5)&&smg_cnt==6)
	  P0=Tab[disbuff[smg_cnt+1]]&0x7f;
	else if((mode==1||mode==4)&&smg_cnt==5)
	  P0=Tab[disbuff[smg_cnt+1]]&0x7f;
	else  if((mode==7)&&smg_cnt==6)
	  P0=Tab[disbuff[smg_cnt+1]]&0x7f;
	else
		P0=Tab[disbuff[smg_cnt+1]];

	P2|=0xe0;
	P2&=0x1f;

	if(++smg_cnt>=8)
	smg_cnt=0;

	 if(++fre_tt>=1000)
	{
		TR0=0;
		fre_tt=0;
		fre=(TH0<<8)+TL0;
	   	TL0 = 0;		//设置定时初值
		TH0 = 0;		//设置定时初值		
		TR0 = 1;		//定时器0开始计时

	}

	if(++T_tt>=100)
	{
		T_tt=0;
		T_flag=1;
	}


	 if(rb2_flag&&++L8_tt>=200)
	 {
	 	 L8_tt=0;
		 L8_flag=!L8_flag;
	 }


	 if(!down_flag1&&!down_flag2&& key_buf==0x0d&&mode==7 &&++down_tt1>=800)
	 {
	 	  down_flag2=1;
		  down_tt1=0;
	 }

	if(flag&&++flag_tt>=50)
	{
		flag_tt=0;
		if(dat_rb2_canshu<=49)
		dat_rb2_canshu+=1;
	}


}


void Show_SMG_11()
{
	disbuff[1]=11;
	disbuff[2]=11;
	disbuff[3]=11;
	disbuff[4]=11;
	disbuff[5]=11;
	disbuff[6]=11;
	disbuff[7]=11;
	disbuff[8]=11;
}

void Show_SMG_U()
{
	disbuff[1]=12;
	disbuff[2]=11;
	disbuff[3]=11;
	disbuff[4]=11;
	disbuff[5]=11;
	disbuff[6]=11;
	disbuff[7]=dat_rb2/10%10;
	disbuff[8]=dat_rb2%10;
}
void Show_SMG_F()
{
	disbuff[1]=13;
	disbuff[2]=11;
	disbuff[3]=11;
	if(fre>=10000)
	disbuff[4]=fre/10000%10;
	else
	disbuff[4]=11;
	 if(fre>=1000)
	disbuff[5]=fre/1000%10;
	else
	disbuff[5]=11;
	if(fre>=100)
	disbuff[6]=fre/100%10;
	else
	disbuff[6]=11;
	if(fre>=10)
	disbuff[7]=fre/10%10;
	else
	disbuff[7]=11;
	disbuff[8]=fre%10;
}
void Show_SMG_P()
{
	disbuff[1]=16;
	disbuff[2]=11;
	disbuff[3]=11;
	disbuff[4]=11;
	disbuff[5]=11;
	disbuff[6]=11;
	disbuff[7]=dat_rb2_canshu/10%10;
	disbuff[8]=dat_rb2_canshu%10;
}
void Show_SMG_HC()
{
	disbuff[1]=15;
	disbuff[2]=14;
	disbuff[3]=11;
	disbuff[4]=11;

	disbuff[5]=T_temp/1000%10;
	disbuff[6]=T_temp/100%10;
	disbuff[7]=T_temp/10%10;
	disbuff[8]=T_temp%10;
}
void Show_SMG_HU()
{
	disbuff[1]=15;
	disbuff[2]=12;
	disbuff[3]=11;
	disbuff[4]=11;
	disbuff[5]=11;
	disbuff[6]=11;
	disbuff[7]=dat_rb2_temp/10%10;
	disbuff[8]=dat_rb2_temp%10;
}
void Show_SMG_HF()
{
	disbuff[1]=15;
	disbuff[2]=13;
	disbuff[3]=11;
	if(fre_temp>=10000)
	disbuff[4]=fre_temp/10000%10;
	else
	disbuff[4]=11;
	 if(fre_temp>=1000)
	disbuff[5]=fre_temp/1000%10;
	else
	disbuff[5]=11;
	if(fre_temp>=100)
	disbuff[6]=fre_temp/100%10;
	else
	disbuff[6]=11;
	if(fre_temp>=10)
	disbuff[7]=fre_temp/10%10;
	else
	disbuff[7]=11;
	disbuff[8]=fre_temp%10;
}
void Show_SMG_C()
{
	disbuff[1]=14;
	disbuff[2]=11;
	disbuff[3]=11;
	disbuff[4]=11;

	disbuff[5]=T/1000%10;
	disbuff[6]=T/100%10;
	disbuff[7]=T/10%10;
	disbuff[8]=T%10;
}
void Show_SMG()
{
	if(mode==2)
	{
		Show_SMG_U();
			
	}
	else if(mode==3)
	{
		Show_SMG_F();
			
	}
	else if(mode==1)
	{
		Show_SMG_C();
			
	}
	else if(mode==4)
	{
		Show_SMG_HC();
			
	}
	else if(mode==5)
	{
		Show_SMG_HU();
			
	}
	else if(mode==6)
	{
		Show_SMG_HF();
			
	}
	else if(mode==7)
	{
		Show_SMG_P();
			
	}
}
//************************ 按键 程序 ********************************************
void Scan_Key()
{
	u8 key_temp;
	key_temp=P3&0x0f;
	if(key_temp!=0x0f&&!key_buf)
	{
		Delay5ms();
		key_temp=P3&0x0f;
		if(key_temp!=0x0f&&!key_buf)
		{
			  key_buf=key_temp;
		}	
	}
	else if(key_temp==0x0f&&key_buf)
	{
		Delay5ms();
		key_temp=P3&0x0f;
		if(key_temp==0x0f&&key_buf)
		{
			  switch(key_buf)
			  {
			  	case 0x07:
				if(mode<=3)
				{
					if(++mode>=4)
					mode=1;
				}
				else if(mode<=6)
				{
					if(++mode>=7)
					mode=4;
				}
				break;//S4
				case 0x0b:
				Write_AT24C02(0x00,T/256);Delay5ms();
				Write_AT24C02(0x01,T%256);Delay5ms();
				Write_AT24C02(0x02,dat_rb2);Delay5ms();
				Write_AT24C02(0x03,fre/256);Delay5ms();
				Write_AT24C02(0x04,fre%256);Delay5ms();

				break;//S5
				case 0x0d:
				if(!down_flag1)
				{
					if(mode<=3)
					{
						mode=4;
						T_temp=Read_AT24C02(0x00)*256+Read_AT24C02(0x01);
						dat_rb2_temp= Read_AT24C02(0x02);
						fre_temp=Read_AT24C02(0x03)*256+Read_AT24C02(0x04);
					}
					else  if(mode<=6)
					{
						mode=1;
					}
					else if(mode==7)
					{
						if(dat_rb2_canshu<=49)
						{
							dat_rb2_canshu+=1;
						}
					}
				}
				down_flag1=0;
				down_tt1=0;
				flag=0;
				break;//S6
				case 0x0e:
				if(mode<=3)
				{
					mode=7;
				}
				else if(mode==7)
				{
				mode=1;
				dat_rb2_canshu_temp=dat_rb2_canshu;
				}
				break;//S7
			  }

			  key_buf=0;
		}
			
	}
	if(mode==7&&key_buf==0x0d&&down_flag2)
	{
		down_flag2=0;
		down_flag1=1;
		flag=1;

	}

}
//************************ 555频率 程序 ********************************************
void Timer0Init(void)		//1毫秒@12.000MHz
{

	TMOD &= 0xF0;		//设置定时器模式
	TMOD |=0x04;

	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}
//************************ 主 程序 ********************************************
void main()
{
	Init_System();
	Timer0Init();
	Timer2Init();
	if(Read_AT24C02(0x1f)!=123)
	{
		   Write_AT24C02(0x1f,123);Delay5ms();

		   Write_AT24C02(0x00,T_temp/256);Delay5ms();
				Write_AT24C02(0x01,T_temp%256);Delay5ms();
				Write_AT24C02(0x02,dat_rb2_temp);Delay5ms();
				Write_AT24C02(0x03,fre_temp/256);Delay5ms();
				Write_AT24C02(0x04,fre_temp%256);Delay5ms(); 
	 }
	else 
	{
		T_temp=Read_AT24C02(0x00)*256+Read_AT24C02(0x01);
					dat_rb2_temp= Read_AT24C02(0x02);
					fre_temp=Read_AT24C02(0x03)*256+Read_AT24C02(0x04);
	}
	while(1)
	{
		if(T_flag)
		{
			T_flag=0;
			T=(u16)(Read_Temp()*100) ;
		}
		dat_rb2=Read_PCF8591(3)/255.0*50;
		dat_rb2=Read_PCF8591(3)/255.0*50;

		Scan_Key();
		Show_SMG();
		led_state=0xff;


	if(mode==1)
		led_state&=0xfe;
	else if(mode==3)
		led_state&=0xfd;
	else if(mode==2)
	led_state&=0xfb;

	if(dat_rb2>dat_rb2_canshu_temp)
		rb2_flag=1;
	else
	{ 
	   rb2_flag=0;
	 	 L8_flag=0;
	 }

	if(L8_flag)
		led_state&=0x7f;


	P0=led_state;P2|=0x80;P0=led_state;P2&=0x1f;
	}
	



}

iic.h

#ifndef _IIC_H
#define _IIC_H

#include "stc15.h"
#include "intrins.h"

sbit SDA = P2^1;
sbit SCL = P2^0;

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
unsigned char Read_PCF8591(unsigned char channel);
void Write_AT24C02(unsigned char addr,unsigned char dat);
unsigned char Read_AT24C02(unsigned char addr);
#endif

iic.c

#include "iic.h"

#define DELAY_TIME 5

//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}

//I2C总线启动信号
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//I2C总线停止信号
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}
unsigned char Read_PCF8591(unsigned char channel)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40|channel);
	IIC_WaitAck();

	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();



	return temp;
}
unsigned char Read_AT24C02(unsigned char addr)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();

	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();



	return temp;
}
void Write_AT24C02(unsigned char addr,unsigned char dat)
{
	
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();

	IIC_Stop();

 }	

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include "stc15.h"

sbit DQ = P1^4;  

float Read_Temp();

#endif

onewire.c

#include "onewire.h"

//单总线内部延时函数
void Delay_OneWire(unsigned int t);  


//单总线写操作
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//单总线读操作
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}
float Read_Temp()
{
	unsigned int temp;
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);

	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();

	temp=(MSB<<8)+LSB;

	return temp*0.0625;

		
}
void Delay_OneWire(unsigned int t)  
{
	t*=12;
	while(t--);
}

工程文件

链接: https://pan.baidu.com/s/11eTjeSiZuhCEc0iHzCFlzg?pwd=i5jq
提取码: i5jq

B站视频

我在B站发布了自己完成代码的过程,想要了解的朋友可以点击呀,第九届蓝桥杯单片机国赛

更多资料

需要更多蓝桥杯资料的小可爱,可以关注公众号【玛德花】,回复 蓝桥杯 即可,也随时欢迎需要交流的小伙伴一起讨论呀。
蓝桥杯

省赛

国赛

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值