蓝桥杯单片机第十四届省赛题目+代码

第一次发CSDN,代码都是自己写的,仅供参考,不保证全对,也是第一次参加蓝桥杯单片机组,也是自己学习的证明吧。

 

 Main文件

#include <STC15F2K60S2.H>
#include "stdio.h"
#include "Key.h"
#include "Nixie.h"
#include "ds1302.h"
#include "iic.h"
#include "onewire.h"
unsigned char keynum;
unsigned char String[10];
unsigned char String_Buff[9];
unsigned int NE_Count,NE;
unsigned int T,Now_T;
unsigned char T_CS=30;
unsigned char SD,Now_SD;
unsigned char AD;
unsigned char showmode;
unsigned char MAX_T;
unsigned int PJ_T,SUM_T;
unsigned char MAX_SD;
unsigned int PJ_SD,SUM_SD;
unsigned char Inter_Time;
unsigned char Last_Hou,Last_Min;
bit CA_Flag;
bit WSD_Flag;
bit WSD_ShowFlag;
bit WSD_NYFlag=1;
unsigned char led_char=0xff;
unsigned char LED_SS;
bit LED_SSFlag;
bit LED_SGFlag;
bit LED_LOW;
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD |= 0x04;		//设置定时器模式
	TL0 = 0xff;		//设置定时初值
	TH0 = 0xff;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=EA=1;
}
void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x20;		//设置定时初值
	TH1 = 0xD1;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1=EA=1;
}

void Init_All()
{
	P0=0x00;
	P2=(P2&0x1f)|0xa0;
	P2&=0x1f;
	Timer0Init();
	Timer1Init();
	Set_Time();
	Read_T();
}
void Nixie_Logic()
{
	if(WSD_ShowFlag)
	{
		if(WSD_NYFlag)
			sprintf(String,"E  %02d-%02d",T,(unsigned int)SD);
		else
			sprintf(String,"E  %02d-AA",Now_T);
	}
	else
	{
		switch(showmode)
		{
			case 0x00:sprintf(String,"%02u-%02u-%02u",(unsigned int)Time_Tab[0],(unsigned int)Time_Tab[1],(unsigned int)Time_Tab[2]);break;
			case 0x10:sprintf(String,"C %02d-%02d.%01d",(unsigned int)MAX_T,PJ_T/10,PJ_T%10);break;
			case 0x11:sprintf(String,"H %02d-%02d.%01d",(unsigned int)MAX_SD,PJ_SD/10,PJ_SD%10);break;
			case 0x12:sprintf(String,"F%02d%02d-%02d",(unsigned int)Inter_Time,(unsigned int)Last_Hou,(unsigned int)Last_Min);break;
			case 0x20:sprintf(String,"P     %02d",(unsigned int)T_CS);break;
		}
	}
		
	Nixie_Set(String,String_Buff);
}


void WSD_JS()
{
	if(WSD_Flag)
	{
		WSD_Flag=0;
		if((NE>=200) && (NE<=2000))
		{
			WSD_NYFlag=1;
			Inter_Time++;
			Last_Hou=Time_Tab[0];
			Last_Min=Time_Tab[1];
			if((Now_T>T) && ((NE*0.0444+1.111)>SD))
			{
				LED_SGFlag=1;
			}
			else LED_SGFlag=0;
			
			T=Now_T;
			SD=(NE*0.0444)+1.111;
			if(T>MAX_T) MAX_T=T;
			if(SD>MAX_SD) MAX_SD=SD;
			SUM_T+=T*10;
			SUM_SD+=SD*10;
			PJ_T=SUM_T/Inter_Time;
			PJ_SD=SUM_SD/Inter_Time;
		}
		else
		{
			WSD_NYFlag=0;
		}
	}
}


