【蓝桥杯】第十三届蓝桥杯单片机第一次省赛(省一)

第十三届蓝桥杯单片机第一次省赛

题目

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

hex文件

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

有问题直接找我哟。

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

代码

main.c

#include "stc15.h"
#include "onewire.h"
#include "ds1302.h"
#define u8 unsigned char
#define u16 unsigned int
#define get() (P3&0x3f)|((P4&0x10)<<3)|((P4&0x04)<<4)|0xc3

// 12:U
u8 code Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0xc1};
u8 smg_cnt=0;
u8 disbuff[9];
u16 T;
u16 T_tt=0;
bit T_flag=0;

u8	 key_buf=0;

u8 mode=1;


extern u8 TIME[];


u8 T_canshu=23;
u8    T_canshu_temp=23;

bit s_flag=0;


bit a_flag=0;		  //0:温度	1:时间模式


u8 beep_state=0x00;

bit b_flag=0;			//时间控制  继电器


u16 b_tt=0;
bit c_flag=0;			
u16 c_tt=0;
u16 sec=0;

bit e_flag=0;		//继电器吸合	
u16 e_tt=0;


bit d_flag=0;  //整点标志
u8 led_state=0xff;


bit L3_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(smg_cnt==6&&mode==1)
	  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(++T_tt>=300)
		{
			T_tt=0;
			T_flag=1;
		}


   if(b_flag&&++b_tt>=5000)
   {
   		b_tt=0;
		b_flag=0;
   }
   if(c_flag&&++c_tt>=5000)
   {
   		c_tt=0;
		c_flag=0;
   }
   if(e_flag&&++e_tt>=100)
   {
   		e_tt=0;
		L3_flag=!L3_flag;
   }

}




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_1()
{
	disbuff[1]=12;
	disbuff[2]=mode;
	disbuff[3]=11;
	disbuff[4]=11;
	disbuff[5]=11;

	disbuff[6]=T/100%10;
	disbuff[7]=T/10%10;
	disbuff[8]=T%10;
}
void Show_SMG_2()

{	disbuff[1]=12;
	disbuff[2]=mode;
	disbuff[3]=11;
	if(s_flag==0)
	{
	disbuff[4]=TIME[2]/16;
	disbuff[5]=TIME[2]%16;
	disbuff[6]=10;
	disbuff[7]=TIME[1]/16;
	disbuff[8]=TIME[1]%16;
	}
	else 
	{
	disbuff[4]=TIME[1]/16;
	disbuff[5]=TIME[1]%16;
	disbuff[6]=10;
	disbuff[7]=TIME[0]/16;
	disbuff[8]=TIME[0]%16;	
	}
	
}
void Show_SMG_3()
{
	disbuff[1]=12;
	disbuff[2]=mode;
	disbuff[3]=11;
	disbuff[4]=11;
	disbuff[5]=11;

	disbuff[6]=11;
	disbuff[7]=T_canshu/10%10;
	disbuff[8]=T_canshu%10;
}
void Show_SMG()
{
	if(mode==1)
	{
		Show_SMG_1();
	}
	else  if(mode==2)
	{
		Show_SMG_2();
	}
	else  if(mode==3)
	{
		Show_SMG_3();
	}
}

