很早以前,在某個論壇上就看到下面的題目:
用單片機的 I/O 口控制 8 個 LED,要求編寫程序,實現(xiàn)下面的功能。
1.第 1、3、5、7 個燈半亮,其余的全亮。
2.第1個亮1/8、第2個亮2/8、第3個亮3/8、第4個亮4/8、第5個亮5/8、第6個亮6/8、第7個亮7/8、第8個全亮。
3.所有的燈逐漸從暗到全亮,再由全亮到暗。
4.8 個燈從第一個開始依次漸亮,直到最后一個。再從最后一個起漸暗,直到第一個。如此循環(huán)。
好像是用來搞競賽的,只是沒有看到像樣的結(jié)果。
這些個要求,都是要使用 PWM 來解決。下面,做而論道依次寫出程序,大家看看是否能夠滿足題目的要求。
------------------------------------------
1.第 1、3、5、7 個燈半亮,其余的全亮。
這就太簡單了。就是要求 LED 如下顯示:
程序,都沒有什么好編的,就是下面的幾行就行。
;-----------------------------------------
ORG 0000H
START:
MOV P0, #0
XRL P0, #55H ;第 1、3、5、7 取反
DJNZ R7, $ ;延時
SJMP $ - 5 ;再去取反
END
;-----------------------------------------
------------------------------------------
2.第1個亮1/8、第2個亮2/8、第3個亮3/8、第4個亮4/8、第5個亮5/8、第6個亮6/8、第7個亮7/8、第8個全亮。
這個小題,要求 LED 的顯示如下:
程序的思路也不難,只要按照下面的形式,輸出數(shù)據(jù)到接口就行了。
○○○○○○○○ 全亮
○○○○○○○● D0滅
○○○○○○●● D1又滅了
○○○○○●●●
○○○○●●●●
○○○●●●●●
○○●●●●●●
○●●●●●●● D6~D0都滅了
反復(fù)循環(huán)的輸出上述 8 個數(shù)據(jù),那么 D7 就永遠是亮的,D6 有 7/8 的時間是亮的,... D0 只亮了 1/8 的時間。
程序如下:
;-----------------------------------------
ORG 0000H
JMP START
ORG 000BH
JMP T0_INT
ORG 0030H
START:
MOV TH0, #220 ;1250us@11.0592MHz, T0定時方式0
SETB TR0
MOV IE, #82H
MOV 30H, #00H ;準(zhǔn)備數(shù)據(jù)
MOV 31H, #03H
MOV 32H, #0FH ;這些數(shù)據(jù)是交錯存放的
MOV 33H, #3FH ;類似“隔行掃描”
MOV 34H, #01H ;顯示起來就顯得平滑、穩(wěn)定
MOV 35H, #07H
MOV 36H, #1FH
MOV 37H, #7FH
/*
○○○○○○○○
○○○○○○●●
○○○○●●●●
○○●●●●●●
○○○○○○○●
○○○○○●●●
○○○●●●●●
○●●●●●●●
*/
MOV R0, #30H ;設(shè)定指針
SJMP $
;-----------------------------------------
T0_INT: ;1.25ms中斷一次
MOV TH0, #220 ;220: 1250us@11.0592MHz
MOV P0, @R0 ;輸出一個數(shù)據(jù)
INC R0 ;修改指針
CJNE R0, #38H, $ + 5
MOV R0, #30H
RETI
;-----------------------------------------
END
;-----------------------------------------
------------------------------------------
3.所有的燈逐漸從暗到全亮,再由全亮到暗。
這個就是呼吸燈,看看做而論道的前一篇博文吧,這里就不重復(fù)了。
------------------------------------------
4.8 個燈從第一個開始依次漸亮,直到最后一個。再從最后一個起漸暗,直到第一個。如此循環(huán)。
這個才是真正的流水燈。LED 顯示的一部分截圖如下:
程序也不長,全部的代碼,都在下面:
;-----------------------------------------
ORG 0000H
JMP START
ORG 000BH
JMP T0_INT
ORG 0030H
START:
MOV TH0, #220 ;1250us@11.0592MHz, T0定時方式0
SETB TR0
MOV IE, #82H
MOV R2, #100
MOV R3, #0
MOV R4, #0
SJMP $ ;此處可以編寫主程序
;-----------------------------------------
T0_INT: ;1.25ms中斷一次
MOV TH0, #220 ;220: 1250us@11.0592MHz
DJNZ R2, T0_2
MOV R2, #100
INC R3
CJNE R3, #33, T0_2
MOV R3, #0
T0_2:
MOV A, R3 ;R3:0~32
ADD A, R4 ;R4:0~7
ADD A, #TAB - $ - 3
MOVC A, @A + PC
MOV P0, A
INC R4
CJNE R4, #08H, $ + 5
MOV R4, #0
RETI ;本程序用不上 15us
;-----------------------------------------
TAB: DB 255,255,255,255,255,255,255,255
DB 127, 63, 31, 15, 7, 3, 1, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 1, 3, 7, 15, 31, 63,127
DB 255,255,255,255,255,255,255,255
;-----------------------------------------
END
;-----------------------------------------
這個小題,做而論道是用查表的方法解決的,程序相當(dāng)?shù)暮喍蹋疫€比較通用,改成別的花樣也很容易。
也有另外的方法,畢竟 LED 變化還是有明顯的規(guī)律的,所以也可以用計算的方法來解決。
有網(wǎng)友確實是這樣弄的,可以參考:http://www.eehome.cn/read-htm-tid-5208.html。
他這種編程的思路,編寫起來就難多了,恐怕,幾天也弄不出來。
------------------------------------------
上述各個程序,都在硬件系統(tǒng)中,通過了驗證。圖中的 8 個電容,做硬件試驗時,就不用了。
上一篇:51 單片機擴充外部中斷
下一篇:用 74HC595 把 LCD1602 改成串行數(shù)據(jù)接口
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 上汽大眾:汽車網(wǎng)絡(luò)安全漏洞防護
- 恩智浦推出全新電池控制IC系列 助力新能源解決方案發(fā)展
- 全球首條GWh級新型固態(tài)電池生產(chǎn)線樣件下線
- 總投資455億元!三大動力電池項目齊刷進度條
- 現(xiàn)代汽車韓國建氫燃料電池廠,2028年投產(chǎn)
- 6月融資一覽:智能汽車芯片、第三代半導(dǎo)體、機器人成資本焦點
- 艙駕一體“點燃”新戰(zhàn)事
- 汽車智能化2.0引爆「萬億蛋糕」,誰在改寫游戲規(guī)則?
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財報和電話會議時間安排
- 跟上未來,走進恩智浦最新技術(shù)大講堂
- 快來訪問泰克高速串行通信專題 配置您的專屬解決方案 贏好禮!
- 助推電動時代,與英飛凌一起探索電動汽車三大產(chǎn)品技術(shù)
- TI有獎直播:使用 MSPM0 AEC-Q100 MCU 設(shè)計更智能的汽車系統(tǒng)
- 您的電源符合能耗標(biāo)準(zhǔn)嗎?關(guān)注PI InnoSwitch3系列,答題贏好禮!
- 來吧!來吧!一起玩轉(zhuǎn)三維加速度傳感器
- Mentor線上研討會丨FPGA仿真驗證平臺ModelSim應(yīng)用進階
- 有獎直播 11月27日上午10:00 準(zhǔn)時開啟!富士通賦能汽車電子技術(shù)變革
- 有獎直播|英飛凌系統(tǒng)解決方案讓電動摩托設(shè)計更加可靠高效!
- TE Connectivity 提供更懂你的連接解決方案
- max6675是在上升沿還是下降沿讀取數(shù)據(jù)?
- 為什么在加了外部數(shù)據(jù)存儲器62256的程序后,總程序不能運行?
- 出一塊 NuTiny-SDK-M451 有效期到170607
- 求助msp430驅(qū)動3.5吋tft液晶。。。
- 請問function register和control register是什么意思,有什么區(qū)別
- 基于串口的數(shù)字萬用表創(chuàng)意進度帖+電阻、電壓、電流測量方法
- 1個IO口線來實現(xiàn)單機之間的串行數(shù)據(jù)通訊
- 【原創(chuàng)】有沒有單獨學(xué)習(xí)430每一塊資源的方法或是書籍
- 曬WEBENCH設(shè)計的過程+LM5122 Asynchronous BOOST
- 可愛的香版主,我想用STM32的DAC輸出直接驅(qū)動光耦,不知如何