89c51單片機匯編語言,AT89C2051時鐘程序——MCS51單片機匯編程序

;;?AT89C2051時鐘程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;定時器T0、T1溢出周期為50MS,T0為秒計數用,?T1為調整時閃爍用,

;P3.7為調整按鈕,P1口?為字符輸出口,采用共陽顯示管。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?中斷入口程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG0000H?;程序執行開始地址

LJMPSTART;跳到標號START執行

ORG0003H?;外中斷0中斷程序入口

RETI;外中斷0中斷返回

ORG000BH?;定時器T0中斷程序入口

LJMPINTT0;跳至INTTO執行

ORG0013H?;外中斷1中斷程序入口

RETI;外中斷1中斷返回

ORG001BH?;定時器T1中斷程序入口

LJMPINTT1;跳至INTT1執行

ORG0023H?;串行中斷程序入口地址

RETI;串行中斷程序返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?主?程?序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

START:MOVR0,#70H?;清70H-7AH共11個內存單元

MOVR7,#0BH

CLEARDISP:

MOV@R0,#00H

INCR0

DJNZR7,CLEARDISP

MOV20H,#00H?;清20H(標志用)

MOV7AH,#0AH?;放入"熄滅符"數據

MOVTMOD,#11H?;設T0、T1為16位定時器

MOVTL0,#0B0H?;50MS定時初值(T0計時用)

MOVTH0,#3CH?;50MS定時初值

MOVTL1,#0B0H?;50MS定時初值(T1閃爍定時用)

MOVTH1,#3CH?;50MS定時初值

SETBEA?;總中斷開放

SETBET0?;允許T0中斷

SETBTR0?;開啟T0定時器

MOVR4,#14H?;1秒定時用初值(50MS×20)

START1:LCALLDISPLAY;調用顯示子程序

JNBP3.7,SETMM1;P3.7口為0時轉時間調整程序

SJMPSTART1;P3.7口為1時跳回START1

SETMM1:LJMPSETMM;轉到時間調整程序SETMM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?1秒計時程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T0中斷服務程序

INTT0:PUSHACC?;累加器入棧保護

PUSHPSW?;狀態字入棧保護

CLRET0?;關T0中斷允許

CLRTR0?;關閉定時器T0

MOVA,#0B7H?;中斷響應時間同步修正

ADDA,TL0?;低8位初值修正

MOVTL0,A;重裝初值(低8位修正值)

MOVA,#3CH?;高8位初值修正

ADDCA,TH0

MOVTH0,A;重裝初值(高8位修正值)

SETBTR0?;開啟定時器T0

DJNZR4,OUTT0;20次中斷未到中斷退出

ADDSS:MOVR4,#14H?;20次中斷到(1秒)重賦初值

MOVR0,#71H?;指向秒計時單元(71H-72H)

ACALLADD1;調用加1程序(加1秒操作)

MOVA,R3;秒數據放入A(R3為2位十進制數組合)

CLRC;清進位標志

CJNEA,#60H,ADDMM

ADDMM:JCOUTT0;小于60秒時中斷退出

ACALLCLR0;大于或等于60秒時對秒計時單元清0

MOVR0,#77H?;指向分計時單元(76H-77H)

ACALLADD1;分計時單元加1分鐘

MOVA,R3;分數據放入A

CLRC;清進位標志

CJNEA,#60H,ADDHH

ADDHH:JCOUTT0;小于60分時中斷退出

ACALLCLR0;大于或等于60分時分計時單元清0

MOVR0,#79H?;指向小時計時單元(78H-79H)

ACALLADD1;小時計時單元加1小時

MOVA,R3;時數據放入A

CLRC;清進位標志

CJNEA,#24H,HOUR

HOUR:JCOUTT0;小于24小時中斷退出

ACALLCLR0;大于或等于24小時小時計時單元清0

OUTT0:MOV72H,76H?;中斷退出時將分、時計時單元數據移

MOV73H,77H?;入對應顯示單元

MOV74H,78H

MOV75H,79H

POPPSW?;恢復狀態字(出棧)

POPACC?;恢復累加器

SETBET0?;開放T0中斷

RETI;中斷返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?閃動調時?程?序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;T1中斷服務程序,用作時間調整時調整單元閃爍指示

INTT1:PUSHACC?;中斷現場保護

PUSHPSW

MOVTL1,?#0B0H;裝定時器T1定時初值

MOVTH1,?#3CH

DJNZR2,INTT1OUT;0.3秒未到退出中斷(50MS中斷6次)

MOVR2,#06H?;重裝0.3秒定時用初值

