導航:首頁 > 操作系統 > 單片機B1H

單片機B1H

發布時間:2023-05-25 10:54:08

㈠ 急求單片機幾道試題答案,哪位高手來幫下忙,謝謝

1、(1)察殲設A=6CH,CY=1,執行RRC後,A=( 0B6H ),CY=( 0 )。
(2)、執行下列程序段後,(A)=( 62H )Cy=( 1 )(Y是下標啊)
CLR C MOVA A,#B1H RLCA
3、(1)下列程序段執行後,(R0)=(差前7FH ),(7EH)=(虛沒清 00H ),(7FH)=( 40H )。
MOV R0,#7EH
MOV 7EH ,#0FFH
MOV 7FH,#40H
INC @R0
INC R0
(2)設(SP)=60H,(ACC)=37H,(B)=78H執行下列指令
PUSH ACC
PUSH B
結果:( 60H )=37H, ( 61H )=78H,(SP)=( 62H ).

㈡ 如何利用外部中斷0控制單片機發出一個占空比可調的方波信號

ORG00H;起始地址00HJMPMAIN;跳轉到MAINORG0BH;Tmier0中斷服務子程序起始地址為0BHJMPTIM_LOW;跳轉到TIM_LOW;下面是主程序段,肢核初始化MAIN:MOVIE,#82H;使能Tmier0中斷(10000010B)MOVTMOD,#01H;設置Tmier0工作在模式1下TIMER0_LOAD:MOVTH0,#0B1H;往TH0中載入計數初始值(凱遲65536-20000=45536)0.02秒MOVTL0,#0E0H;往TL0中載入計數初始值(45536=B1E0,則:TH0=B1H,TL0=E0H)SETBTR0;使TR0置1,以啟動Tmier0SET_HIGH:SETBP1.0;p1.0=1LOOP:JMPLOOP;循環TIM_LOW:NOTP1.0;P1.0取反MOVTH0,#0B1H;重新往TH0中載入計數初始值MOVTL0,#0E0H;重新往TL0中載入計數初始值RETI;中斷盯飢李服務子程序結束END;程序結束

㈢ 單片機編程題,請給出正確的編程語言,謝謝

ORG 0000H
AJMP START
ORG 000BH
AJMP INT0
START: MOV TMOD,#10H
SETB EA
SETB ET0
MOV TH0,#B1H
MOV TL0,#E0H ;40MS延時初始值
MOV R0,#01H ;R0用來標志中斷里定時器應該賦誰(高低電平)的初值的值
SETB P1.7 ;起始輸出高電平
SETB TR0
HERE: SJPM HERE ;等待中斷
INT0: MOV A,R0
JNZ GAO
SETB P1.7
MOV TH0,#0B1H
MOV TL0,#0E0H
SETB TR0
INC R0
SJMP NEXT
GAO: CLR P1.7
MOV TH0,#0B9H
MOV TL0,#B0H ;36MS延時初值
SETB TR0
INC R0
CJNE R0,#11,NEXT ;十次36MS延時之後清R0
CLR R0
NEXT: RETI
自己看看對不對吧
用兩個定時器的話(一個定時高電平一個定時周期或者一個定時高電平一個定時低電平),可以省掉R0的,程序會比較簡單

㈣ 單片機查表時數據表出現字母開頭的數如a0h,就會提示symbol not defined,為什麼錯啊

16進制數遇字母,前須加#號,如#a0h 。

㈤ 如何用單片機的串口發送00H

首先應該初始化定時器(即波特率發生器),然後設置串口發送方帆握式。
如態肆慶果採用查詢方式用C語言就是這樣:
SBUF=data;while(TI==0);TI==0;
意思就是數據寫到SBUF里 要等到數據發送完畢之後才能再次發送。否雹空則會發生丟數現象。

㈥ 求助編一個51單片機自動溫度檢測報警系統的程序

