蓝桥杯单片机555定时器频率测量 非常简单的教程 能直接运行
首先推薦B站小蜜蜂老師的視頻課程,講的蠻好,看完定時(shí)器前兩章再看555定時(shí)器模塊瞬間就悟了。
以上大概花費(fèi)一個(gè)來小時(shí),時(shí)間不夠或者是暫時(shí)比較急的話也可以將就看我下邊簡易版的內(nèi)容.
原理簡介
原理其實(shí)非常簡單, 不過是把一個(gè)定時(shí)器配置成輸入捕獲模式, 這個(gè)模式每捕獲一個(gè)方波(通俗的說就是555定時(shí)器生成的方波通過線連到定時(shí)器上,定時(shí)器每收到一個(gè)上升沿或者下降沿之一,這個(gè)是看具體怎么配置的了)就會(huì)觸發(fā)一次中斷, 我們用一個(gè)變量(這里暫且叫它c(diǎn)ount)記錄中斷進(jìn)去的次數(shù),在中斷進(jìn)入的時(shí)候計(jì)數(shù)值加1,即可知道收到了多少方波.
如果再使用一個(gè)定時(shí)器每一秒中斷一次,那么在中斷出來的時(shí)候看一下count的值,然后把它清零,下次再引入這里的時(shí)候,就知道1s內(nèi)來了多少方波,進(jìn)而知道了頻率.
再把它顯示在數(shù)碼管上,即可以看的到頻率了.
問題拆分
根據(jù)上述原理,問題大概分成下邊這么幾個(gè).
1. 配置一個(gè)連接到NE555模塊的定時(shí)器使其為輸入捕獲模式.
2. 配置另一個(gè)定時(shí)器,使其能穩(wěn)定在一段時(shí)間內(nèi)產(chǎn)生中斷(如果是2毫秒中斷一次, 500次中斷的時(shí)間約為1秒).
3.?使用數(shù)碼管將結(jié)果展示.(想必大家學(xué)到NE555這里了也會(huì)用數(shù)碼管了,這里就不贅述數(shù)碼管的內(nèi)容了)
問題解決
問題1解決:在下邊代碼的Timer0Init注釋中有簡單的解釋.
問題2解決: 在Timer0Init中有簡單的解釋
問題3解決: 在開始到set_tube函數(shù)前有簡單的解釋
#include <stc15f2k60s2.h> #define u8 unsigned char #define u16 unsigned int //作為一只菜鳥,顯然我是記不住那么多值的,所以把如何開關(guān)寫成了宏定義,這樣一般就不會(huì)忘了 #define led_ P2=(P2&0x1f)|0x80 //100|0 0000 #define select_duan_ P2=(P2&0x1f)|0xe0 //1110 #define select_wei_ P2=(P2&0x1f)|0xc0 //1100 #define y5_ P2=(P2&0x1f)|0xa0 #define close_ P2=(P2&0x1f) #define mie_ 10 //以下是共陽極數(shù)碼管0-9,滅對(duì)應(yīng)的值 u8 code list[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; /*0 1 2 3 4 5 6 7 8 9 (mie_) */ //默認(rèn)都是熄滅 u8 tube[]={mie_,mie_,mie_,mie_,mie_,mie_,mie_,mie_};u16 ne555,cnt,f=0;//這些是用得到的變量 f是頻率,ne555后邊會(huì)說到,cnt祖?zhèn)鞯挠?jì)數(shù)用的值 //跟著學(xué)長學(xué)的祖?zhèn)鞯臄?shù)碼管動(dòng)態(tài)刷新的代碼, void digital_tube_display(){static u8 i=0;select_duan_;P0=0xff;close_;//消影select_duan_;P0=list[tube[i]];close_;//段選select_wei_;P0=1<<i;close_;//位選if(++i==8) i=0; } //這個(gè)函數(shù)用來改變每一個(gè)的值,因?yàn)槲沂遣锁B,所以我不會(huì)太花里胡哨的, //每次改哪個(gè)數(shù)值就set_tube(第幾個(gè)數(shù)碼管,要顯示的值),set_tube(第幾個(gè)數(shù)碼管,要顯示的值)... //這樣簡單也不怎么出錯(cuò),非常舒服 void set_tube(u8 idx,u8 num){tube[idx]=num; }//4+8=12 a b c d //這個(gè)定時(shí)器初始化是從軟件里復(fù)制的,要改的地方就兩個(gè),空格空出來了 void Timer0Init(void) //100微秒@12.000MHz {AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式TMOD &= 0xF0; //設(shè)置定時(shí)器模式TMOD |=0x04; //可以是0x04 ,0x06 /*這個(gè)是讓他變成自動(dòng)重裝載的計(jì)數(shù)的模式,作為一名菜鳥,我肯定不知道自動(dòng)重裝載是啥,查了下 下邊有個(gè)TL0,TH0,他倆意思是time low 定時(shí)器0 time high 定時(shí)器0 很樸實(shí), 就是定時(shí)器0的低八位,高八位,計(jì)數(shù)器模式下,來一個(gè)脈沖,低八位就加1,低八位加滿了高八位加, 都加滿了就溢出,進(jìn)入中斷服務(wù)函數(shù), 在很原始的時(shí)候,人類很難馴服野生的51單片機(jī),這倆低八位高八位的加滿了就不知道咋辦了, 你看,這一次加滿了,得讓他回到初始值,才能一直只加這個(gè)數(shù),不然就是亂加了,就不好用了 然后吧,原始的時(shí)候野生的單片機(jī)不會(huì)自己把那倆恢復(fù)到初始值,需要人類在他中斷進(jìn)入中斷服務(wù)函數(shù)的時(shí)候 手動(dòng)把那個(gè)恢復(fù)初始值,這個(gè)就是自動(dòng)重裝載,字面意思。 */ //111111111 111111111 //000000000 000000000TL0 = 0xff; //設(shè)置定時(shí)初始值 TH0 = 0xff; //設(shè)置定時(shí)初始值 然后也可以這倆初值是0,直接算出高八位加第八位的值好像也許 /*設(shè)置成這樣給他兩個(gè)滿的,來一次脈沖他就溢出了,只要在中斷服務(wù)函數(shù)里邊讓他進(jìn)一次就加1,等1秒鐘就知道他加了多少了*/TF0 = 0; //清除TF0標(biāo)志TR0 = 1; //定時(shí)器0開始計(jì)時(shí) }void Timer1Init(void) //1毫秒@12.000MHz {AUXR |= 0x40; //定時(shí)器時(shí)鐘1T模式TMOD &= 0x0F; //設(shè)置定時(shí)器模式TL1 = 0x20; //設(shè)置定時(shí)初始值TH1 = 0xD1; //設(shè)置定時(shí)初始值TF1 = 0; //清除TF1標(biāo)志TR1 = 1; //定時(shí)器1開始計(jì)時(shí) } /*set_up和loop是之前arduino里邊的老朋友了,作為一名菜鳥,我選擇最簡單的arduino入門, 這個(gè)還是對(duì)新手很友好的,推薦太極創(chuàng)客的教程,這個(gè)大家搜一下就搜得到了, setup就是初始化,loop就是主函數(shù)里的大循環(huán)*/ void set_up(){Timer0Init();Timer1Init();EA=1;ET1=1; ET0=1;//初始化定時(shí)器,打開各個(gè)中斷開關(guān) } void loop(){if(cnt==1000){ // f=(TH0<<8)|TL0; // TL0=0;TH0=0;f=ne555;ne555=0;cnt=0;set_tube(3,f/10000%10);set_tube(4,f/1000%10);set_tube(5,f/100%10);set_tube(6,f/10%10);set_tube(7,f%10);} } //因?yàn)槎〞r(shí)器0會(huì)打斷定時(shí)器1,為了盡力減少誤差,定時(shí)器里東西越少越好, //一般是放計(jì)數(shù)標(biāo)志增加,還有就是一些很吃速度又跑得快的,比如說數(shù)碼管刷新 void time0() interrupt 1 { ne555++; } void time1() interrupt 3 {cnt++;digital_tube_display();}//錯(cuò)把main寫成mian且沒看到,白白耽誤四小時(shí),血虧,真的是血虧 //keil編輯器是不會(huì)提示主函數(shù)名字不對(duì)的,這對(duì)菜鳥就很不友好,像我就被這個(gè)折磨了四小時(shí) void main(){set_up();while(1){loop();} }過去一年多自己回來留個(gè)言
這篇文章原本是基本上只有個(gè)代碼塊,啥都寫到注釋里去了.當(dāng)時(shí)的我還是個(gè)歡樂的小菜鳥,這也是自己第一篇發(fā)出來的文章(雖然質(zhì)量不怎么好).尤其記得當(dāng)時(shí)發(fā)完博客高興了好久. 也就是從那個(gè)時(shí)候開始, 開始慢慢習(xí)慣用typora,開始配picgo圖床,開始積累自己的筆記. 這將近兩年磕磕絆絆走了不少路,一看到兩年前自己寫的內(nèi)容,不免感慨萬千.感慨真要是寫下來大概能寫個(gè)半本書哈哈哈,這里就不啰嗦啦. 最后,祝各位前途似錦~
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯单片机555定时器频率测量 非常简单的教程 能直接运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发公开课总结
- 下一篇: OGC服务接口一张图