|
本帖最后由 Amistad 于 2019-5-12 23:25 編輯
這次分享得是第八屆的題目源碼,我總結(jié)的一下第三屆到底九屆決賽考試考的器件,如下圖所示
1.JPG (79.1 KB, 下載次數(shù): 48)
下載附件
2019-5-12 23:14 上傳
,大家可以看到板子上的lcd12864,1602,紅外,在這幾屆里面一次沒考,但是不代表以后不會(huì)考,參加比賽的同學(xué)還是要看一下這三個(gè)器件,下面給出本次題目,與主文件程序代碼:
第8屆:超聲波測(cè)距機(jī)試題題目_Page1.jpg (42.15 KB, 下載次數(shù): 40)
下載附件
2019-5-12 23:14 上傳
第8屆:超聲波測(cè)距機(jī)試題題目_Page2.jpg (54.28 KB, 下載次數(shù): 53)
下載附件
2019-5-12 23:14 上傳
第8屆:超聲波測(cè)距機(jī)試題題目_Page3.jpg (33.75 KB, 下載次數(shù): 49)
下載附件
2019-5-12 23:14 上傳
單片機(jī)源程序如下:
- #include "main.h"
- #include "Display.H"
- #include "stdio.H"
- #include "KEY.h"
- #include "TIME.h"
- #include "DELAY.h"
- #include "i2c.h"
- #include "CONFIG.H"
- #include "intrins.h"
- //發(fā)送40KHz脈沖延時(shí)函數(shù)
- #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();\
- _nop_();_nop_();_nop_();_nop_(); _nop_();}
- union flo_to_ch
- {
- u16 f_num;
- u8 u_num[2];//共用內(nèi)存單元,u_num[2]分別為f32數(shù)據(jù)u16的2個(gè)字節(jié)
- };
- union flo_to_ch diyi_juli_h,dier_juli_h,disan_juli_h,disi_juli_h;//四次距離定義
- u16 juli=0,juli_s=0;//這次距離和上次距離
- u8 Dis_Buf[10] = {" "}; //數(shù)碼管顯示緩存
- u8 Dis_Mode = 'C'; //數(shù)碼管顯示模式,‘C‘距離顯示,’H’回顯,‘F’盲區(qū)顯示
- u8 hx_num = 0;//當(dāng)前回顯得是第幾個(gè)
- u16 mq_num = 0;//盲區(qū)數(shù)值
- bit job1_flag = 0;//是否調(diào)用job1函數(shù)標(biāo)志,在T1中斷里面置1
- bit job2_flag = 0;//是否調(diào)用job2函數(shù)標(biāo)志,在T1中斷里面置1
- bit job3_flag = 0;//是否調(diào)用job3函數(shù)標(biāo)志,在T1中斷里面置1
- bit job4_flag = 0;//是否調(diào)用job4函數(shù)標(biāo)志,在T1中斷里面置1
- bit job5_flag = 0;//是否調(diào)用job5函數(shù)標(biāo)志,在T1中斷里面置1
- bit ssbz = 0;//閃爍標(biāo)志
- sbit TX = P1^0; //發(fā)射引腳
- sbit RX = P1^1; //接收引腳
- void job1(void); //數(shù)碼管動(dòng)態(tài)顯示處理,每5ms一次
- void job2(void); //顯示模式處理,每100ms一次
- void job3(void); //按鍵讀取與處理,每50ms一次
- void job4(void); //亮燈處理
- void job5(void); //電壓輸出
- void juli_set(void);//距離存儲(chǔ)
- void juli_read(void);//距離讀取
- void mq_read(void);//盲區(qū)讀取
- void mq_set(void);//盲區(qū)存儲(chǔ)
- void jlcl();//距離測(cè)量
- void send_wave(void);//發(fā)送超聲波
- void dac_shuchu();//電壓輸出函數(shù)
- void Sys_Init()//系統(tǒng)初始化
- {
- Buzzy_Off;
- Relay_Off;
- Led_Set = 0xff;
- }
- void main()
- {
- Sys_Init();//系統(tǒng)初始化
- Timer0Init();//T0初始化,T0用來測(cè)量距離
- Timer1Init();//T1初始化,T1中斷用來產(chǎn)生調(diào)用函數(shù)標(biāo)志
- // diyi_juli_h.f_num=dier_juli_h.f_num=disan_juli_h.f_num=disi_juli_h.f_num=0;//調(diào)試用
- // juli_set();//調(diào)試用
- juli_read();//讀取eeprom數(shù)據(jù)
- mq_read();//閾值讀取
- juli = disi_juli_h.f_num;//設(shè)置這次距離為第4次測(cè)量的距離
- juli_s = disan_juli_h.f_num;//設(shè)置上次距離為第3次測(cè)量的距離
- init_pcf8591();//初始化
- while (1)//循環(huán)判斷
- {
- if (job1_flag)//判斷時(shí)候?yàn)?,等于則調(diào)用函數(shù),并將調(diào)用函數(shù)標(biāo)志清0(下同)
- {
- job1(); //數(shù)碼管動(dòng)態(tài)顯示處理,每5ms一次
- job1_flag = 0;//清0
- }
- if (job2_flag)
- {
- job2(); //顯示模式處理,每100ms一次
- job2_flag = 0;
- }
- if (job3_flag)
- {
- job3(); //按鍵讀取與處理,每50ms一次
- job3_flag = 0;
- }
- if (job4_flag)
- {
- job4();//LED處理函數(shù)
- job4_flag = 0;
- }
- if (job5_flag)
- {
- job5();//電壓輸出處理
- job5_flag = 0;
- }
- }
- }
- void job1(void) //數(shù)碼管動(dòng)態(tài)顯示處理,每5ms一次
- {
- Display(Dis_Buf);
- }
- void job2(void) //顯示模式處理,每100ms一次,Work_Mode=’U’回顯,其他常規(guī)顯示
- {
- switch (Dis_Mode) //判斷當(dāng)前顯示模式
- {
- case 'C': sprintf(Dis_Buf, "C %03d%03d",juli,juli_s);break;
- case 'F' : sprintf(Dis_Buf, "F %02d",mq_num);break;
- case 'H':
- {
- switch (hx_num)
- {
- case 0:
- {
- sprintf(Dis_Buf, "1 %03d",diyi_juli_h.f_num);
- }break;
- case 1:
- {
- sprintf(Dis_Buf, "2 %03d",dier_juli_h.f_num);
- }break;
- case 2:
- {
- sprintf(Dis_Buf, "3 %03d",disan_juli_h.f_num);
- }break;
- case 3:
- {
- sprintf(Dis_Buf, "4 %03d",disi_juli_h.f_num);
- }break;
- }
- }break;
- }
- }
- void job3(void) //按鍵讀取與處理,每50ms一次
- {
- u8 Key_Num = read_keyboard();
- switch (Key_Num)
- {
- case '1'://測(cè)量距離,循環(huán)覆蓋,距離儲(chǔ)存
- {
- juli_s = juli;
- jlcl();
- diyi_juli_h.f_num = dier_juli_h.f_num;
- dier_juli_h.f_num = disan_juli_h.f_num;
- disan_juli_h.f_num = juli_s;
- disi_juli_h.f_num = juli;
- juli_set();
- ssbz = 1;
- }break;
- case 'C':
- {
- Dis_Mode = 'C';
- }break;
- case 'H': //S5 存儲(chǔ) (溫度/電壓/頻率 存儲(chǔ)到E2PROM)
- {
- Dis_Mode = 'H';
- juli_read();
- }break;
- case 'F':
- {
- Dis_Mode = 'F';
- }break;
- }
- }
- void job4(void) //LED亮燈處理,每200ms一次
- {
- static u8 time_num = 0;//時(shí)間標(biāo)志
- static u8 cs_num = 0;//亮滅次數(shù)
- static u8 Led_Set_Temp = 0xff;//LED要顯示的值
- if(ssbz)//閃爍標(biāo)志判斷
- {
- if(cs_num == 0)Led_Set_Temp = 0XFE; //亮滅次數(shù)判斷,如果第一次進(jìn)來,就賦值。
- time_num++;//時(shí)間,如果等于5說明1S到了,要對(duì)亮的燈進(jìn)行取反
- if(time_num == 5)
- {
- time_num = 0;
- if(Led_Set_Temp == 0XFE)Led_Set_Temp = 0XFF;
- else if(Led_Set_Temp == 0XFF)Led_Set_Temp = 0XFE;
- else if(Led_Set_Temp == 0XBF)Led_Set_Temp = 0XBE;
- else if(Led_Set_Temp == 0XBE)Led_Set_Temp = 0XBF;
- else if(Led_Set_Temp == 0X7F)Led_Set_Temp = 0X7E;
- else if(Led_Set_Temp == 0X7E)Led_Set_Temp = 0X7F;
- cs_num++;//亮滅次數(shù)+1
- if(cs_num == 5)//如果等于5,說明已經(jīng)亮滅循環(huán)3次,要將閃爍標(biāo)志清零,亮滅次數(shù)清零
- {
- cs_num = 0;
- ssbz = 0;
- }
- }
- if(Dis_Mode == 'F')Led_Set_Temp &= 0XBF;
- else if(Dis_Mode == 'H')Led_Set_Temp &= 0X7F;
- }
- else if(Dis_Mode == 'F')Led_Set_Temp = 0XBF;
- else if(Dis_Mode == 'H')Led_Set_Temp = 0X7F;
- else Led_Set_Temp = 0xFF;
- Led_Set=Led_Set_Temp;
- }
- void job5(void) //電壓輸出處理
- {
- unsigned char dy = 0X00;
- if(juli <= mq_num)
- {
- dac_pcf8591(0X00);
- }
- else if(juli>mq_num)
- {
- if((juli-mq_num)>=250)
- dy=255;
- else
- dy = (unsigned char)(((juli-mq_num)*0.02)/5.0*255.0);
- }
- dac_pcf8591(dy);
- }
- void juli_set(void)//歷史測(cè)量的距離儲(chǔ)存
- {
- write_eeprom(0,diyi_juli_h.u_num[0]);i2c_delay(200);i2c_delay(200);
- write_eeprom(1,diyi_juli_h.u_num[1]);i2c_delay(200);i2c_delay(200);
- write_eeprom(2,dier_juli_h.u_num[0]);i2c_delay(200);i2c_delay(200);
- write_eeprom(3,dier_juli_h.u_num[1]);i2c_delay(200);i2c_delay(200);
- write_eeprom(4,disan_juli_h.u_num[0]);i2c_delay(200);i2c_delay(200);
- write_eeprom(5,disan_juli_h.u_num[1]);i2c_delay(200);i2c_delay(200);
- write_eeprom(6,disi_juli_h.u_num[0]);i2c_delay(200);i2c_delay(200);
- write_eeprom(7,disi_juli_h.u_num[1]);i2c_delay(200);i2c_delay(200);
- }
- void juli_read(void)//歷史測(cè)量距離讀取
- {
- diyi_juli_h.u_num[0]=read_eeprom(0);i2c_delay(200);i2c_delay(200);
- diyi_juli_h.u_num[1]=read_eeprom(1);i2c_delay(200);i2c_delay(200);
-
- dier_juli_h.u_num[0]=read_eeprom(2);i2c_delay(200);i2c_delay(200);
- dier_juli_h.u_num[1]=read_eeprom(3);i2c_delay(200);i2c_delay(200);
-
- disan_juli_h.u_num[0]=read_eeprom(4);i2c_delay(200);i2c_delay(200);
- disan_juli_h.u_num[1]=read_eeprom(5);i2c_delay(200);i2c_delay(200);
- disi_juli_h.u_num[0]=read_eeprom(6);i2c_delay(200);i2c_delay(200);
- disi_juli_h.u_num[1]=read_eeprom(7);i2c_delay(200);i2c_delay(200);
- }
- void mq_read()//盲區(qū)距離讀取
- {
- mq_num = read_eeprom(8);i2c_delay(200);i2c_delay(200);
- }
- void mq_set()//盲區(qū)距離存儲(chǔ)
- {
- write_eeprom(8,mq_num);i2c_delay(200);i2c_delay(200);
- }
- void jlcl()//距離測(cè)量函數(shù)
- {
- unsigned int t = 0;
- TR1 = 0;//停止T1計(jì)時(shí),防止中斷函數(shù),干擾測(cè)距
- send_wave(); //發(fā)送方波信號(hào)
- TR0 = 1; //啟動(dòng)計(jì)時(shí)
- while((RX == 1) && (TF0 == 0));//等待收到脈沖
- TR0 = 0; //關(guān)閉計(jì)時(shí)
- //發(fā)生溢出
- if(TF0 == 1)
- {
- TF0 = 0;
- }
- else
- {
- /** 計(jì)算時(shí)間 */
- t = TH0;
- t <<= 8;
- t |= TL0;
- juli = (unsigned int)(t*0.017); //計(jì)算距離
- }
- TH0 = 0;
- TL0 = 0;
- //juli += 10;
- TR1 = 1;//啟動(dòng)T1計(jì)時(shí)
- }
- void send_wave(void)//發(fā)送脈沖函數(shù)
- {
- unsigned char i = 8; //發(fā)送8個(gè)脈沖
- do
- {
- TX = 1;
- somenop;somenop;somenop;somenop;somenop;somenop;
- somenop;somenop;somenop;somenop;
- TX = 0;
- somenop;somenop;somenop;somenop;somenop;somenop;
- somenop;somenop;somenop;somenop;
- }
- while(i--);
- }
復(fù)制代碼 我就不把全部的程序貼上了,大家請(qǐng)到附件里面下載,還有就是,參加藍(lán)橋杯比賽的同學(xué)可以關(guān)注我,我會(huì)在藍(lán)橋杯國(guó)賽之前把所有的國(guó)賽題目和程序發(fā)上來(不參加的也可以關(guān)注哦 )
第8屆:超聲波測(cè)距機(jī).rar
(963.25 KB, 下載次數(shù): 80)
2019-5-12 23:21 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|