CPL02H?;0.3秒定時到對閃爍標志取反

JB02H,FLASH1;02H位為1時顯示單元"熄滅"

MOV72H,76H?;02H位為0時正常顯示

MOV73H,77H

MOV74H,78H

MOV75H,79H

INTT1OUT:

POPPSW?;恢復現場

POPACC

RETI;中斷退出

FLASH1:JB01H,FLASH2;01H位為1時,轉小時熄滅控制

MOV72H,7AH?;01H位為0時,"熄滅符"數據放入分

MOV73H,7AH?;顯示單元(72H-73H),將不顯示分數據

MOV74H,78H

MOV75H,79H

AJMPINTT1OUT;轉中斷退出

FLASH2:MOV72H,76H?;01H位為1時,"熄滅符"數據放入小時

MOV73H,77H?;顯示單元(74H-75H),小時數據將不顯示

MOV74H,7AH

MOV75H,7AH

AJMPINTT1OUT;轉中斷退出

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?加1子?程?序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ADD1:MOVA,@R0;取當前計時單元數據到A

DECR0;指向前一地址

SWAPA;A中數據高四位與低四位交換

ORLA,@R0;前一地址中數據放入A中低四位

ADDA,#01H?;A加1操作

DAA;十進制調整

MOVR3,A;移入R3寄存器

ANLA,#0FH?;高四位變0

MOV@R0,A;放回前一地址單元

MOVA,R3;取回R3中暫存數據

INCR0;指向當前地址單元

SWAPA;A中數據高四位與低四位交換

ANLA,#0FH?;高四位變0

MOV@R0,A;數據放入當削地址單元中

RET;子程序返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?清零程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;對計時單元復零用

CLR0:CLRA;清累加器

MOV@R0,A;清當前地址單元

DECR0;指向前一地址

MOV@R0,A;前一地址單元清0

RET;子程序返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?時鐘調整程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;當調時按鍵按下時進入此程序

SETMM:CLRET0?;關定時器T0中斷

CLRTR0?;關閉定時器T0

LCALLDL1S;調用1秒延時程序

JBP3.7,CLOSEDIS;鍵按下時間小于1秒,關閉顯示(省電)

MOVR2,#06H?;進入調時狀態,賦閃爍定時初值

SETBET1?;允許T1中斷

SETBTR1?;開啟定時器T1

SET2:JNBP3.7,SET1;P3.7口為0(鍵未釋放),等待

SETB00H?;鍵釋放,分調整閃爍標志置1

SET4:JBP3.7,SET3;等待鍵按下

LCALLDL05S;有鍵按下,延時0.5秒

JNBP3.7,SETHH;按下時間大于0.5秒轉調小時狀態

MOVR0,#77H?;按下時間小于0.5秒加1分鐘操作

LCALLADD1;調用加1子程序

MOVA,R3;取調整單元數據

CLRC;清進位標志

CJNEA,#60H,HHH;調整單元數據與60比較

HHH:JCSET4;調整單元數據小于60轉SET4循環

LCALLCLR0;調整單元數據大于或等于60時清0

CLRC;清進位標志

AJMPSET4;跳轉到SET4循環

CLOSEDIS:

SETBET0?;省電(LED不顯示)狀態。開T0中斷

SETBTR0?;開啟T0定時器(開時鐘)

CLOSE:JBP3.7,CLOSE;無按鍵按下,等待。

LCALLDISPLAY;有鍵按下,調顯示子程序延時削抖

JBP3.7,CLOSE;是干擾返回CLOSE等待

WAITH:JNBP3.7,WAITH;等待鍵釋放

LJMPSTART1;返回主程序(LED數據顯示亮)

SETHH:CLR00H?;分閃爍標志清除(進入調小時狀態)

SETHH1:JNBP3.7,SET5;等待鍵釋放

SETB01H?;小時調整標志置1

SET6:JBP3.7,SET7;等待按鍵按下

LCALLDL05S;有鍵按下延時0.5秒

JNBP3.7,SETOUT;按下時間大于0.5秒退出時間調整

MOVR0,#79H?;按下時間小于0.5秒加1小時操作

LCALLADD1;調加1子程序

MOVA,R3

CLRC

CJNEA,#24H,HOUU;計時單元數據與24比較

HOUU:JCSET6;小于24轉SET6循環

LCALLCLR0;大于或等于24時清0操作

AJMPSET6;跳轉到SET6循環

SETOUT:JNBP3.7,SETOUT1;調時退出程序。等待鍵釋放

LCALLDISPLAY;延時削抖

JNBP3.7,SETOUT;是抖動,返回SETOUT再等待

