国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

藍橋杯單片機第十四屆省賽題目和程序答案

這篇具有很好參考價值的文章主要介紹了藍橋杯單片機第十四屆省賽題目和程序答案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

?1、前言

?2、題目

3、程序架構(gòu)?

? ?3.1 display.c

? ?3.2 ds1302.c

? ?3.3 iic.c

? ?3.4 onewire.c

? ?3.5 main.c 主函數(shù)文件

? ?3.6 環(huán)境配置

4. 歷年藍橋杯單片機試題和答案


?1、前言

? ? ? ?抽空復(fù)習了一下,拿下單片機省賽一等獎,在此分享一下最新的14屆省賽程序設(shè)計答案

藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?2、題目

?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

3、程序架構(gòu)?

?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?模塊化編程,每個模塊的程序單獨寫在一個文中,下面分別給出圖中文件的詳細代碼

? ?3.1 display.c

? ? ? ? ? 主要包含數(shù)碼管、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帶小數(shù)點
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驅(qū)動
		case 5: P2 = (P2 & 0x1f) | 0xa0; break; //蜂鳴器,繼電器
		case 6: P2 = (P2 & 0x1f) | 0xc0; break; //數(shù)碼管位選
		case 7: P2 = (P2 & 0x1f) | 0xe0; break; //數(shù)碼管段選
	}
	P2 = (P2 & 0x1f) | 0x00;
}
//系統(tǒng)初始化,關(guān)蜂鳴器繼電器、數(shù)碼管
void SysInit()
{
  P0 = 0x00;
	SelectHc573(5);
	SelectHc573(6);
	P0 = 0xff;
	SelectHc573(4);
}
//數(shù)碼管無小數(shù)點顯示,參數(shù)wei:打開哪一個數(shù)碼管,參數(shù)duan:顯示什么內(nèi)容
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);
}
//數(shù)碼管帶小數(shù)點顯示
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顯示,參數(shù)wei:控制哪一個LED,參數(shù)on_off:1-點亮,0-關(guān)閉
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寫時間函數(shù),和讀時間函數(shù)

/*	# 	DS1302代碼片段說明
	1. 	本文件夾中提供的驅(qū)動代碼供參賽選手完成程序設(shè)計參考。
	2. 	參賽選手可以自行編寫相關(guān)代碼或以該代碼為基礎(chǔ),根據(jù)所選單片機類型、運行速度和試題
		中對單片機時鐘頻率的要求,進行代碼調(diào)試和修改。
*/								
#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; //十進制轉(zhuǎn)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; //十六進制轉(zhuǎn)十進制
	 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數(shù)據(jù)類型
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. 	本文件夾中提供的驅(qū)動代碼供參賽選手完成程序設(shè)計參考。
	2. 	參賽選手可以自行編寫相關(guān)代碼或以該代碼為基礎(chǔ),根據(jù)所選單片機類型、運行速度和試題
		中對單片機時鐘頻率的要求,進行代碼調(diào)試和修改。
*/
#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;
}

?對應(yīng)的頭文件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. 	本文件夾中提供的驅(qū)動代碼供參賽選手完成程序設(shè)計參考。
	2. 	參賽選手可以自行編寫相關(guān)代碼或以該代碼為基礎(chǔ),根據(jù)所選單片機類型、運行速度和試題
		中對單片機時鐘頻率的要求,進行代碼調(diào)試和修改。
*/
#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);//本行代碼可刪去,原來沒有的,只是為了適應(yīng)本人的板子添加
		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();
	//本函數(shù)上面部分是啟動溫度轉(zhuǎn)化,下面部分是溫度讀取
	// 為防止開機上電讀取出現(xiàn)85,可在上電先啟動溫度轉(zhuǎn)換,延時750模式,再進入循環(huán)。	
	 Write_DS18B20(0xcc);
	 Write_DS18B20(0xbe);
	 tl = Read_DS18B20(); //先讀低8位,再讀高8位
	 th = Read_DS18B20();
	 temp = (th*256 + tl)*0.0625;
	 return temp;
}

?對應(yīng)的onewire.h

#ifndef  __ONEWIRE_H__
#define  __ONEWIRE_H__

#include <stc15.h>

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

? ?3.5 main.c 主函數(shù)文件

