你还会写这段C51程序吗?
經典題目解析
定時器T1采用計數模式,方式1中斷,計數輸入引腳 P3.5外接開關按鈕作為計數信號輸入,P1口控制8個LED小燈,初始狀態所有小燈全亮,按3次按鈕開關產生計數中斷時,高3位和低5位交替閃爍3次,中斷響應后返回初始狀態 。
51里的計數器溢出中斷
啥是中斷?啥是計數?
通俗的說,單片機在執行main 函數時被打擾了而停下來去做其他的事,完事了又返回main 里繼續執行,叫中斷;
計數又叫計數器,來一個脈沖計一個數,這個過程無關于每個脈沖之間的時間間隔長短。
什么是溢出?溢出這個詞是翻譯英文「Overflow」過來的,通俗點說就是滿了,裝不下了,就是溢出,比如一個水桶可以裝 100 個兵乓球,你放了101?個進去,放第 101 個的時候,就會導致水桶溢出「Overflow」。
單片機里有5個中斷源以及各個中斷,這里不加詳細說了。特殊功能寄存器里的定時器/計數器工作「規定時間到了或者計數滿了」就會溢出產生中斷。定時器中斷很好寫,這個題目主要是介紹計數器產生中斷的流水燈和總結。
硬件原理圖
用一個按鍵接在P3.5 上面,P1 外接 8個LED 小燈。
C51代碼
#include <reg51.h>unsigned char blink = 0x1F;void Delay(unsigned int i)//延時函數 {unsigned int j;for(;i>0;i--)//i是形參,不賦值for(j=0;j<125;j++){;} }void main(void) {TMOD = 0X50;TH1 = 0XFF;TL1 = 0XFD;/*這里表示按鍵按 3 次后就會溢出進入中斷*/P1=0x00; /*初始燈都亮*/EA = 1; /*系統允許中斷*/ET1 = 1; /*使能定時器1中斷*/TR1 = 1;while(1){P1=0x00; }}void T1_int(void) interrupt 3 { unsigned int c; /*重裝初值,只有方式2可以不用重裝初值,其他方式都必須用*/ TH1 = 0XFF;TL1 = 0XFD; /*重裝初值*/for(c=0;c<3;c++)/*閃爍3次*/{P1 = blink;Delay(500);/*按位取反*/blink = ~blink;P1 = blink;Delay(500);} }重點講解兩個寄存器
C51定時器結構看圖片,P3.5 對應的是T1,TH1,TL1 統計P3.5的脈沖個數
工作方式寄存器高 4 位對應的是設置T1 的工作方式,低 4 位對應的是設置T0的工作方式。
定時器/計數器控制寄存器
了解一下:
51單片機定時器方式0,方式1,都不能自動重新置初值。當溢出后,定時器的TLI,THI已經變成了0,而我們是從計數初值開始計數才正確,所以需要重新賦初值。
T1方式1邏輯結構框圖
方式2可以自動重裝,所以不需要。初值在運行過程中計數器的不斷加1,直到溢出時產生中斷。因為這種定時方式(有的方式可以自動重置的),單片機不能重置初值,所以進入中斷后必須人工重置初值,為下一次中斷做準備。
第二部分,實驗操作
1.敲代碼,編譯成hex文件,如下圖
2.點擊調試,在main函數里的分別第一句和最后一句代碼前面對應的黃色和藍色光標用鼠標先左鍵后右鍵(或者雙擊左鍵),選擇插入/刪除斷點。黃色光標的位置就是執行當前代碼的位置
3.插入斷點后變紅色
4.查看單片機寄存器 點擊外圍設備,彈出下面的窗口。然后點擊復位鍵RST和旁邊的運行鍵FS執行(都多點兩次);最后,TMOD寄存器和TCON寄存器是不是符合預期值的,要是符合就沒有問題。
6.這個過程叫燒錄 雙擊主單片機,進入選擇hex文件步驟,選擇后直接執行左下角的執行就可以了
7.按開關SW1到第3次后,8個小燈就像下面圖示交替閃爍三次,最后又回到初始全亮的樣子。如果再按三次SW1又重復上面的狀態。(備注:如果小燈閃爍現象不明顯,就看電阻與小燈串聯后的兩端電位變化現象。紅色點是高電平,藍色點是低電平,黃色點是不正常。)
如下圖:
為什么有這篇文章
我應該有8年沒寫過C51代碼了,這個是一個粉絲朋友,在學習的過程中遇到了問題,發給我讓我幫忙看,我尋思了下,發現這個東西還是挺有意思的,就一起調試了出來,從開始到調通,應該花了40分鐘吧,中間插播各種喝水,上廁所,吹牛的時間。
然后我就讓他寫了這篇文章,主要是想總結下這個學習,避免以后遇到做重復的工作,然后就有了這篇文章,希望各位讀者在學習中養成總結的好習慣。
我一個初中老師跟我說的一句話,叫做?「好記性不如爛筆頭」?。我現在還記得,因為我覺得我不是聰明人,但是我覺得我可以用勤奮來彌補自己的不聰明。
總結一下
單片機的世界里面充滿了無窮無盡的樂趣,剛開始學習C51單片機的時候,可能有很多都無法理解,但是就是從不知道到知道這個過程中,慢慢體會到電子的樂趣,就好像上面那個C51代碼,剛開始,我是很不理解怎么跑到中斷服務子程序里面去執行的,為什么會這樣呢?想到一個詞語,叫做 「百思不得姐」。然后就去看C51的構成,說白了,就是有一個開關,檢測某個地方,發成異常了,CPU就判斷這個溢出標志,然后就跑到中斷里面去執行。
好了,就這樣~ 留言說說下,你們當初是如何學習C51的,讓更多的人知道你們也踩過坑~
往期好文合集
他說他是具有文學氣息的工科屌絲男(900字文言文,碩士論文致謝)
清華博士告訴你 “0Ω電阻”的系列應用
干貨 | 雙目攝像頭實現手勢識別,完美還原人體運動手勢。
這篇文章后,不要再問我怎么做一臺智能車了。
群體智能,多個機器人協同搬運!
??最 后??
?若覺得文章不錯,轉發分享,也是我們繼續更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!
在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~
長按識別圖中二維碼關注
總結
以上是生活随笔為你收集整理的你还会写这段C51程序吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是物联网,怎么理解物联网(物联网技术
- 下一篇: 矫情这一次,感谢这几个人。