目錄
?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
?文章來源地址http://www.zghlxwxcb.cn/news/detail-741625.html
到了這里,關(guān)于藍橋杯單片機第十四屆省賽題目和程序答案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!