蓝桥杯单片机第十四届省赛题目和程序答案

这篇具有很好参考价值的文章主要介绍了蓝桥杯单片机第十四届省赛题目和程序答案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 1、前言

 2、题目

3、程序架构 

   3.1 display.c

   3.2 ds1302.c

   3.3 iic.c

   3.4 onewire.c

   3.5 main.c 主函数文件

   3.6 环境配置

4. 历年蓝桥杯单片机试题和答案


 1、前言

       抽空复习了一下,拿下单片机省赛一等奖,在此分享一下最新的14届省赛程序设计答案

蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 2、题目

 蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

3、程序架构 

 蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 模块化编程,每个模块的程序单独写在一个文中,下面分别给出图中文件的详细代码

   3.1 display.c

          主要包含数码管、led显示。

#include "display.h"
code unsigned char Seg_Table[] =
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, //9
0x88, //A
0x83, //b
0xc6, //C  12
0xa1, //d
0x86, //E
0x8e, //F 15
0xbf,  // - 16
0x89,  // H 17
0x8C,  // P 18
0x88  // R  19
};
//0-9带小数点
code unsigned char Seg_Table_f[] = { 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};
void Delayms(int ms)		//@12.000MHz
{
	unsigned char i, j;
	int k =0;
  for(k=0;k<ms;k++){
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}
//选择开启哪一个锁存器
void SelectHc573(char wei)
{
	switch(wei){
		case 4: P2 = (P2 & 0x1f) | 0x80; break; //LED驱动
		case 5: P2 = (P2 & 0x1f) | 0xa0; break; //蜂鸣器,继电器
		case 6: P2 = (P2 & 0x1f) | 0xc0; break; //数码管位选
		case 7: P2 = (P2 & 0x1f) | 0xe0; break; //数码管段选
	}
	P2 = (P2 & 0x1f) | 0x00;
}
//系统初始化,关蜂鸣器继电器、数码管
void SysInit()
{
  P0 = 0x00;
	SelectHc573(5);
	SelectHc573(6);
	P0 = 0xff;
	SelectHc573(4);
}
//数码管无小数点显示,参数wei:打开哪一个数码管,参数duan:显示什么内容
void DisplaySeg(char wei, char duan)
{
  P0 = 0x01 << wei - 1;
  SelectHc573(6);
	P0 = Seg_Table[duan];
	SelectHc573(7);
	Delayms(1);
	
	P0 = 0x01 << wei - 1;
	SelectHc573(6);
	P0 = 0xff;
	SelectHc573(7);
}
//数码管带小数点显示
void DisplaySeg_f(char wei, char duan)
{
  P0 = 0x01 << wei - 1;
  SelectHc573(6);
	P0 = Seg_Table_f[duan];
	SelectHc573(7);
	Delayms(1);
	
	P0 = 0x01 << wei - 1;
	SelectHc573(6);
	P0 = 0xff;
	SelectHc573(7);
}//LED显示,参数wei:控制哪一个LED,参数on_off:1-点亮,0-关闭
void DisplayLed(char wei,char on_off)
{
	static unsigned char temp = 0xff;
   if(on_off){
	    switch(wei){
				case 1: temp = temp & 0xfe; break;
				case 2: temp = temp & 0xfd; break;
				case 3: temp = temp & 0xfb; break;
				case 4: temp = temp & 0xf7; break;
				case 5: temp = temp & 0xef; break;
				case 6: temp = temp & 0xdf; break;
			}
	 }else{
	    switch(wei){
				case 1: temp = temp | 0x01; break;
				case 2: temp = temp | 0x02; break;
				case 3: temp = temp | 0x04; break;
				case 4: temp = temp | 0x08; break;
				case 5: temp = temp | 0x10; break;
				case 6: temp = temp | 0x20; break;
			}
	 }
  P0 = temp;
	SelectHc573(4);
}

 上面代码中头文件display.h

#ifndef  __DISPLAY_H__
#define  __DISPLAY_H__

#include <stc15.h>
void Delayms(int ms)	;	//@12.000MHz
void SelectHc573(char wei);
void SysInit();
void DisplayLed(char wei,char on_off);
void DisplaySeg(char wei, char duan);
void DisplaySeg_f(char wei, char duan);
#endif

   3.2 ds1302.c

          主要是ds1302写时间函数,和读时间函数

/*	# 	DS1302代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/								
#include "ds1302.h"

//
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK = 0;
		SDA = temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

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

//
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);			
}
//本行之前的代码是官方给出的,本行下面的代码是自己写的
#define  WP   0x8e 
#define  W_HOUR   0x84
#define  W_MIN   0x82
#define  W_SEC   0x80
#define  R_HOUR   0x85
#define  R_MIN   0x83
#define  R_SEC   0x81
//写入一个初始时间到ds1302
void WriteDateTo1302(ds1302 *date)
{
   unsigned char hour,min,sec;
	 hour = date->hour/10*16 + date->hour%10; //十进制转16进制
	 min = date->min/10*16 + date->min%10;
	 sec = date->sec/10*16 + date->sec%10;
   Write_Ds1302_Byte(WP,0x00);
	 Write_Ds1302_Byte(W_HOUR,hour);
	 Write_Ds1302_Byte(W_MIN,min);
	 Write_Ds1302_Byte(W_SEC,sec);
	 Write_Ds1302_Byte(WP,0x80);
}
//读取当前时间
ds1302 ReadTimeFrom1302()
{
   unsigned char hour,min,sec;
	 ds1302 date;
   hour = Read_Ds1302_Byte(R_HOUR);
	 min = Read_Ds1302_Byte(R_MIN);
	 sec = Read_Ds1302_Byte(R_SEC);
	 date.hour = hour/16*10 +  hour%16; //十六进制转十进制
	 date.min = min/16*10 +  min%16;
	 date.sec = sec/16*10 +  sec%16;
	 return date;
}

 头文件ds1302.h,该文件从今年开始官方不提供,都是自己写

#ifndef  __DS1302_H__
#define  __DS1302_H__

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

#define SCK  P17
#define SDA  P23
#define RST  P13
//定义ds1302数据类型
typedef struct{
    unsigned char hour;
	  unsigned char min;
	  unsigned char sec;
}ds1302;
ds1302 ReadTimeFrom1302();
void WriteDateTo1302(ds1302 *date);
#endif

   3.3 iic.c

           用于读取pcf8591通道1的电压

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "iic.h"
#include "intrins.h"
#define DELAY_TIME	5

//
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_Output(char channel)
{
	 unsigned char adc_val;
   I2CStart();
	 I2CSendByte(0x90);
	 I2CWaitAck();
	 I2CSendByte(channel);
	 I2CWaitAck();
	 I2CStart();
	 I2CSendByte(0x91);
	 I2CWaitAck();
	 adc_val = I2CReceiveByte();
	 I2CSendAck(1);
	 I2CStop();
	 return adc_val;
}

 对应的头文件iic.h

#ifndef  __IIC_H__
#define  __IIC_H__

#include <stc15.h>

#define sda  P21
#define scl  P20

unsigned char ADC_Output(char channel);
#endif

   3.4 onewire.c

/*	# 	单总线代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "onewire.h"
//
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;
		Delay_OneWire(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 char rd_temperature()
{
   unsigned char temp,th,tl;
	 init_ds18b20();
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0x44);
	 init_ds18b20();
	//本函数上面部分是启动温度转化,下面部分是温度读取
	// 为防止开机上电读取出现85,可在上电先启动温度转换,延时750模式,再进入循环。	
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0xbe);
	 tl = Read_DS18B20(); //先读低8位,再读高8位
	 th = Read_DS18B20();
	 temp = (th*256 + tl)*0.0625;
	 return temp;
}

 对应的onewire.h

#ifndef  __ONEWIRE_H__
#define  __ONEWIRE_H__

#include <stc15.h>

#define DQ  P14
unsigned char rd_temperature();
#endif

   3.5 main.c 主函数文件

#include "display.h"
#include "onewire.h"
#include "ds1302.h"
#include "iic.h"
#include "string.h"
ds1302 date = {23,59,55}; //初始化时间为23-59-55
unsigned int FREQUENTCY; //NE5555频率
unsigned char count,count2,flag_1s,sec,key_val,flag_100ms;
unsigned char show_switching = 1,collect_flag=1,show,S5_flag=1,L4_flag,L5_flag,L6_flag;
unsigned char adc_val,t_para=30,count_triggle,count3,count_sec;
unsigned char temp=0,humidity,i,last_hour,last_min;
unsigned char t[3],h[3]; //用于保存采集的温度、湿度,只保存3组
/* 参数说明:count,count2用于定时器中断计时,flag_1s 用来表示1S时间到,统计NE555的频率
   sec:       在定时器2中,用来3S计时,sec=3后,自动退出温湿度显示界面
   key_val:   只是用来记录按键,S4按下key_val=4,S5按下key_val=5
   flag_100ms:0.1S标志位,指示灯 L4 以 0.1 秒为间隔切换亮、灭状态。
   show_switching:界面切换,1:时间显示界面,2:回显界面,3:参数显示
   collect_flag = 1:处于亮环境标志
   show : 0:  温湿度显示界面,1:显示show_switching对应的界面
   S5_flag:    回显界面下,切换温度、湿度、时间回显
   L4_flag,L5_flag,L6_flag:分别表示LED4、5、6的点亮标志位
   adc_val:ADC转化后输出值, t_para 温度参数,count_triggle:记录触发数据采集次数
   count3,count_sec :用于S9长按2S的计时
   temp,humidity : 温度、湿度。 i:范围0-1-2,用于作为t[3],h[3]数组的索引
   last_hour,last_min :最近一次采集触发的时间
*/


void Timer0Init(void);		//@12.000MHz;
void Timer1Init(void);		//10毫秒@12.000MHz
void Timer2Init(void);	//20毫秒@12.000MHz
void show_switch();
void key_board();
unsigned char max(unsigned char str[]);

void main()
{  

   SysInit();
	 WriteDateTo1302(&date);
	 Timer0Init();
	 Timer1Init();
	 Timer2Init();
   while(1){ //频率和湿度的转换关系
     if(FREQUENTCY<2000 && FREQUENTCY > 200)
			    humidity = 2/45.0*FREQUENTCY + 1.11;
		 else if(FREQUENTCY == 2000)
			    humidity = 90;
		 else if(FREQUENTCY == 200)
			    humidity = 10;
		 else
			    humidity = 0;   //无效数据
		 
		 adc_val = ADC_Output(0x01); 
		 if( adc_val> 100)   collect_flag = 1;  //亮,adc_val<100代表暗
		 if(collect_flag == 1 && adc_val<=100){ //满足条件触发数据测量
		      collect_flag=0;   AUXR |= 0x10; //启动定时器2
   		 	  show = 1, t[i] = temp;      
			    if(humidity != 0) { h[i] = humidity; L5_flag = 0;}
			    else{              L5_flag = 1; //采集到无效数据,无效数据不保存,触发LED5
					}
					count_triggle++;
					if( i == 0 && count_triggle>=2){ //本次采集大小与上次对比
					   if(temp > t[2] && humidity > h[2])  L6_flag = 1;
						 else      L6_flag = 0;
					}else        L6_flag = 0;
					if(i!= 0 && count_triggle>=2) {//本次采集大小与上次对比
					   if(temp > t[i-1] && humidity > h[i-1])  L6_flag = 1; //温湿度都大于上次,触发LED6
						 else      L6_flag = 0;
					}else        L6_flag = 0;
					
			    i++; 
			    if(i>3) i = 0;
			    last_hour = date.hour, last_min = date.min;
			    if(temp > t_para)          L4_flag = 1; //采集温度大于温度参数,触发LED4
			    else                       L4_flag = 0;
		 } 
		 key_board();   //按键检测函数
		 show_switch(); //所有显示放在此函数内,为了使按键按下,不影响显示内容
	 }
}
void show_switch()
{   
	  unsigned char t_max,h_max;
		int   t_avr,h_avr;
	  date = ReadTimeFrom1302();		 
		temp = rd_temperature();
	  t_max = max(t), h_max = max(h);
	  t_avr = (t[0]+t[1]+t[2])/3.0 * 10; h_avr = (h[0]+h[1]+h[2])/3.0 * 10;
		if(show != 1){
      	if(show_switching == 1){ //时间显示界面
					 DisplaySeg(1,date.hour/10); DisplaySeg(2,date.hour%10); DisplaySeg(3,16);
					 DisplaySeg(4,date.min/10); DisplaySeg(5,date.min%10); DisplaySeg(6,16);
					 DisplaySeg(7,date.sec/10); DisplaySeg(8,date.sec%10);
				}
				if(show_switching == 2){ //回显界面,默认温度回显C
					
					 switch(S5_flag){ // 温度回显C,  湿度回显H,时间回显F
						 case 1:  DisplaySeg(1,12); 
											if(count_triggle != 0){ 
													DisplaySeg(3,t_max/10); DisplaySeg(4,t_max%10); //最大温度
													DisplaySeg(5,16); DisplaySeg(6,t_avr/100); DisplaySeg_f(7,t_avr%100/10); DisplaySeg(8,t_avr%10);
											}
												break;
						 case 2:  DisplaySeg(1,17); 
											if(count_triggle != 0){
													DisplaySeg(3,h_max/10); DisplaySeg(4,h_max%10); //最大湿度
													DisplaySeg(5,16); DisplaySeg(6,h_avr/100); DisplaySeg_f(7,h_avr%100/10); DisplaySeg(8,h_avr%10);
											}
											break;
						 case 3:  DisplaySeg(1,15); DisplaySeg(2,count_triggle/10); DisplaySeg(3,count_triggle%10);//触发次数
											if(count_triggle != 0){
													 DisplaySeg(4,last_hour/10); DisplaySeg(5,last_hour%10); //上一次触发的时间
													 DisplaySeg(6,16);  DisplaySeg(7,last_min/10); DisplaySeg(8,last_min%10);
											}
										 break;
					 }
				}
				if(show_switching == 3){ //参数设置界面
					 DisplaySeg(1,18);
					 DisplaySeg(7,t_para/10); DisplaySeg(8,t_para%10);
				}
		}else{  //温湿度显示界面,每次显示3S后自动推出
		       DisplaySeg(1,14); // E 
					 DisplaySeg(4,temp/10); DisplaySeg(5,temp%10); DisplaySeg(6,16); //温度
					 if(humidity != 0) {
							 DisplaySeg(7,humidity/10); DisplaySeg(8,humidity%10);          //湿度
					 }else{
							 DisplaySeg(7,19); DisplaySeg(8,19); 
					 }
		}
// LED 显示
		switch(show_switching){
			case 1:  DisplayLed(1,1);DisplayLed(2,0);DisplayLed(3,0);  break;
			case 2:  DisplayLed(2,1);DisplayLed(1,0);DisplayLed(3,0);  break;
			case 3:  DisplayLed(3,1);DisplayLed(1,0);DisplayLed(2,0);  break;
		}
		if(L4_flag == 1){
		   if(flag_100ms)   DisplayLed(4,1); //L4亮
			 else             DisplayLed(4,0); //L4灭
		}else{
		   DisplayLed(4,0);
		}
		if(L5_flag == 1){
		   DisplayLed(5,1); //L5亮
		}else{
		    DisplayLed(5,0);//L5灭
		} 
		if(L6_flag == 1){
		   DisplayLed(6,1);  //L6亮
		}else{
		    DisplayLed(6,0); //L6灭
		}
}
void key_board()
{
   unsigned char key;
	 P44 = 0, P42 = 1; P3 |= 0x0f;
	 key = P3; key = key & 0x0c;
	 if(key != 0x0c){
	    Delayms(5);
		  if(key != 0x0c){
	        switch(key){
						case 0x04:  key_val = 4;  show_switching++; //每次进入回显界面默认是温度回显
						            if(show_switching > 3) {  show_switching = 1 ; S5_flag = 1; }
						            break;  
						case 0x08:  key_val = 5; if(show_switching == 2) S5_flag++;
						            if(S5_flag > 3)   S5_flag = 1;           
             						break;
					}
	    }
			while(key != 0x0c){
			    key = P3; key = key & 0x0c;
				  show_switch();
			}
	 }
	 //第二列按键
	  P44 = 1, P42 = 0; P3 |= 0x0f;
	 key = P3; key = key & 0x0c;
	 if(key != 0x0c){
	    Delayms(5);
		  if(key != 0x0c){  // S8++, S9--
	        switch(key){
						case 0x04:  key_val = 8; if(show_switching == 3)  t_para++;
                                     if(t_para > 99)  t_para = 0;
            						break;  
						case 0x08:  key_val = 9; if(show_switching == 3)  t_para--;
                                     if(t_para == 255)  t_para = 99;						                         
            						break;
					}
					if(S5_flag == 3)  { count3 = 0, count_sec = 0;} //时间回显下,S9按下2秒计时开始  
	    }
			while(key != 0x0c){
			    key = P3; key = key & 0x0c;
				  show_switch();
				  if(count_sec >= 2 && S5_flag == 3) { //时间回显界面,长按S9两秒,数据清零
						 memset(t,0,sizeof(t)),  memset(h,0,sizeof(h));
					   count_triggle = 0;
					}
			}
	 }
}
void Timer0Init(void)		//@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x04;
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	ET0 = 1;
	TR0 = 1;		//定时器0开始计时
}
void Timer1Init(void)		//10毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xF0;		//设置定时初值
	TH1 = 0xD8;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1 = 1;
	EA = 1;
}

void Timer1() interrupt 3
{
   count++; count3++;
	 if(count == 100){
	     count = 0;
		   flag_1s = 1;
	 }
	 if(count %10 == 0){
	    flag_100ms = ~flag_100ms;
	 }
	 if(flag_1s == 1){
			flag_1s = 0; TR0 = 0;
			FREQUENTCY = TH0*256 + TL0 ;
			TH0 = 0, TL0 = 0; 
			TR0 = 1;
   }
	 if(count3 == 100) {
	    count3 = 0; 
		  count_sec++;
	 }
}
void Timer2Init(void)		//20毫秒@12.000MHz
{
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xE0;		//设置定时初值
	T2H = 0xB1;		//设置定时初值
//	AUXR |= 0x10;		//定时器2开始计时
	AUXR &= 0xef;
	IE2 |= 0x04;
}
void Timer2() interrupt 12
{
   count2++;
	 if(count2 == 50){
	     count2 = 0;
		   sec++;
		   if(sec == 3){
			    sec = 0; 
				  show = 0;
				  AUXR &= 0xef; //停止定时器2
			 }
	 } 
}
//求数组的最大值,这里数组大小固定为3
unsigned char max(unsigned char str[])
{
   unsigned char Max = str[0] , i;
	 for(i=1;i<3;i++){
	     if( str[i] > Max)
				    Max =  str[i] ;
	 }
	 return Max;
}

    3.6 环境配置

           keil5 创建工程,选择芯片型号STC15F2K60S2,将上述.c文件都添加在Source Group 1下进行编译

蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 编译成功后,0错误,0警告

蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

第14届完整工程代码: 

第14届蓝桥杯省赛程序设计题源码,第14届驱动代码和以往相比发生了一些改变,需要注意,只给除了c文件,头文件需要自己手写资源-CSDN文库

4. 历年蓝桥杯单片机试题和答案

       需要历年程序题客观题试题和答案,可在咸鱼购买,另外需要程序指导也可私信

 闲鱼】https://m.tb.cn/h.UFji1l1?tk=hM4BdnfMkVP CZ0001 「我在闲鱼发布了【蓝桥杯各模块程序驱动代码,历年试题答案,程序无bug。如需程】」
点击链接直接打开

https://m.tb.cn/h.UFji1l1?tk=hM4BdnfMkVP CZ0001

     蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机

 蓝桥杯单片机,蓝桥杯单片机,蓝桥杯,单片机文章来源地址https://www.toymoban.com/news/detail-741625.html

到了这里,关于蓝桥杯单片机第十四届省赛题目和程序答案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【蓝桥杯单片机】第十二届省赛(含题目和解答代码)

    main.c  iic.c iic.h onewire.c onewire.h      

    2024年02月04日
    浏览(72)
  • 蓝桥杯嵌入式第十四届省赛题目解析

    前几天刚刚参加完第十四届的省赛,这届题目比我想象中的要难,其实想一想这也是应该的,以前的知识点都被摸透了,也是需要加入新的知识点了,但是我还是想说能不能别在我参加的时候加大题目难度啊。 不过听说隔壁单片机的省赛都比往年的国赛还难,这就有点离谱了

    2024年02月06日
    浏览(58)
  • 【第十四届蓝桥杯单片机冲刺版】

    明天就是正式比赛啦,今天可以在把各个模块练习一遍,常考的外设相关代码一定要熟练哦。 比赛时拿到资料包了,检查驱动文件,使用到的驱动文件,自己做相应的修改,确保是能够正常使用(驱动修改相关可看之前的文章)。 下面是自己将常考的外设结合一起的练习,

    2023年04月27日
    浏览(52)
  • 蓝桥杯第十四届省赛完整题解 C/C++ B组

    没有测评,不知道对不对,仅仅过样例而已 本题总分:5 分 【问题描述】 小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的 范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9

    2023年04月13日
    浏览(50)
  • 2023年第十四届蓝桥杯单片机开放与设计省赛微析与经验分享

    前言:        2023年4月8日, 就在昨天,本人刚参与了第十四届蓝桥杯单片机开放与设计省赛。         整体做下来,且不谈客观题,今年的程序题,个人感觉有点像大杂烩,题量大,细节多,而且有些要求定义不够清晰,所以本人这次做的不够完美,并且因为时间问题有

    2024年02月08日
    浏览(56)
  • 第十四届蓝桥杯单片机第二场模拟赛程序

    第十四届蓝桥杯单片机第二场模拟赛程序(少量bug) 题目来源于4T评测网 www.4t.wiki 使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作

    2023年04月14日
    浏览(55)
  • 【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

     🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届省

    2023年04月15日
    浏览(103)
  • 第十四届蓝桥杯(电子类)单片机开发——赛题源代码分享

          需要源代码一键三联,私聊我哦

    2024年02月05日
    浏览(62)
  • 蓝桥杯单片机14届记录 + 6-13届省赛代码+试题

    客观题 01. 一个 8 位的 DAC 转换器,供电电压为 3.3V,参考电压 2.4V,其 1LSB 产生的输出电 压增量是( )V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094  02. IAP15F2K61S2 单片机支持通过哪些接口进行在线调试( )。 A. SPI B. UART C. I2C D. JTAG  03. 下列电路中属于时序逻辑电路的是( )。 A. 计数

    2024年02月06日
    浏览(52)
  • 蓝桥杯2023年第十四届省赛-飞机降落

    N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早 可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li个单位时间。 一架飞机降落完毕时,另一架

    2024年02月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包