流程圖:
0.png (76.37 KB, 下載次數: 94)
下載附件
2016-4-7 01:05 上傳
1.png (25.69 KB, 下載次數: 97)
下載附件
2016-4-7 01:05 上傳
2.png (42.73 KB, 下載次數: 118)
下載附件
2016-4-7 01:05 上傳
本實驗所有資料打包下載:
單片機實驗.rar
(55.34 KB, 下載次數: 7)
2016-4-7 01:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
實驗報告論文如下:
單片機實驗報告 ―自動報時系統設計實驗 院系:電信學院自動化0106 姓名:王建冬 學號:200182012
一. 設計任務 1.時間顯示功能。用6位數碼管顯示時,分,秒。 2.利用鍵盤可以設定當前時間(時,分,秒) 3.2個LED指示燈L1,L2來表示輸出狀態 4.作息時間表存于ROM中,時間表如下: 08:00開始工作 L1亮2s后滅,L2滅; 11:30 午休 L1亮2s后滅,L2亮一個小時后滅; 12:30下午工作開始 L1亮2s后滅,L2滅; 17:00下班 L1亮2s后滅,L2亮十分鐘后滅; 二. 硬件連線圖 (附錄1) 三. 程序流程圖 (附錄2) 四. 程序 (附錄3) 五. 操作說明 系統上電顯示“LLLLLLLL”后,立即從初始時間7:56:30開始運行。當按下鍵盤last鍵后,進入修改模式,此時數碼管對應小時的位置閃爍,時間不停,再按一下last,退出修改模式,顯示正常。 在修改模式下:按下next鍵,轉換要修改的位置,由數碼管相應的位置閃爍,可知將要修改的是小時,分鐘,還是秒,此時間也不停止;按下shift鍵,時間停止,相應的位置加一,如果指向秒的位置則清零,實現修改時間的功能。修改完畢,再按一下last,退出修改模式,顯示正常。 六. 心得 通過實驗,更好得理解了MCS-51單片機的硬件系統與指令系統,有了在ADEK51實驗設備上開發單片機的能力,同時對鍵盤掃描/顯示芯片8279有了一定的了解,并能熟練應用8279。 由于本實驗有一定的復雜性及應用性,所以更強調系統的設計步驟、方法,在實驗中還要不斷的修改,以使程序盡可能的合理與簡化,此次實驗增加了自己的開發經驗,為以后打下堅實的基礎。
程序: - ;附錄3:源程序
- ;說明:
- ;R0指向30,31,32的地址指針,初始值為30 全局
- ;R1函數toram的入口,指向20的地址指針 全局
- ;R2定時一秒的常數 全局
- ;R3接受按鍵 全局
- ;R4報警標志位 全局 r3,r4是函數toram用到的寄存器 局部
- ;R5計時器狀態標志 全局 r5=00 計時器go r5=11 計時器stop
- ;R6修改狀態標志 全局 r6=00 按鍵無效 r6=ff 進入修改狀態,
- ;R7函數toram的入口,全局 一個壓縮BCD碼
- ;20H開始的8個數據單元存放時間的BCD碼
- ;30H,31H,32H依次存放小時,分,秒的壓縮BCD碼
-
- Z8279 EQU 0FF82H
- D8279 EQU 0FF80H
- LEDMOD EQU 10H
- LEDFEQ EQU 38H
- LEDCLS EQU 0D1H
- LEDWRO EQU 90H
- KEY1 EQU 28H ;修改狀態改變
- KEY2 EQU 29H ;修改位置改變
- KEY3 EQU 2AH ;數值改變
- ORG 0000H
- AJMP START
- ORG 000BH
- AJMP T0INT
- ORG 0040H
- START:
- MOV SP,#60H
- MOV R1,#20H
- MOV R2,#08H
- MOV A,#00H
- MOV 30H,#07H
- MOV 31H,#56H
- MOV 32H,#30H
- MOV DPTR,#Z8279
- MOV A,#LEDCLS
- MOVX @DPTR,A
- LCALL DELAY
- MOV A,#LEDMOD
- MOVX @DPTR,A
- MOV A,#LEDFEQ
- MOVX @DPTR,A
- LOOP22:
- MOV @R1,A
- INC R1
- DJNZ R2,LOOP22
- LCALL INIT8279
- ;------------------------初始化
- CLR P1.0
- CLR P1.1
-
- MOV R6,#00H
- MOV R0,#30H
- MOV R2,#14H
- mov R5,#00h
- MOV R4,#00H ;清標志位 -報警
- MOV R7,#00H
- MOV 22H,#00H
- MOV 25H,#00H
- CLR TF0
- MOV TMOD,#01H
- MOV TH0,#4BH
- MOV TL0,#0FCH
- MOV IE,#82H
- SETB TR0
- ;---------------------修改時間
- MODIFY:
- MOV DPTR,#Z8279
- MOVX A,@DPTR
- ANL A,#0FH
- JZ KEY_OUT ;沒有按鍵 跳出
- MOV A,#40H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOVX A,@DPTR ;A接受按鍵
- MOV R3,A
- CJNE R3,#KEY1,POSITION ;判斷按鍵是不是key1, 不是跳轉
- CJNE R6,#00H,PRESS_SEC ;第一次按key1進入修改狀態,(顯示閃爍),時間不停
- MOV R6,#0FFH ;置標志位
- SJMP KEY_OUT ;跳出
- PRESS_SEC:
- MOV R6,#00H ;第二次按key1跳出修改狀態 (不閃爍)
-
- CJNE R5,#00H,MODIFY_OK ;如果計時停止,恢復計時
- SJMP KEY_OUT
- MODIFY_OK:
- SETB TR0 ;啟動定時器
- SJMP KEY_OUT
- POSITION:
- CJNE R3,#KEY2,VALUE ;判斷是否為key2,不是跳轉
- CJNE R6,#0FFH,KEY_OUT ;若未進入修改狀態,跳轉
- INC R0 ;若進入修改狀態,則移位
- CJNE R0,#33H,JJJ
- MOV R0,#30H
- JJJ:
- SJMP KEY_OUT
- VALUE:
- CJNE R3,#KEY3,KEY_OUT ;判斷是否為key3,不是跳出
- CJNE R6,#0FFH,KEY_OUT ;判斷是否進入修改狀態,沒有-跳出
- CLR TR0 ;若已進入,停止計時,準備修改
- MOV R5,#11H ;標記置位,表明計時停止
- CJNE R0,#32H,WWW
- MOV @R0,#00H
- SJMP KEY_OUT
- WWW:
- MOV A,@R0 ;在相應的位置加一
- ADD A,#01H
- DA A
- MOV @R0,A
- MOV A,R0
- CJNE A,#30H,SIXTY ;如果不是小時,加到60,
- CJNE @R0,#24H,KEY_OUT ;是小時,加到24
- MOV @R0,#00H
- SJMP KEY_OUT
- SIXTY:
- CJNE @R0,#60H,KEY_OUT
- MOV @R0,#00H
- SJMP KEY_OUT
- KEY_OUT:
- CJNE R6,#0FFH,NODIS ;如果已進入修改狀態,進入閃爍顯示狀態
- LCALL FLASHON
- NODIS:
- LCALL SIREN ;調用報警程序
- AJMP MODIFY ;循環
- ;------------------------子程序-------------------------
- FLASHON:
- CJNE R0,#30H,JUMP31 ;如果指針指向小時,則小時位閃爍
- MOV R1,#26H
- MOV A,@R0
- MOV R7,A
- LCALL TORAM ;將小時的BCD碼送到26H,27H
- MOV DPTR,#Z8279 ;閃爍
- MOV A,#86H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#87H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- LCALL DELAY
- MOV DPTR,#Z8279 ;將小時的值顯示出來
- MOV A,#86H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,26H
- MOVX @DPTR,A
- MOV DPTR,#Z8279 ;將小時的值顯示出來
- MOV A,#87H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,27H
- MOVX @DPTR,A
- LCALL DELAY
- RET ;顯示完畢,跳出
- JUMP31:
- CJNE R0,#31H,JUMP32 ;如果指針指向 分,則分鐘的位置閃爍
- MOV R1,#23H
- MOV A,@R0
- MOV R7,A
- LCALL TORAM
- MOV DPTR,#Z8279
- MOV A,#83H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#84H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- LCALL DELAY
-
- MOV DPTR,#Z8279
- MOV A,#83H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,23H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#84H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,24H
- MOVX @DPTR,A
- LCALL DELAY
- RET
- JUMP32:
- CJNE R0,#32H,QIUT ;如果指針指向秒,則秒位閃爍
- MOV R1,#20H
- MOV A,@R0
- MOV R7,A
- LCALL TORAM
- MOV DPTR,#Z8279
- MOV A,#80H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#81H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,#00H
- MOVX @DPTR,A
- LCALL DELAY
-
- MOV DPTR,#Z8279
- MOV A,#80H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,20H
- MOVX @DPTR,A
- MOV DPTR,#Z8279
- MOV A,#81H
- MOVX @DPTR,A
- MOV DPTR,#D8279
- MOV A,21H
- MOVX @DPTR,A
- LCALL DELAY
- QIUT: RET
- SIREN:
- PUSH ACC
- MOV A,#00H ;讀取時間t1,與現在時間比較,
- MOV DPTR,#TIMETABLE ;若相等,置報警位,輸出報警信號
- MOVC A,@A+DPTR ;不等,跳轉---比較表中的下一個時間
- CJNE A,30H,NEXT1
- MOV A,#01H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT1
- MOV A,#02H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT1
- MOV R4,#0FFH
- SETB P1.0 ;燈1亮2s,燈2滅
- POP ACC
- RET
- NEXT1: ;讀取時間t2,與現在時間比較
- MOV A,#03H ;若相等,置報警位,輸出報警信號
- MOV DPTR,#TIMETABLE ;不等,跳轉---比較表中的下一個時間
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT2
- MOV A,#04H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT2
- MOV A,#05H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT2
- MOV R4,#0FFH
- SETB P1.0 ;燈1亮2s,燈2亮
- SETB P1.1
- POP ACC
- RET
- NEXT2: ;;讀取時間t3,與現在時間比較
- MOV A,#06H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT3
- MOV A,#07H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT3
- MOV A,#08H
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT3
- MOV R4,#0FFH
- SETB P1.0 ;燈1亮2s,燈2滅
- CLR P1.1
- POP ACC
- RET
-
- NEXT3: ;讀取時間t4,與現在時間比較
- MOV A,#09H ;若相等,置報警位,輸出報警信號
- MOV DPTR,#TIMETABLE ;不等,跳轉---比較表中的下一個時間
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT4
- MOV A,#0AH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT4
- MOV A,#0BH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT4
- MOV R4,#0FFH
- SETB P1.0 ;燈1亮2s,燈2亮
- SETB P1.1
- POP ACC
- RET
- NEXT4: ;;讀取時間t3,與現在時間比較
- MOV A,#0CH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,30H,NEXT5
- MOV A,#0DH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,31H,NEXT5
- MOV A,#0EH
- MOV DPTR,#TIMETABLE
- MOVC A,@A+DPTR
- CJNE A,32H,NEXT5
- MOV R4,#0FFH
- SETB P1.0
- CLR P1.1 ;燈1亮2s,燈2滅
- NEXT5:
- POP ACC
- RET
-
- INIT8279:
- PUSH ACC
- PUSH R2
- PUSH R1
- MOV R1,#20H
- MOV R2,#08H
- MOV DPTR,#Z8279
- MOV A,#LEDWRO
- MOVX @DPTR,A
- MOV DPTR,#D8279
- LOOP33: MOV A,@R1
- MOVX @DPTR,A
- INC R1
- DJNZ R2,LOOP33
- POP R1
- POP R2
- POP ACC
- RET
-
- DELAY: PUSH 00H
- PUSH 01H
- MOV R0,#00H
- DELAY1:MOV R1,#00H
- DJNZ R1,$
- DJNZ R0,DELAY1
- POP 01H
- POP 00H
- RET
-
- TORAM: PUSH ACC
- PUSH R3
- PUSH R4
- MOV A,R7
- MOV R3,A
- MOV R4,A
- MOV A,#0FH
- ANL A,R3
- MOV DPTR,#LEDSEG
- MOVC A,@A+DPTR
- MOV @R1,A
- INC R1
- MOV A,#0F0H
- ANL A,R4
- SWAP A
- MOV DPTR,#LEDSEG
- MOVC A,@A+DPTR
- MOV @R1,A
- POP R4
- POP R3
- POP ACC
- RET
- ;---------------------------------中斷服務程序----------
- T0INT:
- MOV TH0,#4BH
- MOV TL0,#0FCH
- DJNZ R2,LOOP4
- MOV R2,#14H
- MOV A,32H ;加一
- ADD A,#01H
- DA A
- MOV 32H,A
- CJNE A,#60H,TRANS
- MOV 32H,#00H
- MOV A,31H
- ADD A,#01H
- DA A
- MOV 31H,A
- CJNE A,#60H,TRANS
- MOV 31H,#00H
- MOV A,30H
- ADD A,#01H
- DA A
- MOV 30H,A
- CJNE A,#24H,TRANS
- MOV 30H,#00H
-
- TRANS: ;拆分送入20H開始的數據段
- MOV R1,#20H
- MOV R7,32H
- LCALL TORAM
- MOV R1,#23H
- MOV R7,31H
- LCALL TORAM
- MOV R1,#26H
- MOV R7,30H
- LCALL TORAM
- ;CJNE R6,#00H,LOOP4
- LCALL INIT8279 ;顯示
-
- CJNE R4,#00H,PPP ;如果無報警,燈滅
- CLR P1.0
- SJMP LOOP4
- PPP: INC R4 ;有報警,r4加一,計時
- LOOP4: RETI
- LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
- DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
- TIMETABLE: DB 08H,00H,00H
- DB 11H,30H,00H
- DB 12H,30H,00H
- DB 17H,00H,00H
- DB 17H,10H,00H
- END
復制代碼
|