;********************************************************************
;DS18B20溫度計 *
;採用4位LED共陽顯示器顯示測溫值,顯示精度0.1℃,測溫范圍-55~+125*
;用AT89C2051單片機,12MHZ晶振 *
;********************************************************************
;***************常數定義********************
TIMEL EQU 0E0H ;20ms,定時器0時間常數
TIMEH EQU 0B1H
TEMPHEAD EQU 36H
;********************工作內存定義**********************
BITST DATA 20H
TIME1S0K BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
SCANLED DATA 2AH
;*****************引腳定義*****************************
TEMPDIN BIT P3.7
;*****************中斷向量區***************************
ORG 0000H
LJMP START
ORG 000BH
LJMP T01T
;***************系統初始化****************************
ORG 0030H
START: MOV SP,#60H
CLSMEM: MOV R0,#20H
MOV R1,#60H
CLSMEM1: MOV @R0,#00H
INC R0
DJNZ R1,CLSMEM1
MOV TMOD,#00100001B ;定時器0工作方式1(16位)
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SJMP INIT
ERROR: NOP
LJMP START
NOP
INIT: NOP
SETB ET0
SETB TR0
SETB EA
MOV PSW,#00H
CLR TEMPONEOK
MOV 50H,#10
MOV 51H,#10
MOV 52H,#10
MOV 53H,#10
LJMP MAIN
;*******************************************************************
;定時器0中斷服務程序
;*******************************************************************
T01T: CLR TR0
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SETB TR0
LEDDIS:
MOV DPTR,#TAB
MOV R1,#50H
MOV A,SCANLED
ADD A,R1
MOV R1,A
MOV A,SCANLED
JNZ LEDDIS1
MOV P3,#08H
SJMP LEDDIS4
LEDDIS1:
DEC A
JNZ LEDDIS2
MOV P3,#04H
SJMP LEDDIS4
LEDDIS2:
DEC A
JNZ LEDDIS3
MOV P3,#02H
SJMP LEDDIS4
LEDDIS3:
MOV P3,#01H
LEDDIS4:
MOV A,@R1
MOVC A,@A+DPTR
MOV P1,A
INC SCANLED
MOV A,SCANLED
CJNE A,#4,T0CNT
MOV SCANLED,#0
T0CNT:
INC R7
CJNE R7,#200,T0IT1
MOV R7,#00H
SETB TIME1S0K ;1s定時到標志
T0IT1: RETI
;********************************************************************
; 主程序
;********************************************************************
MAIN:
JNB TIME1S0K,MAIN
CLR TIME1S0K ;測溫每1s一次
LCALL READTEMP ;讀出溫度值子程序
LCALL CONVTEMP ;溫度BCD碼計算處理子程序
LCALL DISPBCD ;顯示區BCD碼溫度值刷新子程序
LJMP MAIN
;********************************************************************
; 子程序區
;********************************************************************
;***************復位DS18B20*****************************************
INITDS1820: SETB TEMPDIN
NOP
CLR TEMPDIN
MOV R6,#251 ;延時>480μs
DJNZ R6,$
SETB TEMPDIN
MOV R6,#37 ;
LOOP1820: MOV C,TEMPDIN
JC INITDS1820OUT
DJNZ R6,LOOP1820
SJMP INITDS1820
RET
INITDS1820OUT:
MOV R6,#06BH ;延時200μs
DJNZ R6,$
SETB TEMPDIN
RET
;*******讀DS18B20的程序,從DS18B20中讀出1位元組的數據*****
READDS1820: MOV R7,#08H
READDS1820LOOP: CLR TEMPDIN
NOP
NOP
SETB TEMPDIN
MOV R6,#07 ;延時15μs
DJNZ R6,$
MOV C,TEMPDIN
RRC A
MOV R6,#25
DJNZ R6,$
DJNZ R7,READDS1820LOOP
RET
;******寫DS18B20的程序,從DS18B20中寫1位元組數據*****
WRITEDS1820: MOV R7,#08H
WRITEDS1820LOP: CLR TEMPDIN
MOV R6,#07H ;延時15μs
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#30 ;延時104μs
DJNZ R6,$
SETB TEMPDIN
NOP
DJNZ R7,WRITEDS1820LOP
SETB TEMPDIN
RET
;******************讀TEMP******************88
READTEMP: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A, #44H
LCALL WRITEDS1820 ;開始轉換
MOV R6,#250 ;延時
DJNZ R6,$
READTEMP1: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A,#0BEH
LCALL WRITEDS1820 ;中間結果寄存器
MOV R6,#34H ;延時104μs
DJNZ R6,$
READTEMP2: LCALL READDS1820
MOV TEMPL,A
LCALL READDS1820
MOV TEMPH,A
READTEMPOUT: RET
;**************處理溫度BCD碼子程序***********
CONVTEMP: MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;"-"
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI=符號位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;"+"
TEMPC11:
MOV R6,#4H
TEMPC12:
MOV A,TEMPH
RRC A
MOV TEMPH,A
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R6,TEMPC12
RET
;*****************小數部分碼表*********
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;************顯示區BCD碼溫度值刷新子程序********
DISPBCD: MOV 53H,TEMPHC
MOV A,TEMPL
MOV B,#10
DIV AB
MOV 50H,B
MOV B,#10
DIV AB
MOV 51H,B
JZ DISPBCD2
MOV 52H,A
RET
DISPBCD2: MOV 52H,#10
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;共陽段碼表 "0","1","2","3","4","5","6","7","8","9","不亮","-"
END

㈦ 單片機定時器計數器如何使用

使用12MHz晶振,其機器周期為1us
欲產生5000us周期方波,只需在p1.0以2500us時間交替輸出高低電平
1.T0為方式0,則M1M0=00H。使用定時功能,C/T=0,GATE=0。T1不用,其有關位設為0。因此,TMOD=00H
2.方式0為13長度計數(TL0高3位不使用),設計數初值為X,則(8192-X)*1us=2500us,得X=5692D。X=1011000111100B。因為TL0高3位不用,所以10110001-00011100B得TH0=B1H,TL0=1CH
3.由控制寄存器TCON的TR0位來控制定時的啟動和停止,TR0=1啟動,TR0=0停止
C語言程序如下(編譯器Keil C)
#include<REG51.H>
sbit FB=p1^0;
void initial(void)
{
TMOD=0x00;
TH0=0xb1;
TL0=0x1c;
IE=0x00;
TR0=1;
}
void main(void)
{
initial();
for(;;)
{
while(!TF0);
TF0=0;
FB=!FB;
}
}
匯編程序如下
ORG 0000H
AJMP START
ORG 30H
START: MOV P1.0,#0FFH
MOV TMOD,#00H
MOV TH0,#0B1H
MOV TL0,#1CH
SETB TR0
LOOP: JBC TF0,NEXT
LJMP LOOP
NEXT: CPL P1.0
MOV TH0,#0B1H
MOV TL0,#1CH
LJMP LOOP
END

㈧ 我有一塊12864的液晶模塊,應該如何的去使用12864液晶模塊

文章開頭備註:這一篇文章僅僅是對12864操作的一個具體介紹,僅限給剛剛接觸12864的新手,大神請拍磚,文章寫的比較散,建議新手先參考12864手冊以及控制驅動器ST7920英文手冊,在有個初步理解之後再次閱讀該篇文章,將會有更加深層的認識。強烈建議仔細的閱讀ST7920英文手冊!細節內容裡面有詳細的介紹,中文的12864也大多是從中譯過來的。

本文是分為三個步驟來介紹12864的內部資源原理,指令集詳細講解,以及應用的例子。

對於12864的所有操作概括起來就有4種:
1)、讀忙狀態(同時會讀出指針地址的內容),在初始化之後每次對12864的讀寫均要進行忙檢測。
2)、寫命令:所有的命令可以去查看指令表,後續會講解指令消粗的詳細用法。寫地址也就是寫指令。
3)、寫數據:操作的對象有DDRAM、CGRAM、GDRAM。
4)、讀數據:操作的對象也是DDRAM、CGRAM、GDRAM。

對於12864的學習首先要去了解其內部資源,知道了它裡面到底有哪些東西,你就可以更加方便的去使用它了。

