- 1、本文档共61页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
DELAY: MOV R6,#n1DL1: MOV R5,#n2DL2: NOP NOP DJNZ R5,DL2 DJNZ R6,DL1SJMP $【例4-13】設計時間為t的延時程式。迴圈程式的一個用處就是設計延時程式,在LED動態掃描和鍵盤掃描“消抖”中經常要用到,一般的延時用雙重迴圈就可以了。以下是雙重迴圈延時的基本程式:在上述程式中,“MOVR6,#n1”運行了1次,“MOVR5,#n2”和“DJNZR6,DL1”各運行了n1次,“NOPNOPDJNZR5,DL2”運行了n1×n2次(每次時間為4T),因為每條指令的運行時間(即指令週期)是已知的,所以上述程式運行的時間是能夠精確計算出來的。在要求不高的情況下,上述時間近似為(n2∶n1越大,誤差越小):t≈4×T×n1×n2時間的長短除了與n1、n2有關之外,還可以用增加或減少“NOP”對時間進行調整。延時程式常常以副程式形式出現,只要將末句“SJMP$”改為“RET”即可。4.2.4查表程式設計在單片機組合語言程式設計中,查表程式的應用非常廣泛,在LED、LCD顯示程式設計中經常用到查表程式,另外可以將單片機無法實現的一些計算(如函數的計算)直接將結果存到內部,需要時一一“對號”讀取就可以了。【例4-14】在程式中定義一個0~9的平方表,利用查表指令找出累加器A=05H的平方值。ORG 0000HMOV DPTR,#TABLE ;表首地址→DPTR(數據指針)MOV A,#05 ;05→AMOVC A,@A+DPTR ;查表指令,25→A,A=19HSJMP $ ;程式暫停TABLE: DB 0,1,4,9,16,25,36,49,64,81 ;定義0~9平方表END有關查表程式的其他應用可以參考其他資料,LED顯示掃描時,從BCD轉到字型碼的查表程式可以參考第8章,在這裏大家要理解查表的原理:查表實際上是人為安排的一種巧合,程式本身沒有在“查”,“對號入座”是查表程式設計的基本思想。4.2.5散轉程式設計在上面的分支程式中可以看到,它是在兩種可能的情況下作出某種選擇,非此即彼,而在實際應用中,常常會遇到需要從兩個以上的條件中選擇一個,這種程式稱為多分支程式或散轉程式,其結構如圖4-9所示。MCS-51單片機指令系統中專門提供了散轉指令,利用散轉指令可以方便地解決看似複雜的問題,請看下麵的例子。圖4-9散轉程式結構【例4-15】編寫要求根據R1的內容轉向各個操作程式的程式。即當:(R1)=0時,轉向GO_0(R1)=1時,轉向GO_1…(R1)=n時,轉向GO_n解:程式清單如下:MOV A,R1RL A ;分支序號值乘2,若下麵轉移指令用LJMP則要乘3MOV DPTR,#FIRST ;轉移指令表首址JMP @A+DPTR ;轉向形成的散轉地址FIRST:AJMP GO_0 ;轉移指令表AJMP GO_1…AJMP GO_n有關散轉的過程可以參考散轉指令“JMP@A+DPTR”的說明,散轉常用在鍵盤的程式的功能處理,如鍵盤號為0時,轉向GO_0,鍵盤號為1時,轉向GO_1等。另外,散轉程式也可以連續用“CJNE”指令來實現,只是程式顯得“肥”,不夠精簡。當然散轉程式也有約束條件,即只能對有規律的數據進行散轉。如在例4-15中,若將某個數據改變,散轉時就會走錯路,而用“CJNE”卻不會有這樣的條件約束。從這個角度上來說,指令不必每條都會用,用什麼樣的指令,最後取決於編程者的習慣。當然高效率的程式還是要提倡的。例4-15用“CJNE”來實現可以表示如下。MOV A,R1 ;取出數據CJNE A,#00H,NEXT1 ;是否為00H,否,繼續比較AJMP GO_0NEXT1: CJNE A,#01H,NEXT2 ;是否為01H,否,繼續比較AJMP GO_1NEXT2: CJNE A,#02H,NEXT3 ;是否為02H,否,繼續比較AJMP GO_1…NEXTn: CJNE A,#0nH,OTHER ;是否為0nH,否,其他或停止 AJMP GO_n4.2.6副程式程式設計在解決實際問題時,經常會遇到一個程式中多次使用同一個程式段,例如延時程式、查表程式、算術運算程式等功能相對獨立的程式段。在實際的單片機應用系統軟體設計中,為了程式結構更加清晰,易於設計,易於修改,增強程式可讀性,同時便於程式
文档评论(0)