void Key_Logic()
{
	if(!WSD_ShowFlag)
	{
		if(!(showmode==0x12 && Key_Get[1][1]==0))
		{
			keynum=Key();
		}
		
		if(keynum==1)
		{
			switch(showmode&0xf0)
			{
				case 0x00:showmode=0x10;break;
				case 0x10:showmode=0x20;break;
				case 0x20:showmode=0x00;break;
			}
		}
		if(keynum==3)
		{
			switch(showmode)
			{
				case 0x10:showmode=0x11;break;
				case 0x11:showmode=0x12;break;
				case 0x12:showmode=0x10;break;
			}
		}
		
		if(keynum==2)
		{
			if(showmode==0x20)
			{
				T_CS++;
				if(T_CS>99)	T_CS=0;
			}
		}
		
		if(keynum==4)
		{
			if(showmode==0x20)
			{
				T_CS--;
				if(T_CS>200) T_CS=99;
			}
		}
		
		if(CA_Flag && showmode==0x12)
		{
			CA_Flag=0;
			MAX_T=PJ_T=MAX_SD=PJ_SD=Inter_Time=Last_Hou=Last_Min=0;
			//
			T_CS=0;
		}
	}
	else
	{
		WSD_JS();
	}
	
}

void LED_Logic()
{
	if(showmode==0x00)led_char&=0xfe;
	else led_char|=0x01;
	
	if((showmode&0xf0)==0x10)led_char&=0xfd;
	else led_char|=0x02;
	
	if(WSD_ShowFlag)led_char&=0xfb;
	else led_char|=0x04;
	
	if(Now_T>T_CS)
	{
		LED_SSFlag=1;
	}
	else
	{
		LED_SSFlag=0;
		LED_SS=0;
		led_char|=0x08;
	}
	if(LED_SSFlag)
	{
		if(LED_SS<100)led_char&=0xf7;
		else if(LED_SS>=100 && LED_SS<200) led_char|=0x08;
		else{LED_SS=0;}
	}
	
	if(!WSD_NYFlag)led_char&=0xef;
	else led_char|=0x10;
	
	if(Inter_Time>=2)
	{
		if(LED_SGFlag)
			led_char&=0xdf;
		else led_char|=0x20;
	}
	
	if(LED_LOW)
	{
		LED_LOW=0;
		P0=led_char;
		P2=(P2&0x1f)|0x80;
		P2&=0x1f;
	}
	
}

void main()
{
	Init_All();
	while(1)
	{
		Nixie_Logic();
		Key_Logic();
		LED_Logic();
	}
}
void T0_LP()	interrupt 1
{
	NE_Count++;
}
void T1_LP()	interrupt 3
{
	unsigned int Count,Count1;
	unsigned int CA,WSD_Count;
	unsigned char AD_Count;
	Nixie_Loop(String_Buff);
	Key_Loop();
	Count++;
	Count1++;
	AD_Count++;
	LED_LOW=1;
	if(LED_SSFlag)
	{
		LED_SS++;
	}
	
	//亮度
	if(AD_Count>=200)
	{
		AD_Count=0;
		if(ADC()<50 && WSD_ShowFlag==0)
		{
			WSD_Flag=1;
			WSD_ShowFlag=1;
		}
	}
	if(WSD_ShowFlag)
	{
		WSD_Count++;
		if(WSD_Count>=3000)
		{
			WSD_Count=0;
			WSD_ShowFlag=0;
		}
	}
	
	//NE 温度
	if(Count1>=500)
	{
		Count1=0;
		NE=NE_Count*2;
		NE_Count=0;
		Now_T=Read_T();
	}
	//时间
	if(Count>=1000)
	{
		Count=0;
		Read_Time();
	}
	
	if(showmode==0x12 && Key_Get[1][1]==0)
	{
		CA++;
		if(CA>=2000) 
		{
			CA_Flag=1;
			CA=0;
		}
	}
	if(showmode==0x12 && Key_Get[1][1]==1)
	{
		if(CA>0) 
		{
			keynum=4;
			CA=0;
		}
	}
	
}

Nixie文件

