1 前言
單片微型計(jì)算機(jī)簡(jiǎn)稱單片機(jī),又稱微控制器(MCU),它的出現(xiàn)是計(jì)算機(jī)發(fā)展史上的一個(gè)重要的里程碑,它以體積小、功能全、性價(jià)比高等諸多優(yōu)點(diǎn)獨(dú)具特色,在工業(yè)控制、尖端武器、通信設(shè)備、信息處理、家用電器等嵌入式應(yīng)用領(lǐng)域中獨(dú)占鰲頭。
本次課設(shè)采用的STC89C51單片機(jī)是51系列單片機(jī)的一種代表,目前51系列單片機(jī)是國(guó)內(nèi)目前應(yīng)用最廣泛的一種單片機(jī)之一。單片機(jī)以其系統(tǒng)硬件構(gòu)架完整、價(jià)格低廉、學(xué)生能動(dòng)手等特點(diǎn),成為工科學(xué)生硬件設(shè)計(jì)的基礎(chǔ)課。
2 單片機(jī)系統(tǒng)板的介紹
本次課設(shè)所使用的單片機(jī)最小系統(tǒng)板包括以下器件:電源端子(DC +5V),可以USB供電,也可獨(dú)立電源供電。通用異步串口,采用MAX232做電平轉(zhuǎn)換。STC89C51單片機(jī),支持串口下載和單步調(diào)試 ZLG7290管理芯片,是IIC總線通信的鍵盤掃描和數(shù)碼管顯示芯片,自帶8M晶振,最多可掃描64個(gè)鍵盤和8個(gè)數(shù)碼管。各種顏色的LED發(fā)光二極管共9個(gè),其中8個(gè)接于P1口做LED顯示,還有一個(gè)做電源燈顯示。TLC549,8位串行AD。TLC5615,10位串行DA。還有其他電阻電容若干,系統(tǒng)板一個(gè),大按鍵開(kāi)關(guān)兩個(gè),用于中斷控制和通信開(kāi)關(guān)。
利用STC51系列特有的ISP在線編程,方便我們初學(xué)者的二次開(kāi)發(fā),省去大量芯片燒寫時(shí)間。USB電源線供電和外接供電并存,方便學(xué)生在寢室使用。電源保護(hù)電路,有效防止電源接反對(duì)CPU造成的損害。增加專門的鍵盤掃描和數(shù)碼管顯示芯片,只占用2個(gè)I/O口和一個(gè)外部中斷就能完成8個(gè)數(shù)碼管顯示和最多64個(gè)鍵盤掃描。增加了I/O口鍵盤掃描,2種掃描方式可通過(guò)跳線由用戶自己選擇。所有I/O口均用引腳引出,方便用戶擴(kuò)展。外部中斷0和外部脈沖記數(shù)按鍵復(fù)用,通過(guò)跳線,用戶即可以進(jìn)行外部中斷實(shí)驗(yàn),也可以進(jìn)行外部T0記數(shù)實(shí)驗(yàn)。增加了串行的AD和DA芯片,可直接在開(kāi)發(fā)板上進(jìn)行AD和DA的實(shí)驗(yàn)。
3 有效值測(cè)量程序流程圖
本次課設(shè)的任務(wù)是利用自己親手做的單片機(jī)最小系統(tǒng),通過(guò)編程和調(diào)試,實(shí)現(xiàn)正弦波的有效值測(cè)量,并用數(shù)碼管將測(cè)量的有效值顯示出來(lái)。其過(guò)程是先通過(guò)A/D采樣取出最大值,然后根據(jù)定義計(jì)算出有效值,通過(guò)進(jìn)制轉(zhuǎn)換將16進(jìn)制轉(zhuǎn)換稱10進(jìn)制BCD碼,把查表得到的碼形值通過(guò)STC89C51單片機(jī)的IIC總線方式寫到ZLG7290中用數(shù)碼管顯示,流程圖如圖3.1所示。
圖3.1 有效值測(cè)量程序流程圖
4 A/D轉(zhuǎn)換部分
本次課設(shè)的任務(wù)是實(shí)現(xiàn)正弦波有效值的測(cè)量,一般有效值的測(cè)量主要有平均值法峰值法,真有效值轉(zhuǎn)換芯片測(cè)量等方法。本次課程設(shè)計(jì)采用TI公司的串行A/D轉(zhuǎn)換芯片TLC549測(cè)量交流信號(hào),再根據(jù)有效值的定義式求得其有效值。
4.1 TLC549功能簡(jiǎn)介
TLC549 是以8 位開(kāi)關(guān)電容逐次逼近A/D 轉(zhuǎn)換器為基礎(chǔ)而構(gòu)造的CMOS A/D 轉(zhuǎn)換器。它設(shè)計(jì)成能通過(guò)3 態(tài)數(shù)據(jù)輸出和模擬輸入與微處理器或外圍設(shè)備串行接口。TLC549 僅用輸入/輸出時(shí) 鐘 (I/O CLOCK )和芯片選擇 (CS )輸入作數(shù)據(jù)控制。TLC549 的I/O CLOCK 輸入頻率最高可達(dá) 1.1MHz。轉(zhuǎn)換結(jié)果有DOUT腳讀出。其外圍管腳如圖4.1所示。
圖4.1 TLC549的外圍管腳圖
當(dāng)輸入的模擬電壓大于REF+端電壓時(shí),TCL549輸出為FFH,當(dāng)輸入的模擬電壓小于REF-端電壓時(shí),TCL549輸出00H。使用時(shí)通常將REF-端與GND相連。TCL549的工作時(shí)序如圖4.2所示。
圖4.2 TCL549的工作時(shí)序圖
端為高電平時(shí),DOUT端為高阻態(tài)。當(dāng) 跳變?yōu)榈碗娖浇?jīng)過(guò)1.7us后,上次轉(zhuǎn)換結(jié)果的D7位被放置在DOUT端。在隨后的4個(gè)I/O CLOCK的下降沿,分別輸出D6、D5、D4、D3位。在輸出D3位的同時(shí),啟動(dòng)片內(nèi)采樣電路,對(duì)模擬輸入采樣,在其后的3個(gè)I/O CLOCK的下降沿,分別輸出D2、D1、D0位,第8個(gè)I/O CLOCK的下降沿啟動(dòng)片內(nèi)的保持電路,在DOUT端輸出的數(shù)據(jù)無(wú)效。此后,應(yīng)將 端拉為高電平,并至少保持17us,以使TLC549完成一次A/D轉(zhuǎn)換。重復(fù)上述過(guò)程可讀出本次轉(zhuǎn)換的結(jié)果,其過(guò)程如圖4.3所示。圖4.3 AD轉(zhuǎn)換原理框圖
若定義STC89C51單片機(jī)的P1.2口為片選信號(hào)控制,P1.3口為A/D轉(zhuǎn)換后輸出結(jié)果讀取端,P1.4口為TLC549的時(shí)鐘輸入端,則TCL549與單片機(jī)的硬件連接如圖4.4所示。
圖4.4 TCL549與單片機(jī)的硬件連接
4.2 A/D轉(zhuǎn)換的驅(qū)動(dòng)程序
AD:MOV R2,#08H ;第一次采樣CLOCK的8個(gè)脈沖
CLR P1.2 ;CS變?yōu)榈碗娖?/p>
NOP
NOP
NOP
L 3:MOV C,P1.3 ;對(duì)模擬輸入采樣,讀出結(jié)果OUT
MOV A,20H
RLC A
MOV 20H,A
LCALL PULSE ;調(diào)用產(chǎn)生CLK時(shí)鐘脈沖子程序
DJNZ R2,L3
MOV R2,#24H ;A/D轉(zhuǎn)換的36個(gè)時(shí)鐘周期
SETB P1.2 ;CS變?yōu)楦唠娖?開(kāi)始保持和轉(zhuǎn)換
L 4:LCALL PULSE
DJNZ R2,L4
RET
PULSE:SETB P1.4 ;p1.4輸出高電平,CLOCK時(shí)鐘
NOP
NOP
NOP
CLR P1.4
RET
5 有效值的計(jì)算
根據(jù)有效值的定義,有效值等于最大值除以 ,為了計(jì)算方便,程序中取 為1.414,A/D轉(zhuǎn)換輸出的結(jié)果(設(shè)為M)是16進(jìn)制的數(shù),最大為#0FFH,對(duì)應(yīng)的是基準(zhǔn)電壓,約為4.2V,所以每個(gè)十六進(jìn)制的單位1對(duì)應(yīng)的電壓是 ,有效值為 。在實(shí)驗(yàn)程序中先取出采樣結(jié)果M,然后乘以12(即#0CH),再將所得的結(jié)果(也是十六進(jìn)制)轉(zhuǎn)換成十進(jìn)制BCD碼,其計(jì)算和轉(zhuǎn)換的流程圖如圖5.1所示。圖5.1 有效值計(jì)算的流程圖
按照上面介紹的有效值近似計(jì)算方法和結(jié)果進(jìn)制轉(zhuǎn)換的過(guò)程,可以編寫出計(jì)算有效值的實(shí)驗(yàn)程序如下:
MOV A,21H ;A/D轉(zhuǎn)換的結(jié)果存于21H中
MOV B,#0CH
MUL AB
MOV 39H,B ;得到的新的16進(jìn)制數(shù)高字節(jié)放39H中,低字節(jié)放40H中
MOV 40H,A
HUAN:MOV A,39H ;將存放于39H單元中待轉(zhuǎn)換的16進(jìn)制數(shù)高字節(jié)存于A
MOV B,#0AH
DIV AB
MOV 41H,A ;商送41H單元暫存
MOV A,B ;余數(shù)送回A
MOV 42H,40H ;待變換16進(jìn)制數(shù)的低字節(jié)送42H單元暫存
ANL 42H,#0F0H ;屏蔽低半字節(jié)
ADD A,42H ;高字節(jié)除#0AH后余數(shù)與低字節(jié)的前半字節(jié)相加,
;后半字節(jié)換位使上次除法余數(shù)仍在高位
SWAP A
MOV B,#0AH
DIV AB
MOV 43H,A ;商送43H單元暫存
MOV A,B ;余數(shù)送到A
SWAP A ;使余數(shù)處在高半字節(jié)位數(shù)
ANL 40H,#0FH ;屏蔽待轉(zhuǎn)換數(shù)低字節(jié)的高半字節(jié)
ADD A,40H
MOV B,#0AH
DIV AB
MOV 7FH,B ;得到待轉(zhuǎn)換的最低位的BCD碼值
MOV 44H,A ;商送44H單元暫存
MOV A,41H
SWAP A
ADD A,43H
MOV B,#0AH
DIV AB
MOV 41H,A
MOV A,B
SWAP A
ADD A,44H
MOV B,#0AH
DIV AB
MOV 42H,A ;以上是將前面計(jì)算所得到的商再除以#0AH,
;以得到倒數(shù)第二位的BCD碼值
MOV 7EH,B
MOV A,41H
SWAP A
ADD A,42H
MOV B,#0EH
DIV AB
MOV 7DH,B
MOV 7CH,A
RET
6 顯示部分
6.1 ZLG7290介紹
本次課程設(shè)計(jì)的單片機(jī)系統(tǒng)板采用ZLG7290管理芯片來(lái)控制鍵盤和LED數(shù)碼管,ZLG7290芯片負(fù)責(zé)LED顯示及鍵盤掃描,它與單片機(jī)采用IIC總線方式進(jìn)行通信。ZLG7290的IIC接口傳輸速率可達(dá)32kbit/s, 容易與處理器接口,并提供鍵盤中斷信號(hào),提高主處理器時(shí)間效率.ZLG7290的從地址(slave address)為70H(01110000B).
ZLG7290 內(nèi)可通過(guò)IIC總線訪問(wèn)的寄存器地址范圍為 00H到17H,任一寄存器都可按字節(jié)直接讀寫,也可以通過(guò)命令接口間接讀寫或按位讀寫。它的控制和狀態(tài)查詢?nèi)慷际峭ㄟ^(guò)讀/寫寄存器實(shí)現(xiàn)的,用戶只需像讀24C02內(nèi)的單元一樣,即可實(shí)現(xiàn)對(duì)ZLG7290 的控制。ZLG7290與數(shù)碼管的連接如圖6.1所示。其中ZLG7290的引腳SCL和SDA分別與STC89C51單片機(jī)的P1.0和P1.1相連,實(shí)現(xiàn)IIC總線方式通信。
圖6.1 ZLG7290與數(shù)碼管的連接圖
6.2 IIC通信的原理
通信總線是串行傳輸總線,通過(guò)定義單片機(jī)兩根引腳(串行時(shí)鐘線SCL和串行數(shù)據(jù)線SDA)能實(shí)現(xiàn)全雙工同步數(shù)據(jù)傳送。在數(shù)據(jù)傳輸時(shí),發(fā)送開(kāi)始后,主器件送出8位控制字節(jié),以選擇從器件并控制總線傳送方向,其后再傳送數(shù)據(jù)。每傳送完一個(gè)字節(jié)后,接收器都必須發(fā)一位應(yīng)答信號(hào)ACK,發(fā)送器確定后,再發(fā)下一數(shù)據(jù)。每一數(shù)據(jù)都是先發(fā)高位,再發(fā)低位,在全部數(shù)據(jù)傳送結(jié)束后主控制器發(fā)送停止信號(hào)。還要注意寫時(shí)鐘SCL和SDA的發(fā)送起始和停止條件程序時(shí),要根據(jù)單片機(jī)晶振來(lái)確定NOP指令條數(shù),由于我們用的外部時(shí)鐘晶振是11.0592M,需要四個(gè)NOP指令。 通信程序設(shè)計(jì)流程圖如圖6.2所示。圖6.2
通信程序設(shè)計(jì)流程圖6.3 ZLG7290的驅(qū)動(dòng)程序
ZLG7290與單片機(jī)是通過(guò)IIC總線方式通信的,所以只需要一根數(shù)據(jù)線和一根時(shí)鐘線即可完成通信。而在通信之前和之后需要編寫滿足起始和停止條件的程序,為保證數(shù)據(jù)成功傳輸,要有發(fā)送應(yīng)答位和非應(yīng)答位子程序。實(shí)驗(yàn)程序如下:
多個(gè)字節(jié)數(shù)據(jù)發(fā)送子程序:
WRNBYT: PUSH PSW
WRNBYT1: SETB RS0
SETB RS1
CALL STA
MOV A,SLA
CALL WRB
CALL CACK
JB F0,WRNBYT
MOV R0,#MTD
MOV R5,NUMBYT
WRDA: MOV A,@R0
LCALL WRB
LCALL CACK
JB F0,WRNBYT1
INC R0
DJNZ R5,WRDA
LCALL STOP
POP PSW
RET
發(fā)送一個(gè)字節(jié)子程序:
WRB: MOV R7,#8
WLP: RLC A
JC WR1
CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7,WLP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7,WLP
RET
應(yīng)答位檢查子程序:
CACK: SETB SDA
SETB SCL
NOP
NOP
MOV C,SDA
MOV F0,C
CLR SCL
NOP
NOP
RET
發(fā)送起始位子程序:
STA: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
發(fā)送停止位子程序:
STOP: CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
7 刷新頻率的計(jì)算
刷新頻率即數(shù)據(jù)更新一次所需要的時(shí)間,也就是一個(gè)完整的抽樣周期。在一個(gè)抽樣周期內(nèi)完成很多個(gè)A/D轉(zhuǎn)換的抽樣取值,抽樣的次數(shù)由R3和R4確定,程序中R3為#0AH,R4等于#0C8H,所以抽樣次數(shù)為2000次,即每進(jìn)行2000次A/D轉(zhuǎn)換之后取出最大值,并且計(jì)算出有效值加以顯示,然后進(jìn)行下一輪抽樣,也是取2000次/AD轉(zhuǎn)換的最大值,并且計(jì)算出有效值加以顯示(這樣顯示的數(shù)據(jù)就得到了更新)。
而這2000次的A/D轉(zhuǎn)換中每?jī)纱蜛/D轉(zhuǎn)換的之間的間隔時(shí)間由定時(shí)器決定,由于TH0為#0FFH,TL0為#0A4H,所以每次AD抽樣間隔約為100us,這樣每一輪AD轉(zhuǎn)換之后取最大值計(jì)算出有效值并顯示的時(shí)間間隔約為200ms。
8 誤差分析
通過(guò)單片機(jī)測(cè)量有效值的方法有多種,如利用有效值的定義式
通過(guò)積分來(lái)求,以 為采樣間隔對(duì) 連續(xù)采樣轉(zhuǎn)換N次,且 ,則有式中
為各采樣值的瞬時(shí)值,就其原理而言,在不考慮AD轉(zhuǎn)換精度的情況下,只要保證采樣時(shí)間間隔 的準(zhǔn)確度,得到的有效值即具有較高的精度。但是此方法要求的程序比較復(fù)雜,而且計(jì)算轉(zhuǎn)換過(guò)程較多,為了使實(shí)驗(yàn)程序簡(jiǎn)單易懂而精度要求在允許的誤差范圍內(nèi),我們采用一種近似算法,也就是取最大值,然后除以 得到有效值。經(jīng)過(guò)反復(fù)實(shí)驗(yàn)采集數(shù)據(jù)分析,得到誤差分析如表1所示。
表1 測(cè)量差誤分析
單 位:V | 一組 | 二組 | 三組 | 四組 | 五組 | 六組 | 七組 | 八組 | 九組 | 十組 |
輸入電壓 | 0.36 | 0.76 | 1.32 | 1.56 | 1.88 | 2.28 | 2.6 | 3.0 | 3.32 | 3.72 |
實(shí)際有效值 | 0.27 | 0.54 | 0.9 | 1.12 | 1.41 | 1.69 | 1.94 | 2.24 | 2.51 | 2.81 |
測(cè)量有效值 | 0.28 | 0.56 | 0.94 | 1.18 | 1.47 | 1.70 | 1.96 | 2.23 | 2.52 | 2.96 |
誤 差 | 3.6% | 3.6% | 4.3% | 5.1% | 4.1% | 0.6% | 1.0% | 0.4% | 0.4% | 5.1% |
本次實(shí)驗(yàn)的AD轉(zhuǎn)換芯片輸入的基準(zhǔn)電壓約為4.2V,測(cè)量的正弦波信號(hào)的最大值不得超過(guò)4V,由實(shí)驗(yàn)結(jié)果可知,當(dāng)輸入的信號(hào)的最大值越接近基準(zhǔn)電壓,其測(cè)量結(jié)果誤差越大。
9 小結(jié)與體會(huì)
通過(guò)這次單片機(jī)課程設(shè)計(jì),使我的編程能力得到了很大的提高,在大腦里面形成了初步的體系結(jié)構(gòu),以致于在編程時(shí)能夠靈活的運(yùn)用和變更?;仡櫿麄€(gè)設(shè)計(jì)過(guò)程,從硬件焊接到軟件編程,從小程序的編寫調(diào)試到整個(gè)單片機(jī)功能的了解,從分析到實(shí)際運(yùn)用,都經(jīng)過(guò)了許多思考過(guò)程。
剛開(kāi)始對(duì)整個(gè)系統(tǒng)板不是很熟悉,有很多芯片的用法都了解,以至于編程調(diào)試時(shí)遇到了很多的困難,失敗了很多次。后來(lái)上網(wǎng)查資料和一些技術(shù)文獻(xiàn),在圖書館借了很多有關(guān)單片機(jī)的書,慢慢分析調(diào)試,最后問(wèn)題都一一解決了??偨Y(jié)下來(lái),這三周學(xué)會(huì)了很多東西,例如知道了在編寫大程序的時(shí)候要把握一些原則,要不然很容易出錯(cuò),而且很難查出錯(cuò)在哪里,還學(xué)會(huì)了ZLG7290鍵盤和數(shù)碼管管理芯片的使用,以及A/D轉(zhuǎn)換芯片TLC549的使用和驅(qū)動(dòng)程序的編寫,覺(jué)得自己的專業(yè)知識(shí)又得到了豐富。
參考文獻(xiàn)
[1] 李群芳主編.單片微型計(jì)算機(jī)與接口技術(shù).北京:電子工業(yè)出版社,2005
[2] 宋 浩主編.單片機(jī)原理及應(yīng)用.北京:清華大學(xué)出版社,2005
[3] 凌玉華編著.單片機(jī)原理及應(yīng)用系統(tǒng)設(shè)計(jì).北京:中南大學(xué)出版社,2006
[4] 蔣力培編著.單片微機(jī)系統(tǒng)實(shí)用教程.北京:機(jī)械工業(yè)出版社,2004
[5] 潘 昊編著.單片機(jī)十六進(jìn)制數(shù)與BCD碼轉(zhuǎn)換新探討(摘要),1997
[6] 佟為明主編. TLC549在交流有效值測(cè)量中的應(yīng)用(摘要),2006
附錄一 設(shè)計(jì)總體電路圖
附錄二 設(shè)計(jì)總程序
NUMBYT EQU 5DH ;發(fā)送的個(gè)數(shù),包括第一位地址
SLA EQU 5EH ;控制字或7290的地址
MTD EQU 5FH ;7290存“顯示的數(shù)字”的寄存器的地址10H
SCL EQU P1.0 ;時(shí)鐘脈沖
SDA EQU P1.1 ;發(fā)送數(shù)據(jù)
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV SP,#30H
MOV 21H,#0
MOV R3,#0AH
MOV R4,#0C8H
LCALL AD
MOV TMOD,#01H
MOV TH0,#0FFH
MOV TL0,#0A4H
SETB EA
SETB ET0
SS: SETB TR0
JNB TF0,$
CLR TF0
LCALL AD
MOV A,21H
CJNE A,20H,SS2
JMP SS3
SS2: JNC SS3
XCH A,20H
MOV 21H,A
SS3: MOV TH0,#0FFH
MOV TL0,#0A4H
DJNZ R4,SS
MOV R4,#0C8H
DJNZ R3,SS
MOV A,21H
MOV B,#0CH
MUL AB
MOV 39H,B
MOV 40H,A
LCALL HUAN
LCALL MA
LCALL XIAN
MOV TH0,#0FFH
MOV TL0,#0A4H
MOV 21H,#0
MOV R3,#0AH
MOV R4,#0C8H
SJMP SS
查表程序
MA: MOV DPTR,#TAB
MOV R0,#7FH
MOV A,@R0
MOVC A,@A+DPTR
MOV 60H,A
DEC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 61H,A
DEC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 62H,A
MOV DPTR,#TAB1
DEC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 63H,A
RET
TAB:DB
0FCH,60H,0DAH,0F2H,66H,
0B6H,0BEH,0E0H,0FEH,0E6H
TAB1:DB 0FDH,61H,0DBH,0F3H,67H,0B7H,
0BFH,0E1H,0FFH,0E7H
進(jìn)制轉(zhuǎn)換程序
HUAN:MOV A,39H
MOV B,#0AH
DIV AB
MOV 41H,A
MOV A,B
MOV 42H,40H
ANL 42H,#0F0H
ADD A,42H
SWAP A
MOV B,#0AH
DIV AB
MOV 43H,A
MOV A,B
SWAP A
ANL 40H,#0FH
ADD A,40H
MOV B,#0AH
DIV AB
MOV 7FH,B
MOV 44H,A
MOV A,41H
SWAP A
ADD A,43H
MOV B,#0AH
DIV AB
MOV 41H,A
MOV A,B
SWAP A
ADD A,44H
MOV B,#0AH
DIV AB
MOV 42H,A
MOV 7EH,B
MOV A,41H
SWAP A
ADD A,42H
MOV B,#0AH
DIV AB
MOV 7DH,B
MOV 7CH,A
RET
單片機(jī)讀A/D轉(zhuǎn)換結(jié)果
AD: MOV R2,#08H
CLR P1.2
NOP
NOP
NOP
L3:MOV C,P1.3
MOV A,20H
RLC A
MOV 20H,A
LCALL PULSE
DJNZ R2,L3
MOV R2,#24H
SETB P1.2
L4: LCALL PULSE
DJNZ R2,L4
RET
PULSE: SETB P1.4
NOP
NOP
NOP
CLR P1.4
RET
顯示子程序
XIAN:: MOV MTD,#10H
MOV NUMBYT,#05H
MOV SLA,#70H
LCALL WRNBYT
RET
WRNBYT: PUSH PSW
WRNBYT1:SETB RS0
SETB RS1
CALL STA
MOV A,SLA
CALL WRB
CALL CACK
JB F0,WRNBYT
MOV R0,#MTD
MOV R5,NUMBYT
WRDA: MOV A,@R0
LCALL WRB
LCALL CACK
JB F0,WRNBYT1
INC R0
DJNZ R5,WRDA
LCALL STOP
POP PSW
RET
WRB: MOV R7,#8
WLP: RLC A
JC WR1
CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R7,WLP
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7,WLP
RET
CACK:SETB SDA
SETB SCL
NOP
NOP
MOV C,SDA
MOV F0,C
CLR SCL
NOP
NOP
RET
STA: SETB SDA 發(fā)送起始位
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
STOP:CLR SDA 發(fā)送停止位
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
END
聯(lián)系客服