CLR01H?;清調小時標志

CLR00H?;清調分標志

CLR02H?;清閃爍標志

CLRTR1?;關閉定時器T1

CLRET1?;關定時器T1中斷

SETBTR0?;開啟定時器T0

SETBET0?;開定時器T0中斷(計時開始)

LJMPSTART1;跳回主程序

SET1:LCALLDISPLAY;鍵釋放等待時調用顯示程序(調分)

AJMPSET2;防止鍵按下時無時鐘顯示

SET3:LCALLDISPLAY;等待調分按鍵時時鐘顯示用

AJMPSET4

SET5:LCALLDISPLAY;鍵釋放等待時調用顯示程序(調小時)

AJMPSETHH1;防止鍵按下時無時鐘顯示

SET7:LCALLDISPLAY;等待調小時按鍵時時鐘顯示用

AJMPSET6

SETOUT1:LCALLDISPLAY;退出時鐘調整時鍵釋放等待

AJMPSETOUT;防止鍵按下時無時鐘顯示

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?顯示程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;顯示數據在70H-75H單元內,用六位LED共陽數碼管顯示,P1口輸出段碼數據,P3口作

;掃描控制,每個LED數碼管亮1MS時間再逐位循環。

DISPLAY:MOVR1,#70H?;指向顯示數據首址

MOVR5,#0FEH?;掃描控制字初值

PLAY:MOVA,R5;掃描字放入A

MOVP3,A;從P3口輸出

MOVA,@R1;取顯示數據到A

MOVDPTR,#TAB;取段碼表地址

MOVCA,@A+DPTR;查顯示數據對應段碼

MOVP1,A;段碼放入P1口

LCALLDL1MS;顯示1MS

INCR1;指向下一地址

MOVA,R5;掃描控制字放入A

JNBACC.5,ENDOUT;ACC.5=0時一次顯示結束

RLA;A中數據循環左移

MOVR5,A;放回R5內

AJMPPLAY;跳回PLAY循環

ENDOUT:SETBP3.5?;一次顯示結束,P3口復位

MOVP1,#0FFH?;P1口復位

RET;子程序返回

TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH

;共陽段碼表?"0""1""2"?"3""4""5""6""7"?"8""9""不亮"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;?延時程序?;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;1MS延時程序,LED顯示程序用

DL1MS:MOVR6,#14H

DL1:MOVR7,#19H

DL2:DJNZR7,DL2

DJNZR6,DL1

RET

;20MS延時程序,采用調用顯示子程序以改善LED的顯示閃爍現象

DS20MS:ACALLDISPLAY

ACALLDISPLAY

ACALLDISPLAY

RET

;延時程序,用作按鍵時間的長短判斷

DL1S:LCALLDL05S

LCALLDL05S

RET

DL05S:MOVR3,#20H?;8毫秒*32=0.196秒

DL05S1:LCALLDISPLAY

DJNZR3,DL05S1

RET

END

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言結構體指針初始化

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 記得上周在飯桌上和同事討論C語言的崛起時,講到了內存管理方面 我說所有指…

WWDC 2013 Session筆記 - iOS7中彈簧式列表的制作

這是我的WWDC2013系列筆記中的一篇,完整的筆記列表請參看這篇總覽。本文僅作為個人記錄使用,也歡迎在許可協議范圍內轉載或使用,但是還煩請保留原文鏈接,謝謝您的理解合作。如果您覺得本站對您能有幫助,您可以使用RSS或…

H5學習之旅-H5列表(8)

列表的基本語法 ol:有序列表 ul:無序列表 li:列表項 dl:列表 dt:列表項 dd:列表描述 常用列表 1.無序列表:使用標簽 ul,li 屬性:disc(默認實心圓)…

c語言 文件夾是否純真,C語言面試題大匯總之華為面試題(轉)

1、局部變量能否和全局變量重名?答:能,局部會屏蔽全局。要用全局變量,需要使用 ":: "局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。…

virtual析構函數的作用?

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 大家知道,析構函數是為了在對象不被使用之后釋放它的資源,虛函…

[codevs1039]數的劃分

這一題實際上是組合數學里面的經典問題,跟第二類Stirling數有些相似。可以把一個數值為n的數看成n個小球,劃分的份數k看作是k個盒子,那么本題的要求就是: 將n個小球放到k個盒子中,小球之間與盒子之間沒有區別&#xff…

c語言中用文件處理數據,C語言文件處理 -C語言從文件中讀寫格式化數據

