單片機學習資料,如何設置一個鬧鐘
1. 能顯示時時-分分-秒秒;
2. 能夠設定定時時間、修改定時時間;
3. 定時時間到能發出報警聲。
PPT內容預覽:
0.png (95.92 KB, 下載次數: 45)
下載附件
2019-6-27 17:28 上傳
0.png (69.07 KB, 下載次數: 36)
下載附件
2019-6-27 17:29 上傳
0.png (51.78 KB, 下載次數: 48)
下載附件
2019-6-27 17:29 上傳
0.png (315.32 KB, 下載次數: 54)
下載附件
2019-6-27 17:29 上傳
單片機匯編語言源程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP TIME
- ORG 0100H
- MAIN:
- MOV SP,#50H
- MOV 20H,#00H //暫存秒、分、時數字
- MOV 21H,#00H
- MOV 22H,#00H
- MOV 23H,#01H
- MOV 24H,#01H
- MOV 25H,#00H
- MOV 30H,#00H //以下至35H 為當前顯示秒鐘分鐘時鐘
- MOV 31H,#00H
- MOV 32H,#00H
- MOV 33H,#00H
- MOV 34H,#00H
- MOV 35H,#00H
- MOV 36H,#01H //以下至39H 為設定的分鐘時鐘時間
- MOV 37H,#00H
- MOV 38H,#01H
- MOV 39H,#00H
- MOV TMOD,#01H //16位計數器
- MOV TH0,#3CH //計數初值=15536 定時50000微秒=0.05秒
- MOV TL0,#0B0H
- MOV IE,#87H
- SETB TR0 //啟動計數 定時0.5秒后中斷跳轉 TIME
- MOV R2,#14H //20
- MOV P2,#0FFH //P2口寫一
- LOOP:
- LCALL TIMEPRO //看當前是否到達設定時間
- LCALL DISPLAY1
- JB P1.1,M1 //設定時間按鈕是否按下,未被按下查詢下一個鍵
- MOV R1, #23H //存儲按下狀態
- LCALL SETTIME //跳轉至設定當前時間程序
- LJMP LOOP
- M1:
- JB P1.2,M2//確認是否進入設定定時時間,未被按下查詢下一個鍵
- MOV R1,#24H //存儲按下狀態
- LCALL SETATIME //跳轉至設定定時時間程序
- LJMP LOOP
- M2:
- JB P1.5,M4 //確認是否返回 未被按下跳轉M4返回
- M4:
- LJMP LOOP //功能鍵全都未被按下 返回loop繼續查詢
- DELAY: MOV R4,#030H //延時
- DL00:MOV R5,#0FFH
- DL11:MOV R6,#9H
- DL12:
- DJNZ R6,DL12
- DJNZ R5,DL11
- DJNZ R4,DL00
- RET
- SETTIME:
- L0:LCALL DISPLAY1 //顯示當前時間
- MM1:
- JB P1.3,L1 //查看小時+1按鈕是否按下 未按下查詢下一個鍵
- MOV C,P1.3
- JC MM1 //防抖動
- LCALL DELAY1 //延時
- JC MM1 //cy=1跳轉 P1.2沒被按下跳轉
- MSTOP1: //確認p1.3按鍵松開,按一次鍵只執行一次
- MOV C,P1.3
- JNC MSTOP1 //未松開按鍵則死循環 松開跳出
- LCALL DELAY1
- MOV C,P1.3
- JNC MSTOP1//防抖動
- CJNE R1,#23H,NEXT //區分設定當前時間狀態與設定定時狀態
- L3:
- INC 22H //小時+1
- MOV A,22H //A =1
- CJNE A,#18H,GO12 //A不等于18H(24)則跳轉(防溢出)
- MOV 22H,#00H //清零(24H清零)
- MOV 34H,#00H
- MOV 35H,#00H
- LJMP L0 //顯示當前時間
- NEXT: LJMP L4
- L1:
- JB P1.4,L2 //查詢分鐘+1按鈕是否按下,未按下查詢下一個鍵
- MOV C,P1.4
- JC L1 // 防抖動
- LCALL DELAY1
- JC L1// 直到P1.4按下跳出死循環
- MSTOP2: //確認P1.4松開,按一次鍵只執行一次加一程序
- MOV C,P1.4 //讀取目前按鍵狀態
- JNC MSTOP2 //P1.4未松開進入死循環,松開后跳出
- LCALL DELAY1
- MOV C,P1.4
- JNC MSTOP2//
- CJNE R1,#23H,NEXT1 //判斷是否在設定當前時間狀態下
- L5:
- INC 21H //分鐘+1
- MOV A,21H
- CJNE A,#3CH,GO11 //分鐘不等于60跳轉,防溢出
- MOV 21H,#00H //分鐘到達60復位清零
- MOV 32H,#00H
- MOV 33H,#00H
- LJMP L0 //顯示當前時間
- NEXT2:CJNE R1,#24H,L0
- LJMP SETATIME
- L2:
- JB P1.5,NEXT2 //查看P1.5是否按下
- MOV C,P1.5
- JC L2 //再次查詢
- LCALL DELAY1
- MOV C,P1.5
- JC L2// 防抖動 直到P1.4按下跳出循環
- STOP1: //確認P1.5松開
- MOV C,P1.5
- JNC STOP1// P1.5按下跳轉 直到松開
- LCALL DELAY1
- MOV C,P1.5//防抖動
- JNC STOP1
- MOV R1,#00H //清零按鍵狀態存儲
- LJMP LOOP//返回
- NEXT1: LJMP L6
- GO11: //分鐘顯示預備程序
- MOV B,#0AH //B=10
- DIV AB
- MOV 32H,B //放余數 分鐘第二位
- MOV 33H,A //放商 分鐘第一位
- LJMP L0 //顯示
- GO12: //小時顯示預備程序
- MOV B,#0AH //B=10
- DIV AB
- MOV 34H,B //余數 小時數第二位
- MOV 35H,A //商 小時數第一位
- LJMP L0 //顯示
- SETATIME:LCALL DISPLAY2 //顯示設定時間
- N0:LCALL DISPLAY2 //同上
- LJMP MM1 //查詢按鍵狀態
- L4:
- INC 24H //小時+1
- MOV A,24H //
- CJNE A,#24,GO22 //如果A不等于24 跳轉GO22防溢出
- MOV 24H,#00H //A=24 小時溢出 復位
- MOV 38H,#00H
- MOV 39H,#00H
- LJMP N0 //跳轉顯示
- L6:
- INC 23H //分鐘+1
- MOV A,23H
- CJNE A,#60,GO21 //不等于60跳轉,防溢出
- MOV 23H,#00H //復位
- MOV 36H,#00H
- MOV 37H,#00H
- LJMP N0 //跳轉顯示
- GO21: //分鐘顯示預備程序
- MOV B,#0AH //B=10
- DIV AB //
- MOV 36H,B // 設定的分鐘第二位
- MOV 37H,A // 設定的分鐘第一位
- LJMP N0 //跳轉顯示
- GO22: //小時顯示預備程序
- MOV B,#0AH
- DIV AB
- MOV 38H,B //設定的小時第二位
- MOV 39H,A //設定的小時第一位
- LJMP N0 //跳轉顯示
- TIMEPRO: //判斷是否到達當前設定時間
- MOV A,21H
- MOV B,23H
- CJNE A,B,BK // 查詢分鐘是否相等 A B不相等跳轉至BK
- MOV A,22H
- MOV B,24H
- CJNE A,B,BK //小時不相等 跳轉至BK
- SETB 25H.0
- MOV C,25H.0
- JC XX //跳轉至XX 時分相等 到達設定時間
- XX:
- LCALL TIMEOUT //跳轉鬧鈴程序
- BK:
- RET
- TIMEOUT:
- X1:
- LCALL BZ // 跳轉喇叭程序
- LCALL DISPLAY2 //顯示設定時間
- CLR 25H.0 //復位
- JB P1.5,X1 //查詢P1.5狀態 按下跳轉
- LCALL DELAY
- MOV 23H,#00H
- MOV 24H,#00H
- CLR 25H.0
- LJMP LOOP //顯示當前時間
- BZ:
- CLR P3.7 // 喇叭程序 清零P3.7
- MOV R7,#10 //延時
- T2:
- MOV R6,#64H
- T3:
- DJNZ R6,T3
- DJNZ R7,T2
- SETB P3.7 //延時一段時間后取反
- RET //返回X1
- DELAY1:MOV R4,#14H //防抖動專用延時
- DL001:MOV R5,#0FFH
- DL111:DJNZ R5,DL111
- DJNZ R4,DL001
- RET
- TIME: //時間運行程序,定時器定時0.05秒后產生中斷
- PUSH ACC
- PUSH PSW //現場保護
- MOV TH0,#3CH
- MOV TL0,#0B0H //重裝初值
- DJNZ R2,RET0 //R2減一不為0跳轉至RET0 R2=20 循環20次后以后已定時1秒
- MOV R2,#14H //重裝循環值
- MOV A,20H //秒鐘存儲單元
- CLR C //清零CY
- INC A //秒鐘自動加一
- CJNE A,#3CH,GO1 //秒鐘A不等于60 跳轉GO1 防溢出
- MOV 20H,#0 //復位
- MOV 30H,#0
- MOV 31H,#0
- MOV A,21H //當前時間分鐘存儲單元
- INC A //定時60秒后分鐘+1
- CJNE A,#3CH,GO2 //分鐘A不等于60跳轉
- MOV 21H,#0H //復位
- MOV 32H,#0
- MOV 33H,#0
- MOV A,22H //設定小時時間(當前)
- INC A //定時60min后小時自動加一
- CJNE A,#18H,GO3 //小時A不等于24跳轉
- MOV 22H,#00H //復位
- MOV 34H,#0
- MOV 35H,#0
- AJMP RET0 //出棧返回
- GO1: //GO123均為顯示預備程序
- MOV 20H,A //當前秒鐘
- MOV B,#0AH
- DIV AB
- MOV 31H,A //秒鐘第一位
- MOV 30H,B //秒鐘第二位
- AJMP RET0
- GO2:
- MOV 21H,A //當前分鐘
- MOV B,#0AH
- DIV AB
- MOV 33H,A //分鐘第一位
- MOV 32H,B //分鐘第二位
- AJMP RET0
- GO3:
- MOV 22H,A //當前小時
- MOV B,#0AH
- DIV AB
- MOV 35H,A //小時第一位
- MOV 34H,B //小時第二位
- AJMP RET0
- RET0:
- POP PSW //出棧
- POP ACC
- RETI //中斷返回
- DISPLAY1: //顯示當前時間
- MOV R0,#30H //
- MOV R3,#0FEH //數碼管選擇碼
- MOV A,R3 //
- PLAY1:
- MOV P2,A //數碼管選通 寫P2
- MOV A,@R0 //秒鐘第二位存儲單元
- MOV DPTR,#DSEG1 //表首地址送DPTR
- MOVC A,@A+DPTR //查表=查對應數字的數碼管顯示碼送對應選通數碼管
- MOV P0,A //輸出顯示
- LCALL DL1 //延時
- MOV P2,#0FFH //讀P2先寫一
- MOV A,R3
- RL A //向左循環選擇數碼管
- JNB ACC.6,LD1 //循環6次 跳轉至LD1返回
- INC R0 //30——35以此為秒分時的二位、一位、輪流顯示
- MOV R3,A
- LJMP PLAY1
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
仿真ppt程序.7z
(7.65 MB, 下載次數: 105)
2019-6-27 17:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|