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