前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇單片機c語言范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。
C是一種編譯型語言.有高級語言的特點,并具備匯編語言的功能,移植性能好,便于自頂向下結構化程序設計,C語言在單片機中的應用,給開發者帶來了很大的方便.軟件開發者不需要對單片機硬件的結構有很深人的了解,編譯器可以自動完成變量存儲單元的分配.使得單片機的程序設計更加簡單可靠。指針、地址、數組及其相互關系是C語言中最有特色的部分。在編寫單片機的應用程序時,常常需要對端口及存儲單元進行尋址.因此,掌握指針在這些尋址過程的工作原理是很有必要的,這有利于編寫靈活高效的程序。
一、指針結構聲明
C語言中,對于指針的聲明采用如下形式:類型標識符*指針變量名;由于單片機存儲區的關系,所以單片機C語言的指針聲明格式有別于普通C語言指針的聲明格式,其格式為:
類型標識符[存儲區類型]
指針變量名[指針變量存儲區類型]
單片機C語言的指針的定義比普通C語言指針的定義多兩個部分:存儲區類型是指指針變量所指向的數據的存儲區,可以是所有的數據存儲類型;指針變量存儲區類型是指指針變量的存放區域的數據,可以是data、ldata、xdata或pdata如下聲明:
unsigned char xdata *data yc;
上聲明語句是指在RAM(data)內聲明一指針變量yc,該指針變量指向一無符號字符型數據,該無符號型字符存在xdata區內。 該指針變量的應用格式如下:
unsigned char xdata indata[6];
unsigned char xdata *data yc;
yc=indata;
其編譯后的的匯編為:MOV 08H,#00H;0x08和0x09是在片內RAM存儲區分配的yc指針變量的地址空間。
二、指針尋址的實現
單片機C語言的數組的尋址和普通C語言的尋址基本上是一樣的,只是當數組存儲在片內時,由于片內RAM資源十分有限,所以很難有比較復雜的數據結構,而且在編程過程中也盡量避免在片內RAM中使用較大的數組。
1.指向data區的指針尋址的實現
這是最基本的尋址方法,比如一個檢測系統中,通過A/D轉換把外部數據輸入單片機中,單片機對這6次采樣數據求和,具體程序如下:
unsigned char data inputdata[6];
unsigned int data sum,i;
unsigned char data * data yc;
void main()
{ sum=0;
collectdata( );/*采集數據函數,輸入到數組inputdata中*/
yc=inputdata;
for(i=0;i
sum+=*yc;
}
2.指向程序存儲區的指針尋址實現
指針指向數據存儲區其其實質就是C語言中指向函數的指針這一概念,可以利用這種指針來實現函數指針調用函數。指向函數的指針變量定義格式為:類型標識符(*指針變量名)([參數1],[參數2]……);定義好后用(*指針變量名)([參數],[參數]……)即可調用這個函數。例如,主程序中要引用一個鍵盤掃描函數scan,程序如下所示:
Void scan()
Void main()
{ void (*yc)();
Yc=scan;
For(;;)
{(*yc)( );}
}
三、C51熱啟動代碼的編制
對于工業控制計算機,往往設有看門狗電路,當看門狗動作使計算機復位,這就是熱啟動。熱啟動時,一般不允許從頭開始,這將導致現有的已測量到或計算到的值復位,導致系統工作異常。因而在程序中必須判斷是熱啟動還是冷啟動,常用的方法是:確定某內存單位為標志位(如0x7f位和0x7e位),啟動時首先讀該內存單元的內容,如果它等于一個特定的值(例如兩個內存單元的都是0xaa),就認為是熱啟動,否則就是冷啟動,程序執行初始化部份,并將0xaa賦與這兩個內存單元。
根據以上的設計思路,編程時,設置一個指針,讓其指向特定的內存單元如0x7f,然后在程序中判斷,程序如下:
void?main()
{?char?data?*HotPoint=(char?*)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoi-nt)==0xaa))
{?/*熱啟動的處理?*/??}
else
{?HotPoint=0x7e;/*冷啟動的處理*/
*HotPoint=0xaa;
*(++HotPoint)=0xaa;
}
/*正常工作代碼*/
}
然而實際調試中發現,無論是熱啟動還是冷啟動,開機后所有內存單元的值都被復位為0,當然也實現不了熱啟動的要求。這是為什么呢?原來,用C語言編程時,開機時執行的代碼并非是從main()函數的第一句語句開始的,在main()函數的第一句語句執行前要先執行一段“起始代碼”。正是這段代碼執行了清零的工作。C編譯程序提供了這段起始代碼的源程序,名為“startup.a51”,打開這個文件,可以看到如下代碼:
IDATALEN?EQU?80H;the?length?of?IDATA?memory?in?bytes.
STARTUP1:
IF?IDATALEN??0
MOV?R0,#IDATALEN-1
CLR?A
IDATALOOP:MOV?@R0,A
DJNZ?R0,IDATALOOP
ENDIF
可見,在執行到判斷是否熱啟動的代碼之前,起始代碼已將所有內存單元清零。如何解決這個問題呢?好在啟動代碼是可以更改的,方法是:修改startup.a51源文件,然后用編譯程序所附帶的a51.exe程序對startup.a51編譯,得到startup.obj文件,然后用這段代碼代替原來的起始代碼。具體步驟是(設C源程序名為HOTSTART.C):
修改startup.a51源文件(這個文件在C51\LIB目錄下)。
執行如下命令:
A51?startup.a51得到startup.obj文件。將此文件拷入HOTSTART.C所在目錄。
將編好的C源程序用C51.EXE編譯好,得到目標文件HOTSTART.OBJ。
用L51?HOTSTART,STARTUP.OBJ命令連接,得到絕對目標文件HOTSTART。
用OHS51?HOTSTART得到HOTSTART.HEX文件,即可。
對于startup.a51的修改,根據自已的需要進行,如將IDATALEN?EQU?80H中的80H改為70H,就可以使6F到7F的16字節內存不被清零。
四、結束語
單片機C語言的應用是十分靈活的,要充分發揮C語言的優勢,對內外部數據和程序進行方便自如的操作,必須要掌握好指針的應用。
參考文獻
[1]馬忠棒.單片機的C語言應用程序設計[M].北京航空航天大學出版社,2001.
一、c語言與單片機課程在中職學校電子及相關專業中的重要地位
c語言是一種被廣泛使用的計算機程序設計語言,在中職學校引入c語言課程,不但能使學生掌握一種基礎的編程語言,還為學生發展能力和進一步學習打下基礎。
傳統的電子裝置,只能使用復雜的模擬電路或分立的集成電路來實現,這樣的產品不僅體積大,且成本高,控制的精度也不高,適應性更差。有了單片機后,可實現很多復雜的功能。而學好單片機可讓學生在電子行業內找到一個比較好的工作。所以,單片機課程,也常被稱為“飯碗”課程。
二、中職學校“c語言”與“單片機”課程教學方式現狀分析
目前,中職學校中“c語言”與“單片機”課程的教學是采用完全割離的方式進行的,一般在第二學期開設“c語言”,在第四學期開設“單片機”。
在講授“c語言”時,通常以turboc 2.0為藍本,除了介紹“c語言”的數據類型、控制語句、數組、指針外,還對函數、結構體甚至文件進行詳細地介紹。整個教學過程中,過分注重語句、語法的細節和程序設計技巧的講授,對如何分析和解決實際問題講得不夠。從而沒有明確的學習目的,更缺少學習的興趣。
而單片機的教材中,往往以匯編語言做為編程工具,為了能正確地運用匯編語言編寫單片機的程序,就要對單片機內部結構、存儲器結構等知識做詳細介紹。從多年的教學實踐來看,單片機課程講到尋址方式時,就基本上講不下去了,后面的課程,學生只能像聽天書一樣被動地接受。
所以,多年來,學生怕學c語言,更怕學單片機。學過c語言課程的學生,不知道c語言的具體用途,學完后很快就忘記了。學過單片機的學生,感覺單片機內部結構難懂,匯編語言更加難掌握,學到最后,連數碼管、鍵盤這樣的最基本的程序,也無法順利完成。因此,這兩門課程的教學改革,勢在必行。
三、“c語言”與“單片機”課程整合的可行性分析
通過上述對“c語言”與“單片機”本文由收集整理教學現狀的分析,我們發現,之所以這兩門課難教難學,其根本原因在于兩門課教學過程的割裂。
c語言是一門較特別的高級語言,它把高級語言的基本結構和語句與低級語言的實用性結合起來,允許直接訪問物理地址,可直接對硬件進行操作,因此既具有高級語言的功能,又有低級語言的許多功能,能夠像匯編語言一樣對位、字節和地址進行操作。而單片機的指令系統和硬件結構,正是學生最頭疼的內容。而有了c語言這個編程工具后,單片機的學習效率會大大提高。
同時,單片機用c語言編程,繞過了單片機中難學的內容,用c語言編程,驅動單片機裝置,解決了c語言應用抽象的難題,所以,這兩個課程,整合在一起教學,真可謂是“天生一對”!
四、“c語言”與“單片機”課程整合的方法
對c語言與單片機課程的教學過程進行整合,可提高兩門課的學習效果,但整合過程中,要想達到最佳的效果,也要采用正確的方法。
首先,這種整合不是簡單的“一加一”式的整合,不是將兩門課在相對集中的時間內相繼開設,就叫“整合”,而是要以單片機課程做為“主線”,在講授單片機課程的同時,根據編程的需要,不斷地“滲透”c語言的知識。再通過觀察程序驅動硬件的現象,深入體會單片機的原理。
其次,這種整合,也不必追求課時的壓縮,認為既然是“整合”了,效率提高了,就應該體現在課時的減少上,這種想法是錯誤的。所以,建議兩門課程,仍然保持兩個學期的課時量:第一個學期,主要介紹基本知識;第二個學期,可以項目實訓的方式,讓學生完成一些綜合性的實驗,以提高對兩門課程知識的實際運用能力。
五、“c語言”與“單片機”課程整合的實踐與效果
論文摘要:“C程序設計”課程是電子類專業基礎必修課,主要是為單片機編程服務,該課程的教學效果直接影響到后續單片機課程的學習。本文結合單片機系統開發的特點,探討了C程序設計教學方法,為后續單片機課程的學習打下基礎。
隨著微電子技術的發展和廣泛應用,基于單片機上的系統開發,C語言作為一種高級的編程語言,越來越受到人們的關注。現在,無論是嵌入式系統開發企業還是電子設計競賽、畢業設計等,一般都以C語言為主要開發工具。結合單片機的系統資源,用C語言開發符合實際工程需要的單片機系統,對于編程者來說就有重要的意義。
1.C在單片機教學中的地位
C語言作為一種結構化的程序設計語言,它是程序開發工具中使用最廣泛一門編程語言。C語言具有很強的功能性、結構性、可移植性。用C語言編寫程序比匯編更符合人們的思考習慣,程序開發者可以擺脫與硬件不必要的接觸,更專心地考慮程序的功能和算法而不是考慮一些細節問題,這樣就減少了開發和調試的時間。由于它具有良好的程序結構,適用于模塊化程序設計,因此采用C語言設計單片機應用系統程序時,采用結構化的、自頂向下、逐步求精的程序設計方法,將功能模塊化,由不同的模塊完成不同的功能。這樣可使整個應用系統程序結構清晰,易于調試和維護。
2.單片機教學現狀
單片機技術是現代電子工程領域一門飛速發展的技術,是現代電子技術中的一項不可缺少的重要技術。隨著技術的不斷進步和日益普及,單片機技術已滲透到各個領域,影響著我們的日常生活和工作。因此電子技術及相關專業的學生學習單片機技術越來越成為社會發展的需求。當前,各大高校的電子、計算機類專業均開設單片機課程。
《單片機》是我院電子系一門實踐性極強的專業主干課程,是我校電子系重點建設課程之一,是本專業學生的必修課程。為了提高我系單片機教學效果,我們對單片機教學進行了大膽改革,使用C語言開發單片機,且課程的設計打破了學科體系的框架,將單片機和C語言的相關知識和技能按“項目”進行整合,并將《C程序設計》課程列為電子類專業核心基礎課程之一。因此,《C程序設計》課程教學效果的好壞,將直接影響學生后續專業課程的學習。
從近幾年我系《C程序設計》課程的教學效果來看,學生普遍反映該課程的學習比較困難,課程的語法知識較多,理解和記憶都不太容易,即使記住了語法知識也不能靈活應用;不知道學習C語言究竟有何用處,學完C后不能很好地利用C進行單片機小型系統的開發,缺乏知識的靈活應用能力。因此,根據以往單片機教學所得經驗,我覺得教師有必要在《C程序設計》課程的教學過程中在以下幾個方面引起足夠的重視,并在教學中加以改進,為后續單片機課程的學習打下堅實的基礎。
3.《C程序設計》課程教學方法探索
3.1上好每堂課,激發學生的學習興趣
語言程序設計教學被認為是一種需要師生雙方改進的一門課程,因為大多數語言教材中通常先給出一般的語法格式,然后逐步講解語法要點,再給出實例。這種順序灌輸會使學生失去學習的興趣,所以我認為在課堂教學環節應采取以學生為主體、以教師為主導的教學模式,要求學生自己先看有關知識點,并識記。教師采取精講實例,在這過程中引出相關知識點,然后再舉一類似實例讓學生自己分析,鞏固知識點。教師應把主要精力放在算法的分析和各語句語法的具體應用上,同時培養學生自學能力,采取互動機制,迫使學生主動學習。
3.2注重演示,強化實驗,提高實踐操作能力
因為授課對象是一年級新生,所以教師多用通俗易懂的語言進行講解,多舉實例,使學生容易理解和消化。在教學過程中,盡量采用講解、演示方法,如在講解經典算法后,按照理論方法所述,用DEV C++軟件進行編程演示,從而加深學生對教學內容的理解。
在教學過程中,教師應將理論知識與實驗內容進行整合,根據教學內容并結合實際應用設置實驗題目,讓每個學生獨立完成。遇到學生不能解決的問題,教師應利用多媒體進行演示解決問題的過程,從而加深學生對教學內容的理解并提高實踐操作能力。 3.3培養良好的編程風格
3.3.1優化程序
由于在許多工業測控領域中的嵌入式系統都采用單片機開發,它們所需要的計算和控制工作日趨復雜,其中軟件的設計是最復雜和困難的,工作量大,特別是對于控制系統,設計人員需要考慮單片機的軟硬件資源分配,但是單片機系統是一種資源十分有限的系統。這主要表現在CPU和片內結構簡單、程序存儲器資源的不足。因此在用C語言進行單片機開發時,如何使用好這些有限的資源就顯得十分重要。雖然C語言具有許多的優點,但是生成的代碼相對要長,基本多占用存儲空間20%—50%。因而,在“C程序設計”課程教學中,教師不僅要教會學生如何編寫程序,而且應在教學過程中向學生灌輸優化代碼的思想,讓學生從大一開始就有開發項目的一些經驗。
3.3.2合理選用數據類型
C語言在程序開發中提供了的豐富的數據類型,尤其是關于用戶界面開發和一些動畫與圖像技術的實現。但是在開發單片機系統時,我們要按照實際需要,合理地選用數據類型。C語言中有Char等少數的數據類型是機器語言直接支持的數據類型,用此類數據類型的語句所生成的代碼較短,而其它的數據類型如整型、浮點型等數據要有一定的內部程序或內部函數的支持,相對來說較復雜的數據類型的語句生成的代碼也復雜,不利于轉化成單片機的代碼。因此,在“C程序設計“教學過程中,要向學生適當說明選擇合適數據類型的好處,并盡可能地減少程序中使用的數據類型的種類,為以后學生的單片機學習打好基礎。
3.3.3灌輸模塊化程序設計思想
在普通微型計算機上進行C語言程序開發設計時,只需考慮程序功能實現,而不必考慮程序代碼的長短。但是在單片機上進行C語言程序設計就必須考慮系統的硬件資源,要求設計的軟件程序結構是合理、緊湊和高效的。同一任務,有時用主程序完成是合理的,但有時需子程序效率最高,占用資源最少;有時并不是程序的算法越簡單、長度越短越好,由于有一些算法要調用一些內部的子程序和函數,生成的機器代碼質量反而較低。不同的算法對程序代碼效率影響很大。因此,在進行“C程序設計”教學時,教師應適當向學生灌輸模塊化程序設計的思想,在不影響程序功能實現的情況下可以采用一些優化算法,并且把程序分成若干個功能獨立的模塊,為學生今后的單片機項目開發做好鋪墊。
4.結語
單片機系統采用C語言開發與設計,極大地促進了單片機在生產、生活各個領域的應用,提高了程序開發效率。因而,C語言學習效果的好壞,對今后單片機課程的學習具有深遠的影響。除了講解C語言的基本語法外,更重要的是改善教學方法,利用各種方法培養學生的學習興趣,并向學生灌輸良好的編程風格與編程方法,為今后的單片機課程的學習打下良好的基礎。
參考文獻
[1]向艷.“C程序設計”課程教學體系和模式探討[J].計算機教育,2010,(3):112-114.
[2]董蘊寶,潘旭君.淺談C語言在單片機中的程序設計[J].科技信息,2009,(13):59-67.
[3]張洪靜.電類專業C語言教學探討[J].電腦知識與技術,2010,(29):8280-8281.
[4]林益平,趙福建.單片機C語言課程教學的探索與實踐[J].電氣電子教學學報,2007,(2):104-106.
關鍵詞: STC12C5A60S2,PWM,PCM,單片機,語音
1 引言
目前,語音系統越來越廣泛地應用于各個領域。目前常用的方案是采用專用語音集成電路加以單片機控制實現,而這類設計用到的語音芯片一般價格較高,電路的軟硬件設計成本和難度都比較大。如果采用STC12C5A60S2單片機的大容量ROM存儲語音數據,再利用內置的PWM功能,可以方便的將語音信號還原。本文就單片機設計語音功能原理和方法進行詳細介紹。
2 STC12C5A60S2單片機介紹
STC12C5A60S2單片機是宏晶科技生產的單時鐘/機器周期(1T)的單片機,是高速/低功耗/超強抗干擾的新一代51單片機,指令代碼完全兼容傳統8051,但速度快8-12倍。內部擁有高達60K的用戶應用程序空間(ROM),1280字節RAM,集成MAX810專用復位電路,2路PWM,8路高速10位A/D轉換(250K/S)等功能。
STC12C5A60S2單片機集成了兩路可編程計數器陣列(PCA)模塊,可通過程序設定,使其工作于8位PWM模式,它是實現語音輸出的重要部件。大容量的ROM空間適合存儲較長的語音數據,1T高速的運算能力和1KB的RAM為語音解碼輸出提供了保障,所以應用該單片機可以很容易的設計出具備語音功能的系統。
3 單片機實現語音功能的原理
在STC12C5A60S2單片機上實現語音輸出,首先要有供單片機讀取的語音數據,可以借助PC機上的軟件錄制或從現有聲音文件中提取,保存為PCM編碼,8kHz采樣,8位的WAV格式文件。采取這種格式的原因有兩點:一是該采樣速率下可獲得清晰的語音效果,能滿足語音系統的要求,二是和單片機位數以及PWM位數一致,有利于單片機的處理和運算。
PCM是波形編碼技術的一種,特點是比較簡單,語音質量高,缺點就是占用存儲空間較多,如果要實現較長的語音,可采取適當的編碼形式進行壓縮,如ADPCM自適應差分脈沖編碼算法等,在這里限于篇幅不再對語音編解碼知識加以論述,有興趣的讀者可以自己查閱相關資料。
當獲得了WAV文件中的PCM數據后,要把該數據以數組的形式存放,并和單片機程序一道經過C編譯器編譯生成代碼。再通過USART將代碼下載到單片機內部FLASH ROM存儲器中。
單片機對FLASH存儲器中的語音編碼數據進行解碼,在采樣時鐘頻率下,送到內部集成的脈沖寬度調制器PWM中,來控制PWM每個波形的占空比,再通過低通波器濾波,最后經功放單元推動揚聲器發出聲音。
4 系統硬件設計
4.1 系統框圖
系統STC12C5A60S2單片機為核心,按鍵、顯示和低通濾波器等器件共同組成,硬件電路設計簡單,這也是本系統的優點之一,極大程序地節約了硬件成本。
圖1 系統組成框圖
4.2 系統電路圖
圖2 單片機主系統電路圖
圖3 RC低通濾波器
PWM 輸出后須通過低通濾波器濾除高頻噪聲,才能還原成人耳能識別的聲音。低通濾波器的類型和參數取決于聲音的采樣頻率和價格預算。用的最多的要數RC濾波器,這種濾波器的設計簡單成本低廉,即使使用參數不是非常明確的元件也能獲得很好的聲音輸出。
5 系統軟件設計
在主程序設計時,首先要建立一個PWM任務,PWM的輸出頻率要高于定時器中斷頻率,最好兩倍以上,這樣語音輸出混雜的高頻PWM波容易被低通濾波器濾除,使語音信號變得清晰,然后設置一個周期性的定時器中斷程序,在中斷函數里面將語音數據寫入PWM寄存器,來改變PWM 的占空比,中斷周期應和語音數據的采樣周期一致,本系統采用的是8KHz采樣速率的音頻數據,因此定時器的中斷周期應設定為125uS。下面是主程序及定時器中斷程序的設計流程。
圖4 系統主程序流程圖
6 結束語
隨著語音技術應用的越來越廣泛,對語音系統設計要求也越來越高,很多的電子產品要求語音合成集成電路電路簡單,成本低廉,利用STC12C5A60S2單片機內大容量ROM和自帶的PWM可以很好地解決這個問題,而PWM方式進行D/A轉換輸出電壓信號,可以直接輸出語音信號。并且,數字脈沖寬度調制器避免了復雜的模擬電路的設計,降低了設計和生產的難度。所以,PWM方式作為語音合成的輸出具有極大的應用前景。
參考文獻
關鍵詞:C8051F040; CAN總線; 測試模式; CAN控制器
中圖分類號:TN91934文獻標識碼:A文章編號:1004373X(2012)06004302
Research of CAN bus test mode based on C8051F040
ZHANG Hui
(Astronaut Center of China, BeiJing 100094, China)
Abstract: Fieldbus has become the hotspot in the data bus field. CAN bus is recognized to be one of the most prospective fieldbuses. The design and debugging of CAN bus node is the focal point in CAN bus communication system design. The CAN controller integrated in C8051F040 is introduced. A CAN communication node is designed base on C8051F040. The software design program of CAN node test mode is presented. It can be used to test CAN bus modules and save the testing time.
Keywords: C8051F040; CAN bus; test mode; CAN controller
收稿日期:20111015現場總線能同時滿足過程控制和制造業自動化的需求,因而現場總線已成為數據總線領域中最為活躍的一個領域。現場總線的研究和應用已成為數據總線領域的熱點。CAN總線(Controller Area Network)屬于現場總線的范疇,它是一種支持分布式控制和實時控制的串行通信網絡。CAN總線是德國博士公司在20世紀80年代為解決現代汽車中眾多的控制和測試儀器之間的數據通信而開發的一種串行通信協議。由于其高性能、高可靠性、及獨特的設計,CAN總線越來越受到人們的重視,其應用領域不再局限于汽車工業,而向過程工業、機械工業、紡織工業、農用機械、傳感器以及航空航天等領域發展。被公認為最有前途的現場總線之一[1]。
1引言
Cygnal公司開發的51系列單片機C8051F040是完全集成的混合信號系統型微控制器,其上集成可實現全功能CAN的CAN總線控制器,完全符合CAN規范2.0A和2.0B。本文利用C8051F040單片機上集成的CAN控制器,外接一個CAN收發器(PCA82C250)設計了一個CAN通信節點的硬件電路,然后詳細介紹了CAN控制器測試模式的實現,可以應用于CAN通信節點的調試測試。
2C8051F040單片機上集成的CAN控制器
CAN控制器包括CAN核,消息存儲器,消息處理器,控制寄存器和模塊接口等幾部分。CAN核用于協議控制和消息的串并轉換;消息存儲器用于存儲消息對象和標志符;消息處理器用于控制CAN核和消息存儲器之間的數據傳輸;控制寄存器用于控制和配置CAN控制器;模塊接口用于MCU與CAN控制器之間交換數據。C8051F040單片機上集成的CAN控制器的消息存儲器上可以存儲32個消息對象,均可以被配置為發送或接收對象。CAN總線協議處理由CAN控制器獨立完成,不用MCU干預,因此CAN通信占用的CPU帶寬很小,C8051F040集成CAN控制器原理如圖1所示。
3CAN控制器工作模式
C8051F040單片機上集成的CAN控制器主要有2種工作模式:正常工作模式和測試模式。可以通過將CAN控制器寄存器中的Test位置1,進入測試模式。在測試模式下,測試寄存器中的Tx1,Tx0,LBack,Silent以及Basic位均是可寫的。將Test位置0后,測試寄存器的所有功能將被禁止。測試模式又可細分為沉默模式(又叫監測模式)、回送模式、基本模式以及回送和沉默模式結合等4種工作模式。通過將測試寄存器中的Silent位置1,可將CAN核設置為沉默模式。在沉默模式下,CAN核能夠接收有效數據幀和有效遠程幀,但是只能在總線上發送隱性位而不能進行傳輸。圖2為在沉默模式下CAN_TX和CAN_RX信號同CAN核的聯系。通過將測試寄存器的LBack位置1,可以將CAN核設置為回送模式。在回送模式下,CAN核將它發送的消息當作接收到的消息對待,并存儲在接收緩存中。
圖1C8051F040集成CAN控制器原理圖圖3為在回送模式下CAN_TX和CAN_RX信號同CAN核的聯系。通過將LBack和Silent同時置1,可以將回送模式和沉默模式結合。這種模式可以應用于熱自檢,可以在不影響CAN系統運行的情況下,對CAN節點進行自檢。在這種模式下,CAN_RX引腳與CAN核斷開,CAN_TX引腳被保持為隱性位。圖4為在這種模式下CAN_TX和CAN_RX信號同CAN核的聯系。若將測試寄存器中的Basic置1,CAN核便工作于基本模式下。在這種模式下消息存儲器不工作,即不用消息隊列緩存交換數據,而把IF1寄存器用作傳輸緩存,把IF2寄存器用作接收緩存[23]。
圖2在沉默模式下CAN_TX和CAN_RX
信號同CAN核的聯系4CAN通信節點硬件設計
C8051F040上集成的CAN控制器是一個協議控制器,不能提供物理層驅動,需要外接CAN收發器才能掛接在CAN網絡上與其他節點通信。本文采用PCA82C250收發器作為物理層驅動器。若在CAN控制器和PCA82C250之間加入光藕隔離器件可以提高系統的穩定性和可靠性,但這會增加系統的復雜性。本文的目的主要是調試CAN控制器的測試模式,所以沒有使用光藕隔離器件。CAN通信節點原理圖如圖5所示。
圖3在回送模式下CAN_TX和CAN_RX
信號同CAN核的聯系圖4在回送和沉默結合模式下CAN_TX
和CAN_RX信號同CAN核的聯系圖5CAN通信節點原理圖5軟件設計
基于C8051F040的CAN通信節點的軟件設計主要包括3個部分:CAN節點初始化、報文發送和報文接收。熟悉這3部分程序的設計,就能寫出普通的CAN通信程序。
5.1CAN初始化
初始化CAN控制器的一般步驟如下[47]:
(1) 將SFRPAGE寄存器設置為CAN0_PAGE。
(2) 將CAN0CN寄存器的INIT和CCE位設置為“1”。
(3) 設置時序參數。