#include <STC15F2K60S2.H>
void Nixie_Set(unsigned char* str,unsigned char* buff)
{
	unsigned char i,j,temp;
	for(i=1,j=0;i<9;i++,j++)
	{
		switch(str[j])
		{
			case '0':temp=0xc0;break;
			case '1':temp=0xf9;break;
			case '2':temp=0xa4;break;
			case '3':temp=0xb0;break;
			case '4':temp=0x99;break;
			case '5':temp=0x92;break;
			case '6':temp=0x82;break;
			case '7':temp=0xf8;break;
			case '8':temp=0x80;break;
			case '9':temp=0x90;break;
			case ' ':temp=0xff;break;
			case '-':temp=0xbf;break;
			case 'C':temp=0xc6;break;
			case 'H':temp=0x89;break;
			case 'F':temp=0x8e;break;
			case 'P':temp=0x8c;break;
			case 'E':temp=0x86;break;
			case 'A':temp=0x88;break;
			
		}
		if(str[j+1]=='.')
		{
			temp&=0x7f;
			j++;
		}
		buff[i]=temp;
	}
}
void Nixie_Loop(unsigned char* buff)
{
	static unsigned char i=1;
	P0=0xff;
	P2=(P2&0x1f)|0xe0;
	P2&=0x1f;
	
	P0=0x01<<(i-1);
	P2=(P2&0x1f)|0xc0;
	P2&=0x1f;
	
	P0=buff[i];
	P2=(P2&0x1f)|0xe0;
	P2&=0x1f;
	
	i++;
	if(i>8) i=1;
}

Key文件

#include <STC15F2K60S2.H>
sbit H1=P3^3;
sbit H2=P3^2;
sbit L1=P4^4;
sbit L2=P4^2;
unsigned char Key_Get[2][2]={{1,1},{1,1}};
unsigned char Last_Key_Get[2][2]={{1,1},{1,1}};
unsigned char Key()
{
	unsigned char i,j;
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			if(Key_Get[i][j]==0)
			{
				if(Last_Key_Get[i][j]==1)
				{
					Last_Key_Get[i][j]=0;
					return i*2+j+1;
				}
				else return 0;
			}
		}
	}
	return 0;
}
void Key_Loop()
{
	static unsigned char Buff[2][2]={{0xff,0xff},{0xff,0xff}};
	static unsigned char loop;
	unsigned char i;
	Buff[loop][0]=(Buff[loop][0]<<1)|L1;
	Buff[loop][1]=(Buff[loop][1]<<1)|L2;
	for(i=0;i<2;i++)
	{
		if(Buff[loop][i]==0xff)
		{
			Last_Key_Get[loop][i]=1;
			Key_Get[loop][i]=1;
		}
		else if(Buff[loop][i]==0x00)
			Key_Get[loop][i]=0;
	}
	loop++;
	loop%=2;
	switch(loop)
	{
		case 0:H2=1;H1=0;break;
		case 1:H1=1;H2=0;break;
	}
}

iic文件

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <STC15F2K60S2.H>
#include "intrins.h"
#define DELAY_TIME	5
sbit sda=P2^1;
sbit scl=P2^0;
//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}
unsigned char ADC()
{
	unsigned char temp;
	EA=0;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x01);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	EA=1;
	return temp;
}

onewire文件

/*	# 	单总线代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <STC15F2K60S2.H>
sbit DQ=P1^4;
//
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
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;
}

//
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;
}
unsigned int Read_T()
{
	unsigned char TL,TH;
	unsigned int T;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	TL=Read_DS18B20();
	TH=Read_DS18B20();
	T=(TH<<8)|TL;
	T=T>>4;
	T+=(TL&0x0f)*0.0625;
	return T;
}

头文件就不写出来了,毕竟都一样。

我自己测试功能感觉都是正确的,毕竟没有人会认为自己写的代码有问题哈哈哈,评论如果问题我看到的话会回复,没回复的话要不就是没看到,要不就是我也不知道。

好了就这么多,加纳!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值