先簡單介紹幾個英文的名字:
DDRAM:(Data Display Ram),數據顯示RAM,往這裡面寫啥,屏幕它就會顯示啥。
CGROM:(Character Generation ROM),字元發生ROM。裡面是存儲了中文漢字的字模,也稱之為中文字型檔,編碼方式有GB2312(中文簡體)和BIG5(中文繁體)。筆者所使用的是育松電子的QC12864B,講解以此為例。
CGRAM:(Character Generation RAM),字元發生RAM,12864內部是提供了64×2B的CGRAM,可以用於用戶自定義4個16×16字元,每一個字元佔用了32個位元組。
GDRAM:(Graphic Display RAM):圖形顯示RAM,這一塊區域是用於繪圖的,同理——往裡面寫啥,屏幕也就會顯示啥,它與DDRAM的區別在於,往DDRAM中寫的數據是字元的編碼,字元的顯示先是在CGROM中找到字模,然後再映射到屏幕上的,而往GDRAM中寫數據時,圖形的點陣信息每個點都用1bit來保存其裂橋坦顯示與否。
HCGROM:(Half height Character Generation ROM):半寬字元發生器,是字母與數字,也就是ASCII碼。
至於ICON RAM(IRAM):貌似現在市場上的12864沒有該項功能,筆者也沒有去找到它的應用資料,所以在這里不作介紹了。
轉載於12864液晶模塊:http://www.hzjingxian.com/

下面我們就圍繞這上面列舉的這列資源來展開對12864的講解:
DDRAM:
筆者所使用的這塊12864內部是有4行×32位元組的DDRAM空間。但是在某一時刻,屏幕只能夠顯示2行×32位元組的空間,那麼剩餘的這些空間呢?它們是可以用於緩存的,在實現卷屏顯示時這些空間就能夠派上用場了。
DDRAM結構如下所示:
80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH
B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH

地址與屏幕顯示的對應關系如下:
第一行:80H、81H、82H、83H、84H、85H、86H、87H
第二行:90H、91H、92H、93H、94H、95H、96H、97H
第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
第四行:98H、99H、肆桐9AH、9BH、9CH、9DH、9EH、9FH

說明:紅色部分的數據是歸上半屏所顯示,綠色部分的數據是歸下半屏所顯示。一般我們在用於顯示字元使用的是上面兩行的空間,也就是80H~8FH,90H~9FH,每一個地址的空間是2個位元組,也就是1個字,所以它可以用於存儲字元編碼的空間總共就是128位元組。因為每一個漢字的編碼是2個位元組,所以每一個地址就需要使用2個位元組來存儲一個漢字。當然如果將這2個位元組拆開來使用也是可以的,那就是顯示出2個半寬字元了。
DDRAM內部所存儲的數據都是字元的編碼,可以寫入的編碼有ASCII碼、GB2312碼、BIG5碼。筆者所使用的12864字型檔貌似不太全,字元的「數」都無法顯示,而是顯示出其他字元。如果顯示長篇漢字文章就優點不太適合了。
DDRAM數據的讀寫:
所有的數據讀寫都應該是先送地址,然後再進行讀寫。對DDRAM寫數據時,確保在基本的指令集下(使用指令0x30開啟),然後寫入地址,之後再連續的寫入兩個位元組的數據。在讀數據時,在基本指令集下先寫地址,然後再假讀一次,之後再連續讀出2個位元組的數據,讀完之後地址指針自動加一,跳到下一個字,若需要讀下一個字的內容,只需再執行連續讀2個位元組的數據。這里的假讀需要注意,不光是讀CGRAM需要假讀,讀其他的GDRAM、DDRAM都需要先假讀一次,之後的讀才是真讀,假讀就是讀一次數據,但是不會存儲該數據,也就是說送地址之後第一次讀的數據時錯誤的,之後的數據才是正確的。(mmy為假讀)

關於編碼在DDRAM中的存儲需要說明的事項如下:
1)、每次對於DDRAM的操作單位都是一個字,也就是2個位元組,當往DDRAM寫入數據時,首先要寫地址,然後連續送入2個位元組的數據,先送高位元組的數據,再送低位元組的數據。讀數據時也是如此,先寫地址,然後再讀出高位元組數據,再讀出低位元組的數據(讀數據時請注意要先假讀一次)。
2)、顯示ASCII碼半寬字元時,往每個地址送入2個位元組的ASCII編碼,對應屏幕上的位置就會顯示出2個半寬字元,左邊的為高位元組字元,右邊的則為低位元組字元。
3)、顯示漢字時,漢字編碼的2個位元組必須要存儲在同一地址空間之中,不能夠分開放在2個地址存放,否則顯示的就不會是你想要的字元。每一個字中的2個位元組自動結合查找字模並且顯示字元。所以,如果我們往一個地址中寫入的是一個漢字的2位元組編碼就會正確顯示該字元,編碼高位元組存放在前一地址低位元組,編碼低位元組存放在後一地址高位元組,顯然他們就不會結合查找字模,而是與各地址相應位元組結合查找字模。

4)、因為控制器ST7920提供了4個自定義字元,所以這4個自定義字元也是可以完全顯示出來的,同樣這4個自定義字元也是採用了編碼的方式,但是這4個字元的編碼是固定的,分別是0000H,0002H,0004H,0006H。如下圖所示:

上圖只是把2個字元的CGRAM空間畫出來,後續還會有2個字元。可以看到每一個字元都有16行16列,每一行使用了2個位元組,因此一個字元所佔用的空間是32位元組,地址是6位的,4個字元的地址分別是:00H~0FH、10H~1FH、20H~2FH、30H~3FH。編碼使用的是2個位元組,可以看到有2個位是任意的,說明其實這4個字元的編碼可以有多個,只是我們常用前面列舉的4個編碼。

CGRAM: (數據讀寫)
CGRAM的結構就是上面所示的了,這里再次補充一些讀寫CGRAM的內容,讀寫之前要先寫地址,寫CGRAM的指令為0x40+地址。但是我們在寫地址時只需要寫第一行的地址,例如第一個字元就是0x40+00H,然後連續寫入2個位元組的數據,之後地址指針就會自動加一,跳到下一行的地址,然後再寫入2個位元組的數據。其實編程實現就是寫入地址,然後連續寫入32個位元組的數據。讀數據也是先寫首地址,然後假讀一次,接著連續讀32個位元組的數據。