//************************ 按键 程序 ********************************************
void Scan_Key_B()
{
		u8 key_temp;
		P35=1;P34=1;P33=0;P32=0;
		key_temp=get();
		P35=0;P34=0;P33=1;P32=1;
		key_temp|=get();
		if(key_temp!=0xff&&!key_buf)
		{
			Delay5ms();
			P35=1;P34=1;P33=0;P32=0;
			key_temp=get();
			P35=0;P34=0;P33=1;P32=1;
			key_temp|=get();
			if(key_temp!=0xff&&!key_buf)
			{
				key_buf=key_temp;

				

				if(mode==2&&key_buf==0xeb)
				{
					s_flag=1;
				}
			}
				
		}
		else if(key_temp==0xff&&key_buf)
		{
			Delay5ms();
			P35=1;P34=1;P33=0;P32=0;
			key_temp=get();
			P35=0;P34=0;P33=1;P32=1;
			key_temp|=get();
			if(key_temp==0xff&&key_buf)
			{
				switch(key_buf)
				{
				


					case 0xd7:
					if(mode<=3)
					{
						if(++mode>=4)
						{
						mode=1;
						T_canshu_temp=T_canshu;
						}
					}
					break;//S12
					case 0xdb:
					a_flag=! a_flag;
					break;//S13
				

					case 0xe7:
					if(mode==3)
					{
						if(T_canshu<=98)
						{
							T_canshu+=1;	
						}
					}
					
						
					break;//S16
					case 0xeb:
					if(mode==3)
					{
						if(T_canshu>=11)
						{
							T_canshu-=1;	
						}
					}
					s_flag=0;
					break;//S17
					

				}
				key_buf=0;
			}
				
		}

}
//************************ 主函数 程序 ********************************************
void main()
{
	Init_System();

	Timer2Init();
	DS1302_Config();

	while(1)
	{
		if(T_flag)
		{
			T_flag=0;
			T=(u16)(Read_Temp()*10) ;
		}
		Read_Time();
		Scan_Key_B();
		
		Show_SMG();
		if(sec!=TIME[0])
		{	
			sec=TIME[0];		
			if(TIME[1]==0&&TIME[0]==0)
			{
				 c_flag=1;

				 d_flag=1;
	
			}
			else
			{
				d_flag=0;
			}

		}
		
		beep_state=0x00;

		if(a_flag==0)
		{
			if(T>T_canshu_temp*10)
			{
				beep_state|=0x10;
			}
		}
		else
		{
			if(d_flag)
			{				
					 b_flag=1;
						
			}
		}
		if(b_flag)
		{
			beep_state|=0x10;	
		}
		if(b_flag)
			e_flag=1;
		else if((a_flag==0)&&(T>T_canshu_temp*10))
		{
			e_flag=1;
		}
		else
		{
			 e_flag=0;
			 L3_flag=0;
		}
		led_state=0xff;


		if(c_flag)
			led_state&=0xfe;
		if(a_flag==0)
			led_state&=0xfd;
	


		if(L3_flag)
			led_state&=0xfb;
		P0=led_state;P2|=0x80;P0=led_state;P2&=0x1f;

		P0=beep_state;P2|=0xa0;P0=beep_state;P2&=0x1f;
	}
}

ds1302.h

#ifndef __DS1302_H
#define __DS1302_H

#include <stc15.h>
#include <intrins.h>

sbit SCK = P1^7;		
sbit SDA = P2^3;		
sbit RST = P1^3; 

void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void DS1302_Config();
void Read_Time();

#endif

ds1302.c

#include "ds1302.h"  									
unsigned char TIME[3]={0x50,0x59,0x23};

unsigned char read_addr[3]={0x81,0x83,0x85};
unsigned char write_addr[3]={0x80,0x82,0x84};
//写字节
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK = 0;
		SDA = temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

//向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}

//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();
	return (temp);			
}
void DS1302_Config()
{
	unsigned char i;
	Write_Ds1302_Byte(0X8e,0X00);	
	for(i=0;i<=2;i++)
	{
		  Write_Ds1302_Byte(write_addr[i],TIME[i]);
	}
	Write_Ds1302_Byte(0X8e,0X80);	
}

void Read_Time()
{
	unsigned char i;
	
	for(i=0;i<=2;i++)
	{
		  TIME[i]=Read_Ds1302_Byte(read_addr[i]);
	}
	
}

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/1cReYonDDjUXZF6Ry8ZrC3w?pwd=hv8h
提取码: hv8h

B站视频

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

更多资料

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

省赛

国赛

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值