從圖 1 所示的文件 fin.txt 中讀取學生姓名、身高和體重,計算并顯示它們的平均值,并且將顯示結果保存到文件 fout.txt 中。圖 1:輸入輸出文件示例C語言代碼清單 1:讀取學生姓名、身高和體重,計算并顯示它們的平均值#in…

MySQL于ON DUPLICATE KEY UPDATE采用

今天我們做的推斷插入用途MySQL于ON DUPLICATE KEY UPDATE。現在,Mark下面!假設你想做的事,再有就是在數據庫中插入數據沒有數據、如果有數據更新數據,然后你可以選擇ON DUPLICATE KEY UPDATE。 ON DUPLICATE KEY UPDATE可以在UNI…

C++中Static作用和使用方法

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 1、什么是static? static 是C中很常用的修飾符,它被用來控制變量的…

三星+android+7.0+自動糾正單詞,升級黨必看!三星S/Note系列更新Android 7.0指南

上周,雷科技(微信ID:leitech)曾為大家提供了一份Android 7.0升級預測名單。現在為了增加針對性,這次筆者就以三星最熱門的兩大旗艦S和Note系列為例,給大家提供一個全方面的更新指南。截至目前,三星S系列和Note系列的正…

iOS開發出錯whose view is not in the window hierarchy!的解決

大熊貓豬侯佩原創或翻譯作品.歡迎轉載,轉載請注明出處. 如果覺得寫的不好請多提意見,如果覺得不錯請多多支持點贊.謝謝! hopy ;) 一個簡單的單窗口App在運行時出現錯誤: 2016-04-07 14:28:48.411 BlurViewAndPopView[4364:168520] Warning: Attempt to present <UIAlertCon…

互聯網年鑒

最近互聯網行業&#xff0c;有一個詞說的比較多了&#xff0c;“資本寒冬”。作為&#xff0c;一個在這個行業里干的人&#xff0c;真心是好怕怕呢。 媽蛋&#xff0c;真怕哪天就突然失業了呀。所以&#xff0c;無聊的(操蛋的)去整理了一些98年開始一直到現在的互聯網中一些自己…

android oreo 開機動畫,Android O添加了一個 Splash Screen API幫助簡化啟動屏制作

大多數開發者對閃屏(splash screen)都持不同的態度。一些人支持用閃屏隱藏app的加載&#xff0c;然后自然過渡到主界面&#xff0c;而另一些人認為閃屏不管是對用戶還是開發者都是浪費時間。谷歌在這個問題上的立場也是不一的&#xff0c;以前不推薦使用閃屏的使用&#xff0c;…

C++空類默認函數

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 定義一個空的C類&#xff0c;例如 class Empty { } 一個空的class在C編譯器處理過后就…

拼接SQL的一個技巧

2019獨角獸企業重金招聘Python工程師標準>>> 為了避免判斷是否要在字符串中加 AND 來連接查詢條件&#xff0c;我們可以直接在在WHERE 后面寫 id>0。 這樣&#xff0c;我們在拼接條件的時候&#xff0c;就可以直接寫 AND 了。 SELECT* FROM t_table WHEREid>0…

【Linux導論】Linux引導流程(The Boot Process)

原文 LFS101x.2 Introduction to Linux (Linux Foundation) Chapter 03: Linux Structure and Installation - Section 2: The Boot Process 引導流程 - (The Boot Process) 你是否想過&#xff0c;在你按下電源開關直至Linux登陸提示出現時&#xff0c;后臺到底發生了哪些事&a…

String類 寫出類的成員函數實現

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 已知String類定義如下&#xff1a; class String { public: String(const char *str …

android 管理類,android 線程管理類

1. 延時任務以及取消延時的應用場景&#xff1a;實時搜索&#xff0c;文字內容變化時候不發送請求&#xff0c;當停止變化指定時間后再發送請求2. 使用方法&#xff1a;// 回到主線程MainThreadHelper.runOnUIthread(new Runnable() {Overridepublic void run() {// pushActivi…

計算一行文本的高度

計算一行文本的高度 說明 有時候我們需要知道指定的幾行文本的高度&#xff0c;此工具用于解決此種問題。 源碼 // // NSStringLabelWidthAndHeight.h // ZiPeiYi // // Created by YouXianMing on 15/12/9. // Copyright © 2015年 YouXianMing. All rights reserved.…

python筆記-python編程優化:常用原則和技術介紹

本人翻譯自《Exper Python Programming》 Premature optimization is the root of all evil in programming -Donald Knuth 優化的三原則 讓它跑起來先一個非常常見的錯誤就是在編寫代碼之初我們就開始對代碼進行優化。讓人傷心的是這通常做的都是無用功&#xff0c;很多軟…