GDRAM:(繪圖顯示RAM)
繪圖RAM的空間結構如下圖所示:

這些都是點陣,繪圖RAM就是給這些點陣置1或者置0,可以看到其實它本來是32行×256列的,但是它分成了上下兩屏顯示,每一個點都對應了屏幕上的一個點。要使用繪圖功能需要開啟擴展指令。然後寫地址,再讀寫出數據。
GDRAM的讀寫:
首先要說明對GDRAM的操作基本單位是一個字,也就是2個位元組,就是說讀寫GDRAM時一次最少要寫2個位元組,一次最少讀2個位元組。
寫數據:先開啟擴展的指令集(0x36),然後再送地址,這里的地址與DDRAM中的略有些不同,DDRAM中的地址就只有一個,那就是字的地址。而GDRAM中的地址就只有2個,分別是字地址(列地址/水平地址X)以及位地址(行地址/垂直地址Y),上圖之中的垂直地址就是00H~31H,水平地址就是00H~15H,在寫地址時要先寫垂直的地址(行地址)再寫水平地址(列地址),也就是說要連續寫入兩個地址之後,然後再連續寫入2個位元組的數據。如圖中所示,左邊的為高位元組右邊的為低位元組。為1的點被描黑,為0的點則是顯示出空白。這里就列舉一個寫地址的例子:寫GDRAM地址指令的是0x80+地址。被加上的地址就是上面所列舉的X和Y,假設我們要寫第一行的2個位元組,那麼寫入地址就是0x00H(寫行地址)然後寫0x80H(列地址),之後才連續的寫入2個位元組的數據(先高位元組後低位元組)。再如寫屏幕右下角的2個位元組,先寫行地址0x9F(0x80+32),再寫列地址0x8F(0x80+15),然後連續寫入2個位元組的數據。編程中寫地址函數中直接用參數(0x+32),而就不必自己相加。
讀數據:首先開啟擴展指令集,然後再寫行地址、寫列地址,假讀一次,再連續讀2位元組的數據(先高位元組後低位元組)。

讀寫時序:
讀寫時序圖如下:(上圖為寫,下圖為讀)

時序圖之中的信號引腳就是12864最主要的引腳,分別是:
RS:命令/數據寄存器選擇端
WR:讀寫的控制端
E:使能端
DB7~DB0:數據端

所有對於12864的操作基本都是圍繞著幾根引腳所展開的。包括寫命令、寫數據、讀數據、讀狀態就是通過這一些引腳的高低電平搭配來實現的。

根據時序圖可以編寫出相應的寫命令函數、寫數據函數、讀數據函數、讀狀態函數。需要的注意的是有效數據出現的那段時間Tc必須合適,不能太短,否則就會造成讀寫失敗。

給出幾個函數示例:
//忙檢測,若忙則等待,最長等待時間為60ms
void busychk_12864(void){
unsigned int timeout = 0;
E_12864 = 0;
RS_12864 = 0;
RW_12864 = 1;
E_12864 = 1;
while((IO_12864 & 0x80) && ++timeout != 0); //忙狀態檢測,等待超時時間為60ms
E_12864 = 0;
}

//寫命令子程序
void wrtcom_12864(unsigned char com){
busychk_12864();
E_12864 = 0;
RS_12864 = 0;
RW_12864 = 0;
IO_12864 = com;
E_12864 = 1;
delay_12864(50); //50us使能延時!!!注意這里,如果是較快的CPU應該延時久一些
E_12864 = 0;
}

//讀數據子程序
unsigned char reddat_12864(void){
unsigned char temp;
busychk_12864();
E_12864 = 0;
IO_12864 = 0xff; //IO口置高電平,讀引腳
RS_12864 = 1;
RW_12864 = 1;
E_12864 = 1;
delay_12864(50); //使能延時!!!注意這里,如果是較快的CPU應該延時久一些
temp = IO_12864;

return temp;
}

//寫數據子程序
void wrtdat_12864(unsigned char dat){
busychk_12864();
E_12864 = 0;
RS_12864 = 1;
RW_12864 = 0;
E_12864 = 1;
IO_12864 = dat;
delay_12864(50); //使能延時!!!注意這里,如果是較快的CPU應該延時久一些
E_12864 = 0;
}

其中,忙檢測是必要的,當BF=1時,表示內部正在進行相關的操作,即:處於忙狀態。在BF變回0之前ST7920不會接受任何指令。MCU必須要檢測BF以確定ST7920內部操作是否已完成,然後才能夠再發送指令。也可以使用延時來替代忙檢測,但是需要延時足夠的時間。盲檢測實際就是讀內部的狀態寄存器,該寄存器最高位(D7)為忙標志BF,剩餘的7位為地址指針的內容,所以在進行盲檢測實際上也把地址指針中的地址讀出來了。

指令集:
指令集是分為基本指令集以及擴展指令集,使用相應的指令集必須要先寫相應指令表明後續指令均為該類指令。如使用基本指令集時,寫指令(0x30),需要使用擴展指令集時寫指令(0x34)切換到擴展指令集。

一)基本的指令集(RE=0):(在使用擴展指令集時先寫指令0x30,這使得RE=0)

清屏指令(0x01):往DDRAM寫滿0x20,指針的地址寫0x00。表現在屏幕上的就是顯示空白。
回車指令(0x02/0x03):地址指針內容寫上0x00.
進入模式:0 0 0 0 0 1 I/D S:設置讀寫數據之後游標、顯示移位的方向。內部有2個可編程位,I/D表示讀寫一個字元後數據指針是加一還是減一。I/D=1指針加一,I/D=0指針減一。S=1開啟整屏移動。
S I/D= H H,屏幕每次左移一個字元。
S I/D= H L ,屏幕每次右移一個字元。
但是平時若不開啟屏幕移動,這里說明一個概念,那就是屏幕移動,實際試驗中若開啟了屏幕移動你會發生顯示是非常怪異的,說明如下:由於DDRAM的結構是下方表所示:
上半屏 下半屏
80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH
B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH
在沒有開啟屏移時,屏幕是以表格第一來列作為參考起點的,然後前8列歸為上半屏顯示,後8列歸為下半屏顯示。如果此時向左屏移動一個字元,那麼DDRAM內容與顯示映射關系應變為:
80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH
B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH
可以看出實際上原來第三第四行開始的字元跑到了第一行第二行的末尾,一整個DDRAM的結構就是一種循環的結構,發生屏移時DDRAM與顯示映射關系不斷的在改變。但是這不太符合我們的閱讀習慣,所以如果需要使用到該項功能還需編程校正之。
顯示、游標、閃爍開關:0 0 0 0 0 0 1 D C B:
D=1: 顯示開(Display) C=1: 游標開(Cursor) B=1: 游標位置閃爍開(Blink)。為0則就為關。
游標顯示移位控制:0 0 0 1 S/C R/L X X

