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 要求程式在螢幕上輸出如下圖形。時 時 時 注 應保證 在圖形中只...