單片機(jī)被廣泛應(yīng)用于工業(yè)控制,家電,消費(fèi)電子,醫(yī)療電子,儀表測(cè)量等領(lǐng)域,為應(yīng)廣大初級(jí)電子工程師/單片機(jī)愛(ài)好者之需,電子發(fā)燒友隆重策劃整合推出《單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解》系列技術(shù)文章,以后會(huì)陸續(xù)推出其他章節(jié),敬請(qǐng)廣大工程師朋友繼續(xù)關(guān)注和留意。
一、關(guān)于C51單片機(jī)的中斷號(hào)以及中斷向量
1、中斷號(hào)
2、interrupt 和 using 在C51中斷中的使用
8051 系列 MCU 的基本結(jié)構(gòu)包括:32 個(gè) I/O 口(4 組8 bit 端口);兩個(gè)16 位定時(shí)計(jì)數(shù)器;全雙工串行通信;6 個(gè)中斷源(2 個(gè)外部中斷、2 個(gè)定時(shí)/計(jì)數(shù)器中斷、1 個(gè)串口輸入/輸出中斷),兩級(jí)中斷優(yōu)先級(jí);128 字節(jié)內(nèi)置RAM;獨(dú)立的 64K 字節(jié)可尋址數(shù)據(jù)和代碼區(qū)。中斷發(fā)生后,MCU 轉(zhuǎn)到 5 個(gè)中斷入口處之一,然后執(zhí)行相應(yīng)的中斷服務(wù)處理程序。中斷程序的入口地址被編譯器放在中斷向量中,中斷向量位于程序代碼段的最低地址處,注意這里的串口輸入/輸出中斷共用一個(gè)中斷向量。8051的中斷向量表如下:
二、CPU與單片機(jī)的復(fù)位電路的作用及基本復(fù)位方式
在上電或復(fù)位過(guò)程中,控制CPU的復(fù)位狀態(tài):這段時(shí)間內(nèi)讓CPU保持復(fù)位狀態(tài),而不是一上電或剛復(fù)位完畢就工作,防止CPU發(fā)出錯(cuò)誤的指令、執(zhí)行錯(cuò)誤操作,也可以提高電磁兼容性能。
無(wú)論用戶使用哪種類型的單片機(jī),總要涉及到單片機(jī)復(fù)位電路的設(shè)計(jì)。而單片機(jī)復(fù)位電路設(shè)計(jì)的好壞,直接影響到整個(gè)系統(tǒng)工作的可靠性。許多用戶在設(shè)計(jì)完單片機(jī)系統(tǒng),并在實(shí)驗(yàn)室調(diào)試成功后,在現(xiàn)場(chǎng)卻出現(xiàn)了“死機(jī)”、“程序走飛”等現(xiàn)象,這主要是單片機(jī)的復(fù)位電路設(shè)計(jì)不可靠引起的。
基本的復(fù)位方式
單片機(jī)在啟動(dòng)時(shí)都需要復(fù)位,以使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初態(tài)開(kāi)始工作。89系列單片機(jī)的復(fù)位信號(hào)是從RST引腳輸入到芯片內(nèi)的施密特觸發(fā)器中的。當(dāng)系統(tǒng)處于正常工作狀態(tài)時(shí),且振蕩器穩(wěn)定后,如果RST引腳上有一個(gè)高電平并維持2個(gè)機(jī)器周期(24個(gè)振蕩周期)以上,則CPU就可以響應(yīng)并將系統(tǒng)復(fù)位。單片機(jī)系統(tǒng)的復(fù)位方式有:手動(dòng)按鈕復(fù)位和上電復(fù)位。
1、手動(dòng)按鈕復(fù)位
手動(dòng)按鈕復(fù)位需要人為在復(fù)位輸入端RST上加入高電平(圖1)。一般采用的辦法是在RST端和正電源Vcc之間接一個(gè)按鈕。當(dāng)人為按下按鈕時(shí),則Vcc的+5V電平就會(huì)直接加到RST端。手動(dòng)按鈕復(fù)位的電路如所示。由于人的動(dòng)作再快也會(huì)使按鈕保持接通達(dá)數(shù)十毫秒,所以,完全能夠滿足復(fù)位的時(shí)間要求。
圖1
2、上電復(fù)位
AT89C51的上電復(fù)位電路如圖2所示,只要在RST復(fù)位輸入引腳上接一電容至Vcc端,下接一個(gè)電阻到地即可。對(duì)于CMOS型單片機(jī),由于在RST端內(nèi)部有一個(gè)下拉電阻,故可將外部電阻去掉,而將外接電容減至1?F。上電復(fù)位的工作過(guò)程是在加電時(shí),復(fù)位電路通過(guò)電 容加給RST端一個(gè)短暫的高電平信號(hào),此高電平信號(hào)隨著Vcc對(duì)電容的充電過(guò)程而逐漸回落,即RST端的高電平持續(xù)時(shí)間取決于電容的充電時(shí)間。為了保證系統(tǒng)能夠可靠地復(fù)位,RST端的高電平信號(hào)必須維持足夠長(zhǎng)的時(shí)間。上電時(shí),Vcc的上升時(shí)間約為10ms,而振蕩器的起振時(shí)間取決于振蕩頻率,如晶振頻率為10MHz,起振時(shí)間為1ms;晶振頻率為1MHz,起振時(shí)間則為10ms。在圖2的復(fù)位電路中,當(dāng)Vcc掉電時(shí),必然會(huì)使RST端電壓迅速下降到0V以下,但是,由于內(nèi)部電路的限制作用,這個(gè)負(fù)電壓將不會(huì)對(duì)器件產(chǎn)生損害。另外,在復(fù)位期間,端口引腳處于隨機(jī)狀態(tài),復(fù)位后,系統(tǒng)將端口置為全“l(fā)”態(tài)。如果系統(tǒng)在上電時(shí)得不到有效的復(fù)位,則程序計(jì)數(shù)器PC將得不到一個(gè)合適的初值,因此,CPU可能會(huì)從一個(gè)未被定義的位置開(kāi)始執(zhí)行程序。
圖2
3、積分型上電復(fù)位
常用的上電或開(kāi)關(guān)復(fù)位電路如圖3所示。上電后,由于電容C3的充電和反相門(mén)的作用,使RST持續(xù)一段時(shí)間的高電平。當(dāng)單片機(jī)已在運(yùn)行當(dāng)中時(shí),按下復(fù)位鍵K后松開(kāi),也能使RST為一段時(shí)間的高電平,從而實(shí)現(xiàn)上電或開(kāi)關(guān)復(fù)位的操作。
根據(jù)實(shí)際操作的經(jīng)驗(yàn),下面給出這種復(fù)位電路的電容、電阻參考值。
圖3中:C:=1uF,Rl=lk,R2=10k
圖3 積分型上電復(fù)位電路
三、單片機(jī)雙機(jī)并行通信中所遇問(wèn)題
1 引言
本系統(tǒng)采用的CPLD為 ATMEL公司生產(chǎn)的ATF1540AS器件,該器件是一種高性能、高密度復(fù)合可編程邏輯器件,簡(jiǎn)稱CPLD,它利用ATMEL 的電可擦除存儲(chǔ)器技術(shù),有 64個(gè)邏輯宏單元和68個(gè)I/O端口,很容易和多個(gè)TTL、SSI、MSI、LSI和經(jīng)典的PLDS組合使用。每個(gè)宏單元包括積項(xiàng)和積項(xiàng)多路選擇器、 OR/XOR/CASCADE邏輯、觸發(fā)器、輸出選擇和使能、輸入邏輯陣列五個(gè)部分。ATF1504AS的增強(qiáng)選路開(kāi)關(guān)增加了可用的門(mén)計(jì)數(shù),提高了管腳鎖存設(shè)計(jì)修改的成功率。
圖1 雙機(jī)通信框圖
2 系統(tǒng)結(jié)構(gòu)
系統(tǒng)的CPU采用W77E58,由ATF1504AS構(gòu)成通信接口,系統(tǒng)框圖如圖1所示。
2.1 問(wèn)題提出
電腦刺繡機(jī)為達(dá)到良好的人機(jī)界面交互功能,采用上下位機(jī)方式,下位機(jī)主要進(jìn)行繡花動(dòng)作的控制,上位機(jī)主要進(jìn)行花樣的跟蹤。為了實(shí)現(xiàn)繡花的同時(shí)在液晶屏上進(jìn)行繡花跟蹤,單CPU方式存在系統(tǒng)資源透支, CPU處理數(shù)據(jù)將十分困難,于是提出了采用雙CPU的工作方式,但同時(shí)帶來(lái)一個(gè)問(wèn)題—雙CPU的通信問(wèn)題。
?
2.2 解決方案
(1) 采用串行通信方式
優(yōu)點(diǎn):在由單片機(jī)組成的多機(jī)方式中,串行接口方式是最常用的。串行通信方式接口電路簡(jiǎn)單,可以方便實(shí)現(xiàn)長(zhǎng)距離傳輸??垢蓴_能力比較好。
缺點(diǎn):傳輸數(shù)據(jù)慢,不適合實(shí)時(shí)數(shù)據(jù)傳輸。在數(shù)據(jù)傳輸要求高的情況下,容易造成瓶頸堵塞現(xiàn)象。
(2) 采用并行通信方式
優(yōu)點(diǎn):并行通信傳輸數(shù)據(jù)快,適合進(jìn)行實(shí)時(shí)控制。
缺點(diǎn):抗干擾能力差,不適合長(zhǎng)距離傳輸,最大距離不超過(guò)5m。
由于本系統(tǒng)對(duì)數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性要求比較高,并且上下位機(jī)之間的距離不超過(guò)3m,進(jìn)行適當(dāng)?shù)目垢蓴_措施,完全可以達(dá)到系統(tǒng)的要求,所以確定采用并行通信方式。
2.3 具體措施
(1) 采用ATF1504AS(可編程邏輯器件)進(jìn)行并行通信,減少分立器件所產(chǎn)生的雜散電容而帶來(lái)的噪聲干擾。
?。?) 在輸入數(shù)據(jù)端加斯密特電路(74LS14),將外部傳輸線上耦合噪聲濾除掉。從而提高總線接收的抗干擾性能。
?。?) 采用三態(tài)門(mén)驅(qū)動(dòng)方式可以提高總線的抗干擾能力,因?yàn)槿龖B(tài)門(mén)有三種狀態(tài)輸出,既所謂的低阻高電平、低阻低電平、高阻態(tài)(禁態(tài))。由于三態(tài)門(mén)的輸入具有的三態(tài)性,所以使三態(tài)門(mén)的信號(hào)源的負(fù)擔(dān)減輕。有利于提高速度和抗干擾能力。
3 雙CPU通信原理設(shè)計(jì)
3.1 雙CPU通信原理圖
從圖2雙CPU通信原理圖中可以看出,在輸入接口上都接上74LS14斯密特電路和74LS244三態(tài)門(mén)驅(qū)動(dòng)器,以提高抗干擾能力。在SRZB、SCYX(上位機(jī))及SRZB、SCYX(下位機(jī))的握手信號(hào)線上接入74LS14斯密特電路,以提高抗干擾能力。
圖2 雙機(jī)通信原理圖
3.2 ATF1504AS內(nèi)部原理圖
由于篇幅有限,僅列出上位機(jī)的ATF1504AS的內(nèi)部原理圖如圖3,下位機(jī)的ATF1504AS的內(nèi)部原理圖與此相類似。
圖3 ATF1504AS內(nèi)部原理圖
4 系統(tǒng)工作原理
4.1 上位機(jī)輸入數(shù)據(jù)
如圖3所示。在輸入數(shù)據(jù)以前,通過(guò)對(duì)U1(74173)給U2(D觸發(fā)器)進(jìn)行初始化,即對(duì)U2的CLRN端輸入一上升沿的脈沖,使U2清零。此時(shí)上位機(jī) SRYX端為低電平,ZDQQ端為高電平。此時(shí)為接收數(shù)據(jù)做好準(zhǔn)備。當(dāng)下位機(jī)接收到上位機(jī)的SRYX端輸出的低電平時(shí),就可以發(fā)送數(shù)據(jù)到鎖存器中,緊接著給上位機(jī)的SRZB端輸出一個(gè)上升沿脈沖,U2的Q端(SRYX端)輸出正脈沖,ZDQQ端經(jīng)過(guò)反相器輸出負(fù)脈沖。上位機(jī)在檢測(cè)到ZDQQ端為低電平時(shí),將數(shù)據(jù)線上的數(shù)據(jù)取出。緊接著通過(guò)對(duì)UI給U2進(jìn)行進(jìn)行初始化,完成對(duì)一個(gè)字節(jié)的讀取,并為讀取下一個(gè)字節(jié)做好準(zhǔn)備。上位機(jī)輸入數(shù)據(jù)信號(hào)波形圖如圖5所示。
圖4 上位機(jī)輸出數(shù)據(jù)時(shí)信號(hào)波形圖
圖5 上位機(jī)輸入數(shù)據(jù)時(shí)信號(hào)波形圖
4.2 上位機(jī)輸出數(shù)據(jù)
如圖3所示在輸出數(shù)據(jù)以前,通過(guò)對(duì)U1 (74173)給U3(D觸發(fā)器)進(jìn)行初始化,即對(duì)U3的PRN端輸入一上升沿的脈沖,使U3輸出置1。此時(shí)上位機(jī)的SCZB端經(jīng)反相器輸出低電平,U3 的Q端為高電平。此時(shí)為發(fā)送數(shù)據(jù)做好準(zhǔn)備。當(dāng)上位機(jī)的SCYX端接收輸入的上升沿脈沖時(shí),U3的Q端為低電平,當(dāng)CPU檢測(cè)到Q端為低電平時(shí),就可以發(fā)送數(shù)據(jù)到鎖存器中,緊接著通過(guò)上位機(jī)的SCZB端向下位機(jī)SRZB端輸出一個(gè)上升沿脈沖。表示已發(fā)送數(shù)據(jù),接著通過(guò)對(duì)U1給U2進(jìn)行進(jìn)行初始化。完成對(duì)一個(gè)字節(jié)的輸出,并為輸出下一個(gè)字節(jié)做好準(zhǔn)備,上位機(jī)輸出數(shù)據(jù)信號(hào)波形圖如圖4所示。
5 軟件設(shè)計(jì)
5.1 程序流程設(shè)計(jì)
圖6示出輸入數(shù)據(jù)流程圖,圖7示出輸出數(shù)據(jù)流程圖。
圖6 輸入數(shù)據(jù)流程
圖7 數(shù)據(jù)輸出程序流程圖
5.2 部分程序清單
?。?) 輸入數(shù)據(jù)程序清單
ORG 0000H
JMP START
ORG 0003H
JMP RESEVE
START: MOV TCON,#0 ;設(shè)置中斷INT0
MOV TMOD,#11H
CALL SZSRDK ;設(shè)置輸入端口
MOV IE,#81H
MOV IP,#1 ;開(kāi)中斷
。.
。.
。.
RESEVE: CLR EA ;開(kāi)中斷
PUSH PSW
PUSH DPH
PUSH DPL
RESEV1: JB ZDQQ,RESEV1
;判ZDQQ是否為低
MOV DPTR,#ADDR0
;為U5(輸入數(shù)據(jù)端口)的地址
MOVX A, @DPTR
。.
。.
CALL SZSRDK
POP DPL
POP DPH
POP PSW
SETB EA
RETI
SZSRDK: CLRN EQU 2CH.0
CLR CLRN ;
MOV DPTR,#ADDR1
;為U1的地址
MOV A,2CH
MOVX @DPTR,A
SETB CLRN
MOV A,2CH
MOV DPTR,#ADDR1
MOVX @DPTR,A
RET
(2) 輸出數(shù)據(jù)程序清單
SEND: MOV DPTR,#ADDR3
MOVX A,@DPTR
JB ACC.0,SEND
;為U3的Q端輸出
MOV DPTR,#ADDR4
;為U4(輸出端口)的地址
MOVX @DPTR,A
CALL SZSCDK
RET
SZSCDK: PRN EQU 2CH.1
SETB PRN
MOV DPTR,#ADDR1
;為U1的地址
MOV A,2CH
MOVX @DPTR,A
CLR PRN
MOV DPTR,#ADDR1
MOV A,2CH
MOVX @DPTR,A
RET
6 結(jié)束語(yǔ)
設(shè)計(jì)中采用了AT1504AS器件,該器件實(shí)現(xiàn)了硬件設(shè)計(jì)軟件化,方便了硬件設(shè)計(jì),縮短了設(shè)計(jì)周期,降低了設(shè)計(jì)成本,應(yīng)用也十分方便,該系統(tǒng)經(jīng)過(guò)采取以上措施后,以達(dá)到最初的設(shè)計(jì)要求?,F(xiàn)產(chǎn)品已投放市場(chǎng),市場(chǎng)的反映良好。
四、PIC單片機(jī)軟件開(kāi)發(fā)技巧
項(xiàng)目是有關(guān)機(jī)器人控制的實(shí)現(xiàn)??刂撇糠植捎肞IC16F7X系列單片機(jī),運(yùn)用匯編語(yǔ)言編程,運(yùn)行速度較快,能夠達(dá)到系統(tǒng)的要求。
在這里使用的大多是數(shù)字信號(hào)的控制,電機(jī)的控制只有開(kāi)和合兩種狀態(tài)。在動(dòng)作的過(guò)程中需要兩只手臂、身體、頭部、腳部等的協(xié)調(diào)動(dòng)作。整個(gè)控制系統(tǒng)比較復(fù)雜,因而在PIC程序編寫(xiě)和空間分配方面需要注意一些問(wèn)題。
1 動(dòng)作標(biāo)志位的使用
在整個(gè)控制中,組合的動(dòng)作很多,當(dāng)所有動(dòng)作定位都通過(guò)光電開(kāi)關(guān)控制時(shí),在程序編寫(xiě)上就有一些問(wèn)題。如要求左手上升到鼓掌位、右手上升到舉手位(手初始位置在最下的放下位),光電開(kāi)關(guān)0有效(即為0時(shí)是擋住),到達(dá)正確位置。用簡(jiǎn)單的理解可以寫(xiě)成下面的程序:
list P=16c73
call lefthandup
call righthandup
LO call readinsignal
bdss csl_v,1efthandligbts
call lefthandstop
btfsc csl_v,righthandlight4
goto L0
call righthandstop
L1 call readinsignal
btfsc csl_v,lefthandlight3
goto L1
call lefthandstop
:
lefthandlight表示光電開(kāi)關(guān),由此判斷是否到相應(yīng)的位置。1表示在手臂最下面的位置;2表示在手臂的握手位置;3表示在手臂的鼓掌位置;4表示在手臂的高舉手位置。上面程序描寫(xiě)左手臂上升到舉手位置和右手臂上升到鼓掌位置并停止的過(guò)程。先判斷左手到達(dá)否,到達(dá)則左手停止,接著看右手是否到達(dá)舉手位,到達(dá)則停止,否則循環(huán)上述的檢測(cè),直到左手到達(dá)鼓掌位,右手到達(dá)舉手位。
注意,這里的3,4表示的就是鼓掌位,舉手位。經(jīng)過(guò)循環(huán)檢測(cè)可以讓手臂停在各位上,然而機(jī)械動(dòng)作是有慣性的,機(jī)械停止位可能在該位的上一點(diǎn)或下一點(diǎn),這就影響下面動(dòng)作的進(jìn)行,可能在若干動(dòng)作后機(jī)械動(dòng)作出現(xiàn)失常,也就是程序沒(méi)法正常的運(yùn)行。在此情況下,需要修改程序的編寫(xiě)方式,采用標(biāo)志位來(lái)控制動(dòng)作的進(jìn)行。如果采用控制標(biāo)志位,一定要在動(dòng)作子函數(shù)中對(duì)標(biāo)志位置零。程序如下:
list p=16c73
?。?/p>
actlonstopflag equ Ox6e ;位定義
lefthandfla8 cqu 0x0 ;0表示停止左手動(dòng)作
rightbandflag equ Oxl ;O表示停止右手動(dòng)作
?。?/p>
movlw Ox03
movWf actionstopflag
call lefthanduo
call righthandup
L2 call readinsignal
btfss csl_v,lefthandhght3
call lefthatldotop
btfss csl_v,righthandlight4
call righthandstop
movlw Ox00
subwf actionstopflag,w
btfss status,z
goto L2
繼續(xù)下面的程序
actionstopflag表示動(dòng)作標(biāo)志位參數(shù),給動(dòng)作標(biāo)志位賦值,動(dòng)作停止函數(shù)中將清零標(biāo)志位的值。上述程序和前面所述程序的功能一樣,實(shí)現(xiàn)兩支手臂的動(dòng)作。上面程序描寫(xiě)左手是否到達(dá)鼓掌位,到達(dá)停止,右手是否到達(dá)舉手位,到達(dá)停止??磩?dòng)作標(biāo)志位是否為零,不是,不斷地循環(huán)檢測(cè);是,執(zhí)行下面的程序。
2 GOTO,cALL指令的不同使用
在PIC的匯編程序中,CALL與GOT0指冷使用的場(chǎng)合不同。一般情況下,在于程序與主程序之間大多用CALL指令;而狀態(tài)轉(zhuǎn)換模塊之間大多用GOTO指令,即由此狀態(tài)進(jìn)入另一種狀態(tài)不需返回。由于PIC單片機(jī)的堆棧有限,在程序中,不能無(wú)止境地使用GOTO語(yǔ)句,這樣會(huì)使堆棧溢出,程序無(wú)法正常運(yùn)行。各個(gè)小程序內(nèi)部循環(huán)占用堆棧的級(jí)數(shù)不多,使用GOTO指令是可行的,但在大的程序中用GOTO則無(wú)法返回到調(diào)用前程序的下一條指令。CALL指令完成調(diào)用完子程序后返回到調(diào)用前的程序。程序如下:
list D=16c76
start:ca11 setcpu
call automatlsn、statel
L3 call readinsignal
btfsc cs2_v,ultrasonicdetectl
goto L3
goto autonatlsmstate2
?。?/p>
automatlsmstate2:
return
auatomatismstatel、automatismstate2表示兩種狀態(tài),uhrasonicdetectl表示一個(gè)輸入超聲檢測(cè)信號(hào)。上面程序描寫(xiě)調(diào)用automatistmstate1狀態(tài),執(zhí)行完后進(jìn)行下面的檢測(cè)ultrasonicdetect],沒(méi)有觸發(fā)就一直循環(huán)檢測(cè),觸發(fā)就進(jìn)入autornatismstate2狀態(tài),執(zhí)行完也不再回到下面的程序。
3 狀態(tài)標(biāo)志位Z、C的不同使用情況
在進(jìn)行判斷標(biāo)志位時(shí),Z(零標(biāo)志)、C(借位標(biāo)志)是不同的。Z為l時(shí),表示上面的結(jié)果為0,Z為0時(shí),則結(jié)果不為0。C為l時(shí),借位,C為0時(shí),沒(méi)有借位。在使用定時(shí)器的時(shí)候,一般使用C標(biāo)志位,這是由于當(dāng)完成某一動(dòng)作去檢查定時(shí)器時(shí),時(shí)間可能沒(méi)到,或是正好,或是已經(jīng)超過(guò)時(shí)間,只要到了或超過(guò)時(shí)間,都要按照要求關(guān)閉定時(shí)器,如下面程序所述。如果用Z標(biāo)志位,等于0時(shí)可能沒(méi)有檢測(cè)到,無(wú)法判斷停止的狀態(tài),而用z可以很好地控制時(shí)間定時(shí)。進(jìn)行一般的計(jì)算時(shí)大多用Z,如前面的動(dòng)作標(biāo)志位中就是如此使用的。
list D=16c76
call opentimerO
L4 movlw d’30’
subwf t0_v2,W
btfss status,c
goto L4
cau closetimer0
程序檢測(cè)時(shí)間是否到達(dá)1.5s,沒(méi)有則循環(huán)等待,到了或檢測(cè)時(shí)間過(guò)了就關(guān)閉定時(shí)器,執(zhí)行下面的程序。
總之,在PIC單片機(jī)的編程中采用合適的方法,可以使整個(gè)程序運(yùn)行穩(wěn)定,而且程序空間的使用也將有所減小,避免了調(diào)試中的Bug。這是筆者在實(shí)際中的一點(diǎn)體會(huì),還有許多不足或沒(méi)有考慮到的問(wèn)題,希望在和大家的探討中不斷學(xué)習(xí)PIC單片機(jī)的精髓。
評(píng)論