說明:
LL:這時僅僅是將地址指針AC的值減1。在屏幕上表現出來的是游標左移一個字元。
LH:這時僅僅是將地址指針AC的值加1。在屏幕上表現出來的是游標右移一個字元。
HL:AC的指針不變,向左屏移動一個字元。這是DDRAM結構循環左移,80H接在8FH後面,90H接在9FH的後面。這與上面講的屏移是一樣的。
HH:AC指針不變,向右屏移動一個字元。這是DDRAM結構循環右移,80H接在8FH後面,90H接在9FH後面。
功能設置:0 0 1 DL X RE X X:(切換基本的指令集與擴展指令集)
DL=1表示8為介面,DL=0表示4為介面。
RE=1表示開啟擴展指令,RE=0表示使用基本指令。
開啟基本指令則設置為0x30,開啟擴展指令則設置為0x34。
CGRAM地址設置:0x40+地址。地址范圍是00H~3FH。前提是SR=0,即允許設置IRAM和CGRAM地址!!!
DDRAM地址設置:只會有字地址。如下表所示。(注意DDRAM地址有4行×16字)如下所示:
80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH
B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH
所以在某一個時刻只能夠顯示出其中的2行。只有卷動顯示才能夠將另兩行的數據顯示出來。
讀忙標志(地址):同時忙標志和地址讀出來。忙狀態時,ST7920不會接受任何指令。按照時序圖將RS置0,RW置1,然後讀取狀態寄存器。
寫RAM(DDRAM/CGRAM/GDRAM):寫了控制邏輯(函數wrtcom_12864(地址);)之後,直接送數據(wrtdat_12864)。寫完後地址指針根據進入模式中的設置加一或減一。寫數據前先寫地址,而寫地址本身是一個寫地址命令,然後再寫數據。
讀RAM(DDRAM/CGRAM/GDRAM):記得先假讀一次,後面的才是真讀,假讀之後不需要再假讀了,除非重設了地址。

二)擴展指令集(RE=1):(使用擴展指令集先寫指令0x34,這使得RE=1)

