藍橋杯微控制器第三屆國賽 門禁系統

2021-10-04 18:34:01 字數 3023 閱讀 3885

1.不要把超聲波程式寫在中斷裡面。如果把超聲波程式寫在中斷裡面的話,可能就不會及時的檢測到溢位標誌,在我開始驗證**的時候出現的現象是最後乙個數碼管閃爍,然後把超聲波寫在主函式裡面就解決了問題。

2.程式裡面經常呼叫的**,寫在函式裡面,會大大減少**量和重複**,並且利於檢查以及**美觀。如寫eeprom和讀eeprom可以專門寫在函式裡面,在我們要修改的時候直接呼叫函式傳遞乙個引數進去就行了,也比如我們在輸入密碼的時候,計算密碼這一重複的工作,可以直接寫在函式裡面,這樣我們在檢測到按鍵的時候,就可以直接呼叫函式,不需要每一次都在裡面計算。

超聲波測距:

超聲波測距發射8個脈衝函式以及延時13us函式

void delay13us()		

void sonic_send(void)

}

超聲波函式:

tr0 = 0;

sonic_send();

tr0 = 1;

while(rx == 1 && tf0 == 0 );

tr0 = 0;

if(tf0 == 1)

else

th0 = 0;

tl0 = 0;

ds1302初始化時間以及讀取時間函式:

void ds1302_init(void)

write_ds1302_byte(0x8e,0x80);

}void ds1302_get(void)

write_ds1302_byte(0x8e,0x80);

}

寫eeprom函式和讀eeprom函式

void write_at24c02(unsigned char add,unsigned char dat)

unsigned char read_at24c02(unsigned char add)

完整**:

#include #include #include "iic.h"

#include "ds1302.h"

#define u8 unsigned char

#define u16 unsigned int

u8 code led=;

u8 key_temp,key = 0xff;

u8 digcom = 0, digbuf = ;

sbit rx = p1^1;

sbit tx = p1^0;

u16 distance = 999,t = 0,t_gate = 0,password = 0;

u8 tmeasure = 0,intr = 0,shezhi = 0,error = 0;

bit flag = 0,key_flag = 0,gate_flag = 0;

bit flag1 = 0,flag2 = 0,flag3 = 0,flag4 = 0,zidong = 1;

u8 yi = 10,er = 10,san = 11,si = 11,wu = 11,liu = 11,qi = 11,ba = 11;

u16 delay_time;

extern u8 time;

void delay13us()

void delay_ms(u16 ms)

void init(void)

void relay_on(void)

void off(void) //關掉蜂鳴器和繼電器

void buzz_on(void)

void get_password(u8 temp)

u16 read_password()

void write_password(u16 temp)

void key_kbd(void)

} }else if(key_temp == 0x0f && flag1) }

p3 = 0xbf;p44 = 1;p42 = 0;

key_temp = p3 & 0x0f;

if(key_temp != 0x0f && flag2 == 0 && zidong == 0)

}} else if(key_temp == 0x0f && flag2) }

p3 = 0xdf;p42 = 1;p44 = 1;

key_temp = p3 & 0x0f;

if(key_temp != 0x0f && flag3 == 0 && zidong == 0)

else if(password != temp) //密碼不正確,蜂鳴器報警三秒}}

else if(shezhi == 2)

if(shezhi == 0 || shezhi == 2)//密碼輸入完成,顯示密碼初始介面

else if(shezhi == 1 && zhengque)

else if(shezhi == 1 && zhengque == 0)

password = 0;

intr = 0;

break; //確認按鍵,表示當前輸入完成

}} }

else if(key_temp == 0x0f && flag3) }

p3 = 0xef;p42 = 1;p44 = 1;

key_temp = p3 & 0x0f;

if(key_temp != 0x0f && flag4 == 0 && zidong == 0)

}} else if(key_temp == 0x0f && flag4) }

}void sonic_send(void)

}void timer2init(void) //1毫秒@11.0592mhz

void timer2(void)interrupt 12

if(flag)

else

th0 = 0;

tl0 = 0;

}} else

key_kbd();

}}

第三屆藍橋杯複試

第四題 奇怪的比賽 某電視台舉辦了低碳生活大獎賽。題目的計分規則相當奇怪 每位選手需要回答10個問題 其編號為1到10 越後面越有難度。答對的,當前分數翻倍 答錯了則扣掉與題號相同的分數 選手必須回答問題,不回答按錯誤處理 每位選手都有乙個起步的分數為10分。某獲勝選手最終得分剛好是100分,如果不...

藍橋杯第三屆題目

某電視台舉辦了低碳生活大獎賽。題目的計分規則相當奇怪 每位選手需要回答10個問題 其編號為1到10 越後面越有難度。答對的,當前分數翻倍 答錯了則扣掉與題號相同的分數 選手必須回答問題,不回答按錯誤處理 每位選手都有乙個起步的分數為10分。某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能...

第三屆藍橋杯預賽

3 任何乙個自然數m的立方均可寫成m個連續奇數之和。例如 1 3 1 2 3 3 5 3 3 7 9 11 4 3 13 15 17 19 程式設計實現 輸入一自然數n,求組成n 3的n個連續奇數。4 由鍵盤輸入乙個自然數 1 n 9 要求程式在螢幕上輸出如下圖形。時 時 時 注 應保證 在圖形中只...