#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組
/* 參數(shù)說明:count,count2用于定時器中斷計時,flag_1s 用來表示1S時間到,統(tǒng)計NE555的頻率
   sec:       在定時器2中,用來3S計時,sec=3后,自動退出溫濕度顯示界面
   key_val:   只是用來記錄按鍵,S4按下key_val=4,S5按下key_val=5
   flag_100ms:0.1S標志位,指示燈 L4 以 0.1 秒為間隔切換亮、滅狀態(tài)。
   show_switching:界面切換,1:時間顯示界面,2:回顯界面,3:參數(shù)顯示
   collect_flag = 1:處于亮環(huán)境標志
   show : 0:  溫濕度顯示界面,1:顯示show_switching對應(yīng)的界面
   S5_flag:    回顯界面下,切換溫度、濕度、時間回顯
   L4_flag,L5_flag,L6_flag:分別表示LED4、5、6的點亮標志位
   adc_val:ADC轉(zhuǎn)化后輸出值, t_para 溫度參數(shù),count_triggle:記錄觸發(fā)數(shù)據(jù)采集次數(shù)
   count3,count_sec :用于S9長按2S的計時
   temp,humidity : 溫度、濕度。 i:范圍0-1-2,用于作為t[3],h[3]數(shù)組的索引
   last_hour,last_min :最近一次采集觸發(fā)的時間
*/


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){ //頻率和濕度的轉(zhuǎn)換關(guān)系
     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;   //無效數(shù)據(jù)
		 
		 adc_val = ADC_Output(0x01); 
		 if( adc_val> 100)   collect_flag = 1;  //亮,adc_val<100代表暗
		 if(collect_flag == 1 && adc_val<=100){ //滿足條件觸發(fā)數(shù)據(jù)測量
		      collect_flag=0;   AUXR |= 0x10; //啟動定時器2
   		 	  show = 1, t[i] = temp;      
			    if(humidity != 0) { h[i] = humidity; L5_flag = 0;}
			    else{              L5_flag = 1; //采集到無效數(shù)據(jù),無效數(shù)據(jù)不保存,觸發(fā)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; //溫濕度都大于上次,觸發(fā)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; //采集溫度大于溫度參數(shù),觸發(fā)LED4
			    else                       L4_flag = 0;
		 } 
		 key_board();   //按鍵檢測函數(shù)
		 show_switch(); //所有顯示放在此函數(shù)內(nèi),為了使按鍵按下,不影響顯示內(nèi)容
	 }
}
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);//觸發(fā)次數(shù)
											if(count_triggle != 0){
													 DisplaySeg(4,last_hour/10); DisplaySeg(5,last_hour%10); //上一次觸發(fā)的時間
													 DisplaySeg(6,16);  DisplaySeg(7,last_min/10); DisplaySeg(8,last_min%10);
											}
										 break;
					 }
				}
				if(show_switching == 3){ //參數(shù)設(shè)置界面
					 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兩秒,數(shù)據(jù)清零
						 memset(t,0,sizeof(t)),  memset(h,0,sizeof(h));
					   count_triggle = 0;
					}
			}
	 }
}
void Timer0Init(void)		//@12.000MHz
{
	AUXR &= 0x7F;		//定時器時鐘12T模式
	TMOD &= 0xF0;		//設(shè)置定時器模式
	TMOD |= 0x04;
	TL0 = 0;		//設(shè)置定時初值
	TH0 = 0;		//設(shè)置定時初值
	TF0 = 0;		//清除TF0標志
	ET0 = 1;
	TR0 = 1;		//定時器0開始計時
}
void Timer1Init(void)		//10毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定時器時鐘12T模式
	TMOD &= 0x0F;		//設(shè)置定時器模式
	TL1 = 0xF0;		//設(shè)置定時初值
	TH1 = 0xD8;		//設(shè)置定時初值
	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;		//設(shè)置定時初值
	T2H = 0xB1;		//設(shè)置定時初值
//	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
			 }
	 } 
}
//求數(shù)組的最大值,這里數(shù)組大小固定為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 環(huán)境配置

? ? ? ? ? ?keil5 創(chuàng)建工程,選擇芯片型號STC15F2K60S2,將上述.c文件都添加在Source Group 1下進行編譯

藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?編譯成功后,0錯誤,0警告

藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

第14屆完整工程代碼:?

第14屆藍橋杯省賽程序設(shè)計題源碼,第14屆驅(qū)動代碼和以往相比發(fā)生了一些改變,需要注意,只給除了c文件,頭文件需要自己手寫資源-CSDN文庫

4. 歷年藍橋杯單片機試題和答案

? ? ? ?需要歷年程序題客觀題試題和答案,可在咸魚購買,另外需要程序指導(dǎo)也可私信

?閑魚】https://m.tb.cn/h.UFji1l1?tk=hM4BdnfMkVP CZ0001 「我在閑魚發(fā)布了【藍橋杯各模塊程序驅(qū)動代碼,歷年試題答案,程序無bug。如需程】」
點擊鏈接直接打開

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

? ? ?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機

?藍橋杯單片機,藍橋杯單片機,藍橋杯,單片機文章來源地址http://www.zghlxwxcb.cn/news/detail-741625.html