待機模式:0x01,不影響DDRAM,所以跟清屏指令不同,任何指令可以結束待機模式。
卷動地址/IRAM地址允許設置:0 0 0 0 0 0 1 SR:
SR=1:允許設置垂直卷動地址。SR=0:允許設置IRAM和CGRAM地址。
設置卷動/IRAM地址:0x40+地址。(卷動地址為行地址,即縱向地址).
這里講解卷動,卷動就是上下滾屏,實現屏幕的垂直滾動。
卷動地址:地址范圍為0x00~0x63,共64行卷動地址其實就是垂直地址。每一個地址代表著DDRAM中的一行的像素點。卷動一次就是把該行所有點移到上半屏和下半屏幕最上方。
80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH
90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH
A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH
B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH
還是DDRAM的結構圖,需要注意的是卷屏是分上半屏卷動和下半屏卷動,兩屏之間沒有關系,也就是DDRAM中左邊紅色部分在上半屏滾動,右邊綠色部分在下半屏滾動。
B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H 的下一行是
80H、81H、82H、83H、84H、85H、86H、87H
也就是說左邊是一個上下相接的循環結構。同理右邊也是上下相接的循環結構。左邊內存中的字元上下滾動。右邊內存中的字元上下滾動,兩者木有關系。
要開啟卷動,首先開啟擴展指令集,然後允許卷動地址設置,再設置卷動地址。
wrtcom_12864(0x34); //打開擴展指令
wrtcom_12864(0x03); //允許輸入卷動地址
wrtcom_12864(0x40 + 地址 //設置卷動地址
wrtcom_12864(0x30); //回到基本指令
要實現全屏滾動,就必須使用循環不斷地修改卷動地址。從00~63如此循環,但遺憾的是這也不符合我們的閱讀習慣,後續的應用的中將講解全屏滾動的實現方法。這里只是把卷動原理講清楚。
反白顯示:0 0 0 0 0 1 R1 R0:
R1、R0初始化的值為00。選擇1~4任一行反白顯示並可決定是否反白。
如何開啟反白顯示:首先開啟擴展指令(0x34),然後設置選中某一行設置反白顯示(0x04+R1R0)。00為第一行,01為第二行,10為第三行,11為第四行。需要說明的是,這里的行是指DDRAM所有內存的行,而不是顯示的行,屏幕只顯示2行。
所以如果我們開啟第3第4行的反白顯示,不卷動我們是看不到效果的。
同時,如果我們開啟第1行反白顯示,那麼在屏幕中第1行第3行都會反白顯示,第2行則對應屏幕第2第4行,這一點需要注意。
如何關閉反白顯示:只需在此寫一次地址即可關閉,也就說,第一次寫第一開啟反白,第二次寫相同的地址關閉反白顯示。
wrtcom_12864(0x34); //反白顯示試驗
wrtcom_12864(0x04); //開啟反白顯示
delay_12864(60000); //延時
delay_12864(60000); //延時
wrtcom_12864(0x04); //關閉反白顯示
wrtcom_12864(0x30); //開啟基本指令集
擴展功能設置:0x36設置繪圖顯示開。
當GDRAM寫完了之後,寫0x36則屏幕顯示你所繪制的圖形。
0 0 0 0 1 DL x RE G x (RE=1擴展指令,G=1開繪圖顯示,DL=1表示8為介面)
設置GDRAM地址:繪圖時,需要將GDRAM的地址寫入地址指針中,然後才能寫入數據。連續寫入兩個位元組,第一個為行地址(Y),第二個為列地址(X)。
需要注意的是:寫了數據之後,地址指針會自動加一(以字為單位),當到達該行的行尾時,指針下一次加一會使得地址指針跳回該行行首,也就說如果地址值為8FH時,下一次它就是80H(以第一行為例)。指針地址在本行之間循環。
指令介紹完
再講下初始化過程,根據ST7920的手冊提供的初始化步驟就可以了。

初始化函數如下:
//延時子程序
void delay_12864(unsigned int del){
unsigned int i;
for(i = 0; i < del; i++){; }
}

//初始化12864子函數
void initial_12864(void){
delay_12864(40000);
RST_12864 = 1;
RST_12864 = 0; //復位
delay_12864(500);
RST_12864 = 1;
wrtcom_12864(0x30); //設置為基本指令集動作
delay_12864(100);
wrtcom_12864(0x30); //設置為基本指令集動作
delay_12864(37);
wrtcom_12864(0x08); //設置顯示、游標、閃爍全關。
delay_12864(100);
wrtcom_12864(0x01); //清屏,並且DDRAM數據指針清零
delay_12864(100000);
wrtcom_12864(0x06); //進入模式設置
}

㈨ 求單片機課程設計實驗 用匯編語言,基於51單片機的定時鬧鍾

MODE_RG EQU40H ;模式選擇

MODE2 EQU 60H ;MODE值

MODE3 EQU61H

MODE4 EQU62H

MODE5 EQU63H

MODE6 EQU64H

MODE1 EQU65H

HOUR EQU41H ;小時緩沖區

MIN EQU42H ;分鍾緩沖區

SEC EQU 43H ;秒緩沖區

TEMP EQU4AH

;*********鬧鍾緩沖區********************

H_ALARM EQU 6AH ;鬧鍾緩沖區

M_ALARM EQU6BH

S_ALARM EQU6CH

F_ALARM EQU6DH

;***********秒錶緩沖區******************

M_SEC EQU76H

S_SEC EQU77H

;*********LED送顯示臨時變數*************

LED0 EQU51H

LED1 EQU52H

LED2EQU53H

LED3 EQU54H

MODE_KEYEQUP3.4

UP_KEY EQUP3.3

DOWN_KEY EQUP3.5

BUF EQU49H

ORG0000H

LJMPMAIN

ORG000BH

LJMPINT_0

ORG001BH

LJMPINT_1

ORG0080H

MAIN: MOVSP,#2FH ;堆棧初始化

MOVMODE_RG,#0 ;MODE_RG寄存器值初始化

MOVLED0,#0FEH ;初始化LED

MOVLED1,#0FDH

MOVLED2,#0FBH

MOVLED3,#0F7H

MOVMODE1,#1

MOVMODE2,#2

MOVMODE3,#3

MOVMODE4,#4

MOVMODE5,#5

MOVMODE6,#6

MOVF_ALARM,#0 ;錯誤2:一開始用CLRF_ALARM,這導致在後面的時候JZF_ALARM運行錯誤,

MOVBUF,#0 ;在於JZ指令是對累加器A全為0或者全為1進行判斷,CLR只能對一位操作

MOVTMOD,#11H ;定時器初始化:定時器0,方式1,定時器1,方式1

MOVIP,#00001000B ;定時器1優先順序高

MOVTH0,#3CH ;定時50MS

MOVTL0,#0B1H

MOVTH1,#0D8H ;定時10MS

MOVTL1,#0F0H

SETBEA

SETBET0

SETBET1

SETBTR0;啟動定時器

MOVHOUR,#0 ;fortest

MOVMIN,#0

MOVSEC,#0 ;定時器計數器,50MS中斷一次,200次則剛好1S

MOVM_SEC,#0

MOVS_SEC,#0

MOVH_ALARM,#0

MOVM_ALARM,#0

MAIN1: LCALLDISPLAY12

LCALLDISPLAY34

;CLRP1.4 TEST

JNBMODE_KEY,KEY_SCAN

MOVA,MODE_RG

CJNEA,MODE6,Y1 ;MODE6秒錶

JNBDOWN_KEY,DEALDOWN ;判斷秒錶開關

JNBUP_KEY,DEALUP

Y1: MOVA,F_ALARM ;判斷鬧鍾

JNZALARM

LJMPMAIN1

;-----------------------------------秒錶開關程序---------------------------

DEALDOWN: LCALLDELY10MS

JBDOWN_KEY,MAIN1

H1: JNBDOWN_KEY,H1

CPLTR1

LJMPMAIN1

DEALUP: LCALLDELY10MS

JBUP_KEY,MAIN1

H2: JNBUP_KEY,H2

MOVM_SEC,#0

MOVS_SEC,#0

CLRTR1

LJMPMAIN1

;-----------------------------------鬧鍾掃描程序---------------------------

ALARM: MOVA,H_ALARM

CPLP1.2

CJNEA,HOUR,EXIT3

MOVA,M_ALARM

CJNEA,MIN,EXIT3

LJMPSTARTALARM

EXIT3: SETBP3.6

LJMPMAIN1

STARTALARM:CPLP3.6

JNBDOWN_KEY,OFFALARM

LJMPS1

OFFALARM: LCALLDELY10MS

JBDOWN_KEY,MAIN1

S2: JNBDOWN_KEY,S2

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S1: LCALLDELAY

LJMPMAIN1

;-----------------------------------鍵盤掃描程序---------------------------

KEY_SCAN: LCALLDELY10MS

JBMODE_KEY,MAIN1

INCMODE_RG

;SETBP1.4 測試

K1: JNBMODE_KEY,K1 ;按鍵直到用戶松開按鍵

K2: MOVA,MODE_RG

CJNEA,#0,DEALMODE;不是在正常顯示模式下則跳轉到模式處理程序

LJMPMAIN1 ;返回主程序

;*******************模式處理程序部分

DEALMODE: MOVTEMP,#0 ;凡轉入MODE處理,則首先清除TEMP

MOVA,MODE_RG ;有MODE_RG值不為5、0

CJNEA,MODE2,M0 ;判斷MODE_RG值,不為1跳轉

LJMPH_GLINT ;模式1,小時位閃爍

M0: CJNEA,MODE3,M1 ;不是模式2,跳轉

LJMPM_GLINT ;模式2,分鍾位閃爍

M1: CJNEA,MODE4,M2 ;不是模式3,跳轉

LJMPH_GLINT

M2: CJNEA,MODE5,M3

LJMPM_GLINT

M3: CJNEA,MODE6,M4

MOVM_SEC,#0

MOVS_SEC,#0

LJMPMAIN1

M4: CJNEA,MODE1,M5

;CLRTR1

LJMPMAIN1

M5: MOVMODE_RG,#0

LJMPMAIN1

;*****************************MODE為1,3,小時位閃爍

//MOVTEMP,HOUR ;將TEMP賦值,防止在加的時候是在隨機值的基礎上增加

H_GLINT: ;CPLP1.0

MOVR0,#28

MOVR1,#28

K4: LCALLDISPLAY12 ;分開顯示

LCALLDISPLAY34

E1: JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉到分鍾位閃爍

JBUP_KEY,E9 ;判斷加位有無按鍵按下

LJMPUP

E9: DJNZR0,K4

K6: LCALLDISPLAY34

JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉延時後進行模式判斷

LJMPG1

K21: LCALLDELY10MS ;延時後確定有MODE按鍵按下,將

JBMODE_KEY,H_GLINT

W: JNBMODE_KEY,W

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序

JNBUP_KEY,UP ;判斷加位有無按鍵按下

G1: DJNZR1,K6

LJMPH_GLINT ;調用完畢返回,實現閃爍

K3: LJMPMAIN1 ;可省略

;******************************MODE為2,4,分鍾位閃爍

M_GLINT: MOVR0,#28

MOVR1,#28

K23: CPLP1.7

LCALLDISPLAY12

LCALLDISPLAY34

JNBMODE_KEY,KK ;跳轉,確定是否有按鍵按下

JNBUP_KEY,UP ;判斷加位有無按鍵按下

MOVA,MODE_RG

CJNEA,MODE3,E2 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下

LJMPE5

E2: JNBDOWN_KEY,F2

LJMPE5

F2: LJMPONALARM2

E5: DJNZR0,K23

K24: LCALLDISPLAY12

JNBMODE_KEY,KK ;檢測是否有按鍵按下,有按下則跳轉

JNBUP_KEY,UP ;判斷加位有無按鍵按下

MOVA,MODE_RG ;掃描鬧鍾確認鍵

CJNEA,MODE3,E7 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下

LJMPG2

E7: JBDOWN_KEY,E8

CPLP1.3

LJMPONALARM2

E8: LJMPG2

KK: LCALLDELY10MS ;去抖

JBMODE_KEY,M_GLINT

W1: JNBMODE_KEY,W1

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序

G2: DJNZR1,K24

LJMPM_GLINT

;*************************位加,處理程序

;***************小時調整

UP: MOVR1,#20

UP11: INCTEMP

UP12: MOVA,MODE_RG ;判斷此時的MODE,根據MODE將臨時變數給對應的賦值

CJNEA,MODE2,AA0 ;不是在MODE2的情況下跳轉

MOVA,TEMP

CJNEA,#24,A_UP1

MOVTEMP,#0

A_UP1: MOVHOUR,TEMP ;為MODE2,將臨時變數賦給小時位

LJMPUP15

AA0: CJNEA,MODE4,UP13//UP13為分鍾調整入口

MOVA,TEMP

CJNEA,#24,A_UP

MOVTEMP,#0

A_UP: MOVH_ALARM,TEMP ;模式3,將臨時變數賦給鬧鍾的小時位

LJMPUP15 ;UP15為顯示入口

;****************分鍾調整入口

UP13: MOVA,MODE_RG

CJNEA,MODE3,UP14 ;不是模式2,跳轉

MOVA,TEMP

CJNEA,#60,DISOVER2

MOVTEMP,#0

DISOVER2: MOVMIN,TEMP

LJMPUP15

UP14: MOVA,TEMP ;上面判斷不是模式2,則必然是模式4

CJNEA,#60,DISOVER3

MOVTEMP,#0

DISOVER3: MOVM_ALARM,TEMP

LJMPUP15

UP15: LCALLDISPLAY12

LCALLDISPLAY34

DJNZR1,UP01

MOVR1,#1 ;

JNBUP_KEY,UP11

UP01: JNBUP_KEY,UP12

UP16: MOVA,MODE_RG ;松開鍵以後按照模式判斷該返回哪種狀態,不能返回DEALMODE函數

CJNEA,MODE2,UP17

LJMPH_GLINT

UP17: CJNEA,MODE3,UP18

MOVSEC,#0 ;每次設置完時間後將秒鍾位置零保證時間准確

LJMPM_GLINT

UP18: CJNEA,MODE4,UP19

LJMPH_GLINT

UP19: CJNEA,MODE5,UP20

LJMPM_GLINT

UP20: LJMPMAIN1

ONALARM2: LCALLDELY10MS ;延時10MS,去抖

JBDOWN_KEY,B2 ;抖動所致,返回分鍾位閃爍

LJMPK42

B2: LJMPM_GLINT

K42: JNBDOWN_KEY,K42

MOVF_ALARM,#0FFH

MOVMODE_RG,#0

LJMPMAIN1

;---------------------------------------中斷程序入口---------------------

;*******************時間中斷0*********************

;錯誤1:中斷程序EXIT處用了MAIN1,導致一直處於中斷狀態

INT_0: PUSHACC

PUSHPSW

MOVTH0,#3CH

MOVTL0,#0B1H

INCBUF

MOVA,BUF

CJNEA,#20,EXIT

TIME: MOVBUF,#0

INCSEC

MOVA,SEC

CJNEA,#60,EXIT

MOVSEC,#00H

INCMIN

MOVA,MIN

CJNEA,#60,EXIT

MOVMIN,#00H

INCHOUR

MOVA,HOUR

CJNEA,#24,EXIT

MOVHOUR,#0

RETI

EXIT: POPPSW

POPACC

RETI

;******************時間中斷1***********************

INT_1: MOVTH1,#0D8H ;定時10MS

MOVTL1,#0F0H

INCS_SEC

MOVA,S_SEC

CJNEA,#100,EXIT4

MOVS_SEC,#0

INCM_SEC

MOVA,M_SEC

CJNEA,#100,EXIT4

MOVM_SEC,#0

EXIT4: RETI

;---------------------------------------顯示-----------------------------

DISPLAY12: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間

CJNEA,MODE4,DIS0 ;模式四,顯示鬧鍾

LJMPDIS01 ;MODE4

DIS0: CJNEA,MODE5,DIS20

DIS01: MOVR7,H_ALARM ;鬧鍾模式

LJMPDIS2

DIS20: CJNEA,MODE6,DIS21

MOVR7,M_SEC ;秒錶模式,顯示秒錶高位

LJMPDIS2

DIS21: CJNEA,MODE1,DIS1

LJMPDIS22

DIS22: MOVR7,MIN

LJMPDIS2

DIS1: MOVR7,HOUR ;DISPLAY12顯示高位

DIS2: LCALLBCTD ;判斷完畢,調用顯示

;將秒、分分別轉碼,放到R4,R3

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVDPTR,#NUMTAB

MOVP2,#0FH

MOVP2,LED0

MOVA,45H ;從拆字的出口獲取值

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED1

MOVA,46H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

RET

DISPLAY34: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間

CJNEA,MODE4,DIS31

LJMPDIS32

DIS31: CJNEA,MODE5,DIS35

DIS32: MOVR7,M_ALARM

LJMPDIS34

DIS35: CJNEA,MODE6,DIS41

MOVR7,S_SEC ;秒錶模式,顯示秒錶低位

LJMPDIS34

DIS41: CJNEA,MODE1,DIS33

MOVR7,SEC

LJMPDIS34

DIS33: MOVR7,MIN ;DISPLAY34顯示低位

DIS34: LCALLBCTD

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVP2,LED2

MOVA,47H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED3

MOVA,48H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

SETBP2.3

RET

;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------

BCTD: MOVR5,#16

CLRA

MOVR2,A

MOVR3,A

MOVR4,A

LOOP: CLRC

MOVA,R7

RLCA

MOVR7,A

MOVA,R6

RLCA

MOVR6,A

MOVA,R4

ADDCA,R4

DAA

MOVR4,A

MOVA,R3

ADDCA,R3

DAA

MOVR3,A

MOVA,R2

ADDCA,R2

DAA

MOVR2,A

DJNZR5,LOOP

RET

;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------

DIVIDE: MOVA,R3

ANLA,#0FH

MOV46H,A

MOVA,R3

ANLA,#0F0H

SWAPA

MOV45H,A;時拆字45H放時高位,46H放十低位

MOVA,R4

ANLA,#0FH

MOV48H,A

MOVA,R4

ANLA,#0F0H

SWAPA

MOV47H,A;分拆字47H放分高位,48H放分低位

RET

;------------------------------------延時----------------------------------

DELY10MS:MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

DELAY: MOV74H,#2;延時子程序,12M晶振延時1.002秒

L3: MOV72H,#10

L1: MOV73H,#249

L2: DJNZ73H,L2

LCALLDISPLAY12

LCALLDISPLAY34

JNBDOWN_KEY,OFFALARM1

LJMPS3

OFFALARM1: LCALLDELY10MS

JBDOWN_KEY,S3

S4: JNBDOWN_KEY,S4

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S3: DJNZ72H,L1

DJNZ74H,L3

RET

NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;碼表

END

㈩ 用單片機實現一個門鈴控制,編寫一控製程序,門鈴功能(匯編控製程序或者C控製程序)。

單片機(Microcontrollers)誕生於1971年,經歷了SCM、MCU、SoC三大階段,早期的SCM單片機都是8位或4位的。其中最成功的是INTEL的8051,此後在8051上發展出了MCS51系列MCU系統。基於這一系統的單片機系統直到現在還在廣泛使用。隨著工業控制領域要求的提高,開始出現了16位單片機,但因為性價比不理想並未得到很廣泛的應用。90年代後隨著消費電子產品大發展,單片機技術得到了巨大提高。隨著INTEL i960系列特別是後來的ARM系列的廣泛應用,32位單片機迅速取代16位單片機的高端地位,並且進入主流市場。
而傳統的8位單片機的性能也得到了飛速提高,處理能力比起80年代提高了數百倍。高端的32位Soc單片機主頻已經超過300MHz,性能直追90年代中期的專用處理器,而普通的型號出廠價格跌落至1美元,最高端的型號也只有10美元。
當代單片機系統已經不再只在裸機環境下開發和使用,大量專用的嵌入式操作系統被廣泛應用在全系列的單片機上。而在作為掌上電腦和手機核心處理的高端單片機甚至可以直接使用專用的Windows和Linux操作系統。

閱讀全文

與單片機B1H相關的資料

熱點內容
單片機編程取反 瀏覽:889
51單片機課程設計課題 瀏覽:895
手機淘寶登錄怎麼加密碼 瀏覽:481
linux快捷方式圖標 瀏覽:35
陽光車險的app叫什麼名字 瀏覽:461
購買單片機的器件時需要給商家啥 瀏覽:534
並行編譯技術的發展 瀏覽:549
阿里雲伺服器安裝管理 瀏覽:550
java手機開發教程 瀏覽:674
我的世界怎麼刪除伺服器數據 瀏覽:671
linux內存子系統 瀏覽:972
加密思維幣 瀏覽:690
魅族訪客文件夾 瀏覽:52
添加的文件夾怎麼找 瀏覽:617
程序員涉黃 瀏覽:700
maven編譯resources下的js 瀏覽:521
ubuntu文件移動命令 瀏覽:229
安卓i怎麼查找蘋果手機 瀏覽:951
雲伺服器宕機概率 瀏覽:232
在線買葯用什麼app知乎 瀏覽:815