到了這里,關(guān)于藍橋杯單片機第十四屆省賽題目和程序答案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【藍橋杯單片機】第十二屆省賽(含題目和解答代碼)

    【藍橋杯單片機】第十二屆省賽(含題目和解答代碼)

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

    2024年02月04日
    瀏覽(163)
  • 藍橋杯嵌入式第十四屆省賽題目解析

    藍橋杯嵌入式第十四屆省賽題目解析

    前幾天剛剛參加完第十四屆的省賽,這屆題目比我想象中的要難,其實想一想這也是應(yīng)該的,以前的知識點都被摸透了,也是需要加入新的知識點了,但是我還是想說能不能別在我參加的時候加大題目難度啊。 不過聽說隔壁單片機的省賽都比往年的國賽還難,這就有點離譜了

    2024年02月06日
    瀏覽(102)
  • 【第十四屆藍橋杯單片機沖刺版】

    【第十四屆藍橋杯單片機沖刺版】

    明天就是正式比賽啦,今天可以在把各個模塊練習一遍,??嫉耐庠O(shè)相關(guān)代碼一定要熟練哦。 比賽時拿到資料包了,檢查驅(qū)動文件,使用到的驅(qū)動文件,自己做相應(yīng)的修改,確保是能夠正常使用(驅(qū)動修改相關(guān)可看之前的文章)。 下面是自己將??嫉耐庠O(shè)結(jié)合一起的練習,

    2023年04月27日
    瀏覽(90)
  • 藍橋杯第十四屆省賽完整題解 C/C++ B組

    藍橋杯第十四屆省賽完整題解 C/C++ B組

    沒有測評,不知道對不對,僅僅過樣例而已 本題總分:5 分 【問題描述】 小藍現(xiàn)在有一個長度為 100 的數(shù)組,數(shù)組中的每個元素的值都在 0 到 9 的 范圍之內(nèi)。數(shù)組中的元素從左至右如下所示: 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日
    瀏覽(95)
  • 2023年第十四屆藍橋杯單片機開放與設(shè)計省賽微析與經(jīng)驗分享

    2023年第十四屆藍橋杯單片機開放與設(shè)計省賽微析與經(jīng)驗分享

    前言: ? ? ? ?2023年4月8日, 就在昨天,本人剛參與了第十四屆藍橋杯單片機開放與設(shè)計省賽。 ????????整體做下來,且不談客觀題,今年的程序題,個人感覺有點像大雜燴,題量大,細節(jié)多,而且有些要求定義不夠清晰,所以本人這次做的不夠完美,并且因為時間問題有

    2024年02月08日
    瀏覽(99)
  • 第十四屆藍橋杯單片機第二場模擬賽程序

    第十四屆藍橋杯單片機第二場模擬賽程序

    第十四屆藍橋杯單片機第二場模擬賽程序(少量bug) 題目來源于4T評測網(wǎng) www.4t.wiki 使用大賽組委會提供的國信長天單片機競賽實訓平臺,完成本試題的程序設(shè)計與調(diào)試。程序編寫、調(diào)試完成后,選手需通過考試系統(tǒng)提交以準考證號命名的hex文件。不符合以上文件提交要求的作

    2023年04月14日
    瀏覽(100)
  • 【藍橋杯嵌入式】藍橋杯嵌入式第十四屆省賽程序真題,真題分析與代碼講解

    【藍橋杯嵌入式】藍橋杯嵌入式第十四屆省賽程序真題,真題分析與代碼講解

    ???【藍橋杯嵌入式】專題正在持續(xù)更新中,原理圖解析?,各模塊分析?以及歷年真題講解?都已更新完畢,歡迎大家前往訂閱本專題?? ??【藍橋杯嵌入式】藍橋杯第十屆省賽真題 ??【藍橋杯嵌入式】藍橋杯第十二屆省賽程序真題 ??【藍橋杯嵌入式】藍橋杯第十三屆省

    2023年04月15日
    瀏覽(190)
  • 第十四屆藍橋杯(電子類)單片機開發(fā)——賽題源代碼分享

    第十四屆藍橋杯(電子類)單片機開發(fā)——賽題源代碼分享

    ? ? ? 需要源代碼一鍵三聯(lián),私聊我哦

    2024年02月05日
    瀏覽(92)
  • 藍橋杯單片機14屆記錄 + 6-13屆省賽代碼+試題

    藍橋杯單片機14屆記錄 + 6-13屆省賽代碼+試題

    客觀題 01. 一個 8 位的 DAC 轉(zhuǎn)換器,供電電壓為 3.3V,參考電壓 2.4V,其 1LSB 產(chǎn)生的輸出電 壓增量是( )V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 ?02. IAP15F2K61S2 單片機支持通過哪些接口進行在線調(diào)試( )。 A. SPI B. UART C. I2C D. JTAG ?03. 下列電路中屬于時序邏輯電路的是( )。 A. 計數(shù)

    2024年02月06日
    瀏覽(102)
  • 藍橋杯2023年第十四屆省賽-飛機降落

    N 架飛機準備降落到某個只有一條跑道的機場。其中第 i 架飛機在 Ti?時刻到達機場上空,到達時它的剩余油料還可以繼續(xù)盤旋 Di?個單位時間,即它最早 可以于 Ti?時刻開始降落,最晚可以于 Ti?+ Di?時刻開始降落。降落過程需要 Li個單位時間。 一架飛機降落完畢時,另一架

    2024年02月15日
    瀏覽(101)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包