msp430單片機(jī)入門知識(shí)課件_第1頁
msp430單片機(jī)入門知識(shí)課件_第2頁
msp430單片機(jī)入門知識(shí)課件_第3頁
msp430單片機(jī)入門知識(shí)課件_第4頁
msp430單片機(jī)入門知識(shí)課件_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第一章430單片機(jī)入門基礎(chǔ)第一章430單片機(jī)入門基礎(chǔ)1前沿1、《430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》這本書是我見過的最好的關(guān)于單片機(jī)的書,非常值得逐字逐句的徹底學(xué)習(xí)一遍。2、與51不同,430單片機(jī)是處理器,通過對(duì)比兩者的區(qū)別,可以建立起代碼移植的思想。3、430單片機(jī)屬于混合信號(hào)處理器,資源極其豐富,有利于全面學(xué)習(xí)硬件知識(shí)。2青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)前沿1、《430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》這本書是我見過1.1初識(shí)430單片機(jī)430:低功耗之王,水果電池驅(qū)動(dòng)1、為什么我們?cè)诤豕??凡是以電池為電源的電子設(shè)備都看重低功耗。幾乎所有的單片機(jī)會(huì)標(biāo)榜自己有低功耗方面的設(shè)計(jì)。2、430為什么可以成為低功耗之王?在硬件上,和不用的模塊可以休眠在軟件上,必須設(shè)計(jì)恰當(dāng)?shù)男菝吆蛦拘?30是實(shí)現(xiàn)低功耗的必要條件,非充分條件。3青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1初識(shí)430單片機(jī)430:低功耗之王,水果電池驅(qū)動(dòng)3青1.1.1430單片機(jī)的應(yīng)用前景便攜設(shè)備,高集成度、小型化。野外安置的終身電池設(shè)備。無需額外供電的自供電設(shè)備。高精度測(cè)量、控制領(lǐng)域。當(dāng)普通單片機(jī)用。4青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.1430單片機(jī)的應(yīng)用前景便攜設(shè)備,高集成度、小型化1.1.2430單片機(jī)的特點(diǎn)多時(shí)鐘系統(tǒng)時(shí)鐘、功能模塊時(shí)鐘、休眠喚醒時(shí)鐘軟件設(shè)置時(shí)鐘16位處理器,單指令周期模塊化結(jié)構(gòu)各模塊完全獨(dú)立,不需要干涉避免了與外部模塊復(fù)雜的數(shù)據(jù)通信學(xué)會(huì)最貴的430,等于會(huì)用了全系列4305青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.2430單片機(jī)的特點(diǎn)多時(shí)鐘系統(tǒng)5青島大學(xué)大學(xué)生創(chuàng)采用馮?諾依曼結(jié)構(gòu)(普林斯頓結(jié)構(gòu)),程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址。舉例:實(shí)現(xiàn)存儲(chǔ)器中兩數(shù)據(jù)相乘,要經(jīng)過3個(gè)步驟,通過總線取兩個(gè)數(shù)據(jù)和取出指令(干什么)到。如果是哈佛結(jié)構(gòu),數(shù)據(jù)總線和指令總線分開。430可以在里跑程序,加上具有控制器,可實(shí)現(xiàn)固件更新。中的升級(jí)代碼->復(fù)制到運(yùn)行->擦除>升級(jí)1.1.2430單片機(jī)的特點(diǎn)6青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)采用馮?諾依曼結(jié)構(gòu)(普林斯頓結(jié)構(gòu)),程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)科普:、、、、、存儲(chǔ)器揮發(fā)性存儲(chǔ)器非揮發(fā)性存儲(chǔ)器可擦寫只讀速度最高最貴要定時(shí)刷新紫外線擦寫電擦寫電擦寫計(jì)算機(jī)一二級(jí)緩存計(jì)算機(jī)內(nèi)存條絕種貴,慢前途無量絕種了6個(gè)晶體管構(gòu)成1一個(gè)晶體管+電容充放電

我們現(xiàn)在用的51,都是的,但是內(nèi)部沒有控制器,所以需要存實(shí)時(shí)數(shù)據(jù)。430帶控制器,單片機(jī)自己就能擦寫,所以不用。7青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)科普:、、、、、存儲(chǔ)器揮發(fā)性存儲(chǔ)器非揮發(fā)性存儲(chǔ)器可擦寫只讀速430425A資源8處理速度512(數(shù)據(jù))+16(程序代碼)內(nèi)置控制器,剩余可存數(shù)據(jù)。內(nèi)置時(shí)鐘管理單元,可內(nèi)部倍頻3路同步采樣、差分輸入、32倍程控增益放大器的16位溫度傳感器1.2V基準(zhǔn)源和輸出緩沖器128段驅(qū)動(dòng)器增強(qiáng)串口看門狗定時(shí)器16位定時(shí)器,3路捕獲和2路內(nèi)置復(fù)位電路16個(gè)雙向可中斷口內(nèi)置電能計(jì)量模塊后綴帶A的,比如425A帶硬件乘法器8青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)430425A資源8青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.3430單片機(jī)最小系統(tǒng)一般單片機(jī)最小系統(tǒng)需要什么?電源、晶振、復(fù)位、下載/仿真接口430425自帶片內(nèi)數(shù)控時(shí)鐘(),掉電復(fù)位電路()一般講究一點(diǎn)都需要“電源監(jiān)視芯片”內(nèi)部時(shí)鐘一般不如晶振精確可以外接手表晶振32.768k,然后倍頻、、可下載+調(diào)試,只能下載9青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.3430單片機(jī)最小系統(tǒng)一般單片機(jī)最小系統(tǒng)需要什么?1.2430單片機(jī)開發(fā)軟件入門一般用430軟件工程管理、程序編輯、代碼編譯下載、仿真調(diào)試工程管理:管理外部函數(shù)、頭文件。。。程序編輯:寫代碼編譯:替程序員處理所有打雜的事情>匯編調(diào)試:真正的考驗(yàn)水平的地方,不是所有單片機(jī)都支持調(diào)試,這是要硬件支持的。10青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.2430單片機(jī)開發(fā)軟件入門一般用430軟件10青島大學(xué)全速執(zhí)行、單步執(zhí)行。。。執(zhí)行到光標(biāo)處設(shè)置斷點(diǎn)(在程序中加一個(gè)空操作,然后用來設(shè)斷點(diǎn))查看變量寄存器查看調(diào)用函數(shù)關(guān)系11青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)全速執(zhí)行、單步執(zhí)行。。。11青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3430單片機(jī)C語言基礎(chǔ)C語言、編譯器和機(jī)器碼之間的關(guān)系(){...}C語言源文件編譯器(8086)機(jī)器碼430編譯器430單片機(jī)機(jī)器碼51編譯器51單片機(jī)機(jī)器碼在寫C語言的過程中,盡量消除不同的差異,或者將差異集中到一個(gè)地方做修改,那么就能方便的實(shí)現(xiàn)代碼移植。我們現(xiàn)在寫C程序,就必須按此要求嚴(yán)格要求自己。這樣才能一通百通,才能減少重復(fù)勞動(dòng)。12青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3430單片機(jī)C語言基礎(chǔ)C語言、編譯器和機(jī)器碼之間的關(guān)1.3.1變量我們?yōu)槭裁匆x各種變量?定義短字節(jié)變量有哪些好處和壞處?定義長(zhǎng)字節(jié)變量有哪些好處和壞處?一些特殊的關(guān)鍵字[7]={1,2,3,4,5,6,7}本地全局變量b;不被優(yōu)化c;不對(duì)其初始化為什么要慎重使用全局變量?13青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.1變量我們?yōu)槭裁匆x各種變量?13青島大學(xué)大學(xué)1.3.2數(shù)學(xué)運(yùn)算盡可能避免浮點(diǎn)數(shù)運(yùn)算。運(yùn)算慢、非常慢。占用多。所以應(yīng)盡量避免使用浮點(diǎn)數(shù)。防止定點(diǎn)數(shù)溢出。x;a;*1000和1000都是型,a>65溢出應(yīng)改為*(1000)或()a*100014青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.2數(shù)學(xué)運(yùn)算盡可能避免浮點(diǎn)數(shù)運(yùn)算。14青島大學(xué)大學(xué)小數(shù)的處理例如,溫度的最后計(jì)算公式為:*1.32/1.25-273為避免浮點(diǎn)數(shù)可改為:()*132/125-273如需保留1位小數(shù),則:()*1320/125-2730擴(kuò)大10倍程序中加上明確注釋在顯示時(shí),將小數(shù)點(diǎn)移位即可減小乘除法取平均時(shí),盡量取2、4、8等2次冪,這樣可以用移位代替乘除(可編譯器自動(dòng))后綴帶A的型號(hào)有硬件乘法器(自動(dòng)使用)15青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)小數(shù)的處理15青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.3位操作精簡(jiǎn)指令處理器如何寫口?P2=P2|0x01; 2.0置高按位或P20x01; 一般均簡(jiǎn)寫成這樣P20x01; 2.1置低按位與P2^=0x04; 2.2取反按位異或0 (0x01) 宏定義......P20; 2.0置高P1(123) 1.1P1.2P1.3置低精簡(jiǎn)指令處理器如何讀口?;((P15)0) P20;(P15) P20;(P1(56)) P20;(P15) 1; 讀P1.5值賦給 0;16青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.3位操作精簡(jiǎn)指令處理器如何寫口?16青島大學(xué)大學(xué)1.3.4寄存器操作如何理解寄存器操作?如果設(shè)計(jì)模擬電路算是天才干的事情,那么操作單片機(jī)的寄存器就算是傻瓜干的事情。處理器把能干的事全干了,需要人過問的事情,通過一系列開關(guān)讓人來選擇,所以這是傻瓜就能干的事情越是功能強(qiáng)大的處理器,需要配置的寄存器越多。處理器說明書就是用來查寄存器功能的17青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.4寄存器操作如何理解寄存器操作?17青島大學(xué)大學(xué)宏定義幫助我們理解抽象的數(shù)字查說明書,找到控制串口收發(fā)的是1寄存器的最高兩位,我們可以用下面的賦值。16 開串口收中斷17 開串口發(fā)中斷為便于記憶和理解,頭文件中有如下宏定義:0 (0x40)在430x420 (0x80)頭文件中已有100以后我們接觸高級(jí)處理器的程序中,大部分都是這么寫,不會(huì)像51里面直接寫0x20這樣18青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)宏定義幫助我們理解抽象的數(shù)字查說明書,找到控制串口收發(fā)的是1特別注意:使用“”賦值不會(huì)影響其他位,但要搞清楚是不是要先對(duì)標(biāo)志位清0。例如:控制器輸出模式有3個(gè)控制位,可以表示8種模式。頭文件中定義了07宏定義,000-111。13011...16110實(shí)際效果是111,也就是模式719青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)特別注意:使用“”賦值不會(huì)影響其他位,但要搞清楚是不是要先對(duì)1.3.5中斷中斷的作用是快速響應(yīng)事件430中幾乎所有“資源”都帶中斷,為的是休眠后,喚醒。發(fā)送指令給模塊,然后休眠。模塊執(zhí)行完畢后,中斷喚醒。中斷向量表位于最高段000~0(512B)特別注意!430的中斷沒有中斷嵌套的優(yōu)先級(jí)

() { ... }20青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.5中斷中斷的作用是快速響應(yīng)事件20青島大學(xué)大學(xué)生430x42x頭文件中的中斷向量表 (0*2u) /*00基礎(chǔ)定時(shí)器)2(1*2u)/*02P2*/1(4*2u)/*08P1*/1(5*2u)/*0A1/2*/0(6*2u)/*0A0*/0(8*2u)/*00串口發(fā)送*/0(9*2u)/*02串口接收*/(10*2u)/*04*/16(12*2u)/*0816位*/(14*2u)/*0*/(15*2u)/*0*/21青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)21青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)中斷的具體過程事先將中斷服務(wù)程序入口地址裝入中斷向量表。中斷發(fā)生后,如果中斷被允許(可屏蔽中斷),將當(dāng)前程序地址和狀態(tài)寄存器壓入堆棧。跳轉(zhuǎn)到中斷服務(wù)程序入口,備份寄存器入堆棧。開始執(zhí)行中斷服務(wù)程序。退出中斷前,恢復(fù)寄存器。取回寄存器,跳轉(zhuǎn)回中斷前主程序地址。22青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)中斷的具體過程事先將中斷服務(wù)程序入口地址裝入中斷向量表。22退出中斷時(shí)喚醒進(jìn)中斷前休眠,那么退出中斷后仍然休眠??梢栽谥袛嘧映绦蛑行薷亩褩V械?,使得中斷結(jié)束后,不休眠。

(){ ... ()此函數(shù)經(jīng)匯編優(yōu)化}23青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)退出中斷時(shí)喚醒進(jìn)中斷前休眠,那么退出中斷后仍然休眠。23青島中斷標(biāo)志位同類中斷合并成一個(gè)總的中斷。由軟件判斷中斷標(biāo)志位來確定具體中斷。什么是標(biāo)志位?不急用、待查詢。1P1(){ (P15) {...} (P16) {...} P10;}24青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)中斷標(biāo)志位同類中斷合并成一個(gè)總的中斷。24青島大學(xué)大學(xué)生創(chuàng)1.3.6內(nèi)部函數(shù)頭文件和4300();或0();();();或();();或;();或();(x);()25青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.6內(nèi)部函數(shù)頭文件和43025青島大學(xué)大學(xué)生創(chuàng)新中1.3.7庫函數(shù)430提供100個(gè)庫函數(shù) 字符處理類 數(shù)學(xué)類 輸入和輸出類 通用子程序類 字符串處理類庫函數(shù)是C語言通用的,內(nèi)部函數(shù)與特定處理器有關(guān)。26青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.7庫函數(shù)430提供100個(gè)庫函數(shù)26青島大學(xué)大1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方法是按功能模塊劃分(對(duì)象)。/*DataProcess.c*/intSum(inta,intb,intc){ inty; y=a+b+c; return(y);}floatAverage(inta,intb,intc){ floaty; y=a+b+c; return(y/3);}/*DataProcess.h*/ExternintSum(inta,intb,intc);ExternfloatAverage(inta,c);/*main.c*/#include“DataProcess.h”...voidmain(){ ...Tem=Average(tem1,tem2,tem3);Weight=Sum(W1,W2,W3); ...}27青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方全局變量的處理隸屬關(guān)系模糊的全局變量單獨(dú)建隸屬于某模塊的,寫在模塊c文件中/*global.c*/intBattVoltage;unsignedintSystemStatus;intTemperature;/*global.h*/ExternintBattVoltage;ExternunsignedintSystemStatus;ExternintTemperature;/*DataProcess.c*/UnsignedcharOverflowFlag;intSum(inta,intb,intc){ inty; y=a+b+c; If(y>65535) OverflowFlag=1; return(y);}/*DataProcess.h*/ExternintSum(inta,intb,intc);ExternunsignedcharOverflowFlag;28青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)全局變量的處理隸屬關(guān)系模糊的全局變量單獨(dú)建/*glob1.5代碼優(yōu)化編譯器可自動(dòng)對(duì)代碼進(jìn)行優(yōu)化速度快,但占多速度慢,占少可選優(yōu)化等級(jí),等級(jí)越高,占越小調(diào)試階段最好關(guān)閉優(yōu)化要是不優(yōu)化還有變量改變,則加29青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.5代碼優(yōu)化編譯器可自動(dòng)對(duì)代碼進(jìn)行優(yōu)化29青島大學(xué)大學(xué)1.6風(fēng)格對(duì)于寫程序代碼,有3個(gè)層次首先,計(jì)算機(jī)要能讀其次,要自己能讀最后,要?jiǎng)e人能讀30青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6風(fēng)格對(duì)于寫程序代碼,有3個(gè)層次30青島大學(xué)大學(xué)生創(chuàng)1.6.1變量命名規(guī)則變量名要有含義,不要隨便用變量名最好是名詞詞性,1-4個(gè)單詞每個(gè)單詞首字母大寫;;必須出現(xiàn)空格時(shí),用下劃線代替;;單詞較長(zhǎng),適當(dāng)簡(jiǎn)寫;;多個(gè)模塊都有的變量,按“模塊名_變量名”;1;約定俗成的變量不要改動(dòng)I、j作為循環(huán)變量,p、q作為指針,s、t表示字符串31青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.1變量命名規(guī)則變量名要有含義,不要隨便用31青島大1.6.2函數(shù)命名規(guī)則模塊名_不及物動(dòng)詞模塊名_及物動(dòng)詞+名詞首字母大寫專用名詞全部大寫長(zhǎng)單詞縮寫返回值是布爾型的,對(duì)返回1還是0的表意清晰UnsignedintADC16_Sample();Char LCD_Init();Char RTC_Get();Void PWM_SetPeriod();Void Flash_WriteChar();Void UART_GetChar();Char Key_GetKey();Char TouchPad_GetKey();Transmit TxRecetive RxCount CntTo 2Char UART_CheckTxBuff();//檢查緩沖區(qū)Char UART_IsTxBuffFull();//緩沖區(qū)是否已滿32青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.2函數(shù)命名規(guī)則模塊名_不及物動(dòng)詞Unsigned1.6.3表達(dá)式好的表達(dá)式可以朗讀出來消除歧義,運(yùn)算優(yōu)先級(jí)拿不準(zhǔn)就加括號(hào),表達(dá)式復(fù)雜就拆開。If(UART_IsTxBuffFull()) UART_ClearTxBuff();Else UART_PutChar(0x55);i=5;j=++i; 結(jié)果i=6,j=6 等效于i=5;i=i+1;j=i;i=5;j=i++; 結(jié)果i=6,j=5 等效于i=5;j=i;i=i+1;33青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.3表達(dá)式好的表達(dá)式可以朗讀出來If(UART_1.6.4風(fēng)格一致性For(i=0;i<100;i++){ for(j=0;j<200;j++) { Count++; }}While(a==b){ if(c==d) { Flag=1; } else { Flag=0; }} 34青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.4風(fēng)格一致性For(i=0;i<100;i++)31.6.5注釋注釋不是對(duì)代碼的重復(fù)。要意譯,不要直譯。For(i=6;i>DOT;i--) //從第6位到小數(shù)點(diǎn)依次遞減

{if(DispBuff[i]==0)DispBuff[i]=‘‘;//如果該位數(shù)值是0,則替換成空格else break; //如果不是,則跳出循環(huán)} For(i=6;i>DOT;i--) //對(duì)全部6位顯示數(shù)據(jù)進(jìn)行判斷

{if(DispBuff[i]==0)DispBuff[i]=‘‘;//消隱小數(shù)點(diǎn)前的無效0else break; } 35青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.5注釋注釋不是對(duì)代碼的重復(fù)。要意譯,不要直譯。Fo功能函數(shù)的注釋/***************************************************************************************名稱: LCD_DisplayDigit()*功能:

在LCD上任意位置顯示一個(gè)數(shù)字*入口參數(shù): Digit: 待顯示數(shù)字(0~9)

Location:顯示位置從左至右對(duì)應(yīng)76543210*出口參數(shù):

無*說明:

調(diào)用該函數(shù)不影響LCD其他位的顯示。*范例: LCD_DisplayDigit(3,0); //在第一位(右側(cè)最低位)顯示3 LCD_DisplayDigit(2,1); //在第二位顯示2 LCD_DisplayDigit(1,2); //在第三位顯示1--->顯示結(jié)果:123****************************************************************************************/voidLCD_DisplayDigit(charDigit,charLocation){charDigitSeg; //存放字形筆劃的變量

char*pLCD; //存放LCD顯存指針的變量

DigitSeg=LCD_Tab[Digit]; //得到待顯示數(shù)字的字形筆劃

pLCD=&LCDM1; //獲得LCDM1的地址

pLCD[Location]=DigitSeg;//在LCDM1之后Location個(gè)單元顯示出數(shù)字}

36青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)功能函數(shù)的注釋36青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.6宏定義宏定義給予常數(shù)可讀性宏定義全部大寫,以區(qū)別變量數(shù)據(jù)加括號(hào),注釋使用/**/#defineTXBUFF_SIZE (128) /*發(fā)送緩沖區(qū)大小*/#defineLCD_ROW (128) /*點(diǎn)陣液晶行數(shù)*/#defineLCD_CLUMN (128) /*點(diǎn)陣液晶列數(shù)*/#defineLCD_BUF_SIZE (LCD_CLUMN*LCD_ROW/8) /*點(diǎn)陣液晶緩沖區(qū)大小*/ UnsignedcharTxBuff[TXBUFF_SIZE]; //定義發(fā)送緩沖區(qū)CharIsTxBuffFull(){ if(NumOfTxChars>=TXBUFF_SIZE)return(1); //緩沖區(qū)是否滿? else return(0);}37青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.6宏定義宏定義給予常數(shù)可讀性#defineTXB使用宏定義時(shí),要防止定點(diǎn)數(shù)溢出宏定義的用途廣泛增強(qiáng)程序的可移植性進(jìn)行軟件版本的管理#defineVOLT_RATE (1000) /*比例系數(shù)*/...longVoltage;IntInputValue;...Voltage=InputValue*VOLT_RATE; /*可能溢出*/#defineVOLT_RATE (long(1000)) /*比例系數(shù),強(qiáng)行整成long*/38青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)使用宏定義時(shí),要防止定點(diǎn)數(shù)溢出宏定義的用途廣泛#define1.7 可移植性可移植性是嵌入式軟件設(shè)計(jì)的重要思想用到不同的硬件,比如到數(shù)碼管用到不同的處理器,比如51到430,編程時(shí)應(yīng)盡量消除硬件差異無法消除的差異,集中到小的局部來修改39青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7 可移植性可移植性是嵌入式軟件設(shè)計(jì)的重要思想39青島大1.7.1消除差異例如用宏定義消除口操作的差異此后的程序不用修改,直接用和來操作口#include”MSP430x42x.h”#defineLED_ON P2OUT|=BIT0#defineLED_OFF P2OUT&=~BIT0#include”reg51.h”SbitLED=P2^0;#defineLED_ON P2.0=1;#defineLED_OFF P2.0=0;40青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.1消除差異例如用宏定義消除口操作的差異#inclu1.7.2消除硬件差異用宏定義消除硬件差異例如或數(shù)碼管的口,順序經(jīng)常會(huì)改變/*宏定義,數(shù)碼管a~g、DP各段對(duì)應(yīng)的比特,更換硬件只用改動(dòng)以下8行*/#definea 0x01#defineb 0x02#definec 0x04#defined 0x08#definee 0x10#definef 0x20#defineg 0x40#defineDP 0x80/*宏定義自動(dòng)生成段碼表,不要改動(dòng)*/ConstcharLCD_Tab[]={a+b+c+d+e+f, //0b+c, //1a+b+d+e+g, //2a+b+c+d+g, //3b+c+f+g, //4a+c+d+f+g, //5a+c+d+e+f+g, //6a+b+c, //7a+b+c+d+e+f+g, //8a+b+c+d+f+g, //9}#undefa...41青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.2消除硬件差異用宏定義消除硬件差異/*宏定義,數(shù)碼用函數(shù)來消除硬件差異例如控制電機(jī)的啟和停直流電機(jī)設(shè)置口高低電平即可步進(jìn)電機(jī)要輸出一定規(guī)則的脈沖序列大型交流電機(jī)需要用串口控制變頻器我們把具體操作“封”在函數(shù)里Moter_ON(){ ...}Moter_OFF(){ ...}42青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)用函數(shù)來消除硬件差異例如控制電機(jī)的啟和停Mot1.7.3軟件層次劃分大量復(fù)雜的調(diào)用函數(shù)需要有清晰的層次關(guān)系菜單/人機(jī)界面Key_GetKey();Key_WaitKey();鍵盤緩沖區(qū)【FIFO】定時(shí)掃描并判斷按鍵LCD_Clear();LCD_DisplayNumber();LCD_DisplayDecimal();LCD_InsertChar();LCD_DeleteChar();顯示緩沖區(qū)【數(shù)組】LED定時(shí)循環(huán)掃描LED顯存映射應(yīng)用層功能函數(shù)層硬件隔離層硬件驅(qū)動(dòng)層43青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.3軟件層次劃分大量復(fù)雜的調(diào)用函數(shù)需要有清晰的層次關(guān)應(yīng)用層:最終功能,往往和人的感官有關(guān)功能層:功能函數(shù),表達(dá)具體要干什么硬件隔離層:宏定義、緩沖區(qū)、函數(shù)封裝硬件隔離層(硬件抽象層,)是非常重要的環(huán)節(jié)。功能函數(shù)只操作硬件隔離層的數(shù)據(jù),與具體硬件無關(guān)。硬件驅(qū)動(dòng)層:和具體硬件有關(guān)的代碼,硬件驅(qū)動(dòng)層從硬件隔離層獲得“指示”,或是將“結(jié)果”發(fā)送至硬件隔離層。44青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)應(yīng)用層:最終功能,往往和人的感官有關(guān)44青島大學(xué)大學(xué)生創(chuàng)新軟件劃分層次的好處每個(gè)層的函數(shù)只對(duì)上下層“可見”,這樣設(shè)置好接口參數(shù)后,各單元軟件可獨(dú)立開發(fā)。改動(dòng)硬件時(shí),只需配置相應(yīng)的底層驅(qū)動(dòng),修改硬件隔離層,而整個(gè)大軟件功能可以不變。軟件的可移植性增強(qiáng)。功能層的函數(shù)無需關(guān)心硬件如何實(shí)現(xiàn),以及何時(shí)何處被應(yīng)用層調(diào)用,專心做好自己的事情就行。將大型軟件任務(wù)分塊,團(tuán)隊(duì)合作。只要明確了模塊功能,接口規(guī)范,就能分派任務(wù)。45青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)軟件劃分層次的好處每個(gè)層的函數(shù)只對(duì)上下層“可見”,這樣設(shè)置好1.7.4接口VoidRTC_Tick(intDivSec) //硬件無關(guān)的走時(shí)函數(shù),DivSec入口{charDays; //每月的天數(shù)變量

DSEC++; //定時(shí)中斷加數(shù)DISABLE_INT; //宏定義關(guān)總中斷

If(DSEC>=DivSec) {SECOND++;DSEC=0} //校正中斷時(shí)間If(SECOND>=60) {MINUTE++;SECOND=0}If(MINUTE>=60) {HOUR++;MINUTE=0}If(HOUR>=24) {DATE++;HOUR=0}If(MONTH==2) //閏年判斷{if(YEAR%4==0) Days=29;else Days=28;}else Days=MONTH_Table[MONTH-1]; //月份天數(shù)查表If(DATE>Days) {MONTH++;DATE=1;}If(MONTH>12) {YEAR++;MONTH=1;}If(YEAR>=100) {YEAR=0;} //只顯近百年時(shí)間

RESTORE_INT; //宏定義恢復(fù)中斷}46青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.4接口VoidRTC_Tick(intDivS1.7.5屏蔽一個(gè)好的子函數(shù),應(yīng)消滅細(xì)節(jié)特征,只暴露最基本的要程序員選擇的選項(xiàng)。類似于處理器中,設(shè)置各種特殊功能寄存器。比如,手機(jī)撥號(hào)。手機(jī)和手機(jī)的實(shí)際撥號(hào)過程差異巨大,但是我們看起來的撥號(hào)程序都是一樣操作的。UART_Init(2400,’n’,8,1);//2400比特,無校驗(yàn),8位數(shù)據(jù),1位停止位47青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.5屏蔽一個(gè)好的子函數(shù),應(yīng)消滅細(xì)節(jié)特征,只暴露最基本1.8版本管理如果一個(gè)程序一開始設(shè)計(jì)就有N個(gè)變種(版本),用移植的辦法改寫,變成N種程序是不明智的。因?yàn)榫S護(hù)起來困難。例如,有一個(gè)版本的軟件按鍵帶聲音、另一個(gè)不帶聲音??梢杂煤甓x+條件編譯宏來實(shí)現(xiàn)版本管理。/*********************************Config.h*************************************/#define KEYTONE ON /*是否打開按鍵音*/#define RS485 ON /*是否打開RS485通信口*/#define SCREEN LCD /*顯示屏驅(qū)動(dòng)LED=數(shù)碼管LCD=液晶*/......CharKey_GetKey() //讀鍵盤函數(shù){ charKey Key=Key_ReadFIFO(); //從鍵盤緩沖區(qū)讀一個(gè)按鍵#if(KEYTONE==ON) //KEYTONE打開才編譯下一句 if(Key!=NOKEY)Beep(30); //有效按鍵則蜂鳴30ms#endif return(Key); //返回鍵值}48青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.8版本管理如果一個(gè)程序一開始設(shè)計(jì)就有N個(gè)變種(版本),本章小結(jié)MSP430單片機(jī)的入門知識(shí)特點(diǎn)(低功耗、混合信號(hào))資源與結(jié)構(gòu)(精簡(jiǎn)指令、普林斯頓結(jié)構(gòu))C語言(位操作、寄存器操作、中斷、內(nèi)部函數(shù)、庫函數(shù))軟件工程的共性問題文件管理(拆成小的c程序,頭文件調(diào)用)代碼優(yōu)化(編譯器的作用,先不優(yōu)化)風(fēng)格(命名規(guī)則、表達(dá)式、注釋、宏定義)可移植性(cpu差異、硬件差異、軟件層次、接口、屏蔽)版本管理(宏定義與條件編譯宏)49青島大學(xué)-TI大學(xué)生創(chuàng)新中心傅強(qiáng)本章小結(jié)MSP430單片機(jī)的入門知識(shí)49青島大學(xué)-TI大學(xué)第一章430單片機(jī)入門基礎(chǔ)第一章430單片機(jī)入門基礎(chǔ)50前沿1、《430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》這本書是我見過的最好的關(guān)于單片機(jī)的書,非常值得逐字逐句的徹底學(xué)習(xí)一遍。2、與51不同,430單片機(jī)是處理器,通過對(duì)比兩者的區(qū)別,可以建立起代碼移植的思想。3、430單片機(jī)屬于混合信號(hào)處理器,資源極其豐富,有利于全面學(xué)習(xí)硬件知識(shí)。51青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)前沿1、《430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》這本書是我見過1.1初識(shí)430單片機(jī)430:低功耗之王,水果電池驅(qū)動(dòng)1、為什么我們?cè)诤豕??凡是以電池為電源的電子設(shè)備都看重低功耗。幾乎所有的單片機(jī)會(huì)標(biāo)榜自己有低功耗方面的設(shè)計(jì)。2、430為什么可以成為低功耗之王?在硬件上,和不用的模塊可以休眠在軟件上,必須設(shè)計(jì)恰當(dāng)?shù)男菝吆蛦拘?30是實(shí)現(xiàn)低功耗的必要條件,非充分條件。52青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1初識(shí)430單片機(jī)430:低功耗之王,水果電池驅(qū)動(dòng)3青1.1.1430單片機(jī)的應(yīng)用前景便攜設(shè)備,高集成度、小型化。野外安置的終身電池設(shè)備。無需額外供電的自供電設(shè)備。高精度測(cè)量、控制領(lǐng)域。當(dāng)普通單片機(jī)用。53青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.1430單片機(jī)的應(yīng)用前景便攜設(shè)備,高集成度、小型化1.1.2430單片機(jī)的特點(diǎn)多時(shí)鐘系統(tǒng)時(shí)鐘、功能模塊時(shí)鐘、休眠喚醒時(shí)鐘軟件設(shè)置時(shí)鐘16位處理器,單指令周期模塊化結(jié)構(gòu)各模塊完全獨(dú)立,不需要干涉避免了與外部模塊復(fù)雜的數(shù)據(jù)通信學(xué)會(huì)最貴的430,等于會(huì)用了全系列43054青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.2430單片機(jī)的特點(diǎn)多時(shí)鐘系統(tǒng)5青島大學(xué)大學(xué)生創(chuàng)采用馮?諾依曼結(jié)構(gòu)(普林斯頓結(jié)構(gòu)),程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址。舉例:實(shí)現(xiàn)存儲(chǔ)器中兩數(shù)據(jù)相乘,要經(jīng)過3個(gè)步驟,通過總線取兩個(gè)數(shù)據(jù)和取出指令(干什么)到。如果是哈佛結(jié)構(gòu),數(shù)據(jù)總線和指令總線分開。430可以在里跑程序,加上具有控制器,可實(shí)現(xiàn)固件更新。中的升級(jí)代碼->復(fù)制到運(yùn)行->擦除>升級(jí)1.1.2430單片機(jī)的特點(diǎn)55青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)采用馮?諾依曼結(jié)構(gòu)(普林斯頓結(jié)構(gòu)),程序指令存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)科普:、、、、、存儲(chǔ)器揮發(fā)性存儲(chǔ)器非揮發(fā)性存儲(chǔ)器可擦寫只讀速度最高最貴要定時(shí)刷新紫外線擦寫電擦寫電擦寫計(jì)算機(jī)一二級(jí)緩存計(jì)算機(jī)內(nèi)存條絕種貴,慢前途無量絕種了6個(gè)晶體管構(gòu)成1一個(gè)晶體管+電容充放電

我們現(xiàn)在用的51,都是的,但是內(nèi)部沒有控制器,所以需要存實(shí)時(shí)數(shù)據(jù)。430帶控制器,單片機(jī)自己就能擦寫,所以不用。56青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)科普:、、、、、存儲(chǔ)器揮發(fā)性存儲(chǔ)器非揮發(fā)性存儲(chǔ)器可擦寫只讀速430425A資源8處理速度512(數(shù)據(jù))+16(程序代碼)內(nèi)置控制器,剩余可存數(shù)據(jù)。內(nèi)置時(shí)鐘管理單元,可內(nèi)部倍頻3路同步采樣、差分輸入、32倍程控增益放大器的16位溫度傳感器1.2V基準(zhǔn)源和輸出緩沖器128段驅(qū)動(dòng)器增強(qiáng)串口看門狗定時(shí)器16位定時(shí)器,3路捕獲和2路內(nèi)置復(fù)位電路16個(gè)雙向可中斷口內(nèi)置電能計(jì)量模塊后綴帶A的,比如425A帶硬件乘法器57青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)430425A資源8青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.3430單片機(jī)最小系統(tǒng)一般單片機(jī)最小系統(tǒng)需要什么?電源、晶振、復(fù)位、下載/仿真接口430425自帶片內(nèi)數(shù)控時(shí)鐘(),掉電復(fù)位電路()一般講究一點(diǎn)都需要“電源監(jiān)視芯片”內(nèi)部時(shí)鐘一般不如晶振精確可以外接手表晶振32.768k,然后倍頻、、可下載+調(diào)試,只能下載58青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.1.3430單片機(jī)最小系統(tǒng)一般單片機(jī)最小系統(tǒng)需要什么?1.2430單片機(jī)開發(fā)軟件入門一般用430軟件工程管理、程序編輯、代碼編譯下載、仿真調(diào)試工程管理:管理外部函數(shù)、頭文件。。。程序編輯:寫代碼編譯:替程序員處理所有打雜的事情>匯編調(diào)試:真正的考驗(yàn)水平的地方,不是所有單片機(jī)都支持調(diào)試,這是要硬件支持的。59青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.2430單片機(jī)開發(fā)軟件入門一般用430軟件10青島大學(xué)全速執(zhí)行、單步執(zhí)行。。。執(zhí)行到光標(biāo)處設(shè)置斷點(diǎn)(在程序中加一個(gè)空操作,然后用來設(shè)斷點(diǎn))查看變量寄存器查看調(diào)用函數(shù)關(guān)系60青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)全速執(zhí)行、單步執(zhí)行。。。11青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3430單片機(jī)C語言基礎(chǔ)C語言、編譯器和機(jī)器碼之間的關(guān)系(){...}C語言源文件編譯器(8086)機(jī)器碼430編譯器430單片機(jī)機(jī)器碼51編譯器51單片機(jī)機(jī)器碼在寫C語言的過程中,盡量消除不同的差異,或者將差異集中到一個(gè)地方做修改,那么就能方便的實(shí)現(xiàn)代碼移植。我們現(xiàn)在寫C程序,就必須按此要求嚴(yán)格要求自己。這樣才能一通百通,才能減少重復(fù)勞動(dòng)。61青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3430單片機(jī)C語言基礎(chǔ)C語言、編譯器和機(jī)器碼之間的關(guān)1.3.1變量我們?yōu)槭裁匆x各種變量?定義短字節(jié)變量有哪些好處和壞處?定義長(zhǎng)字節(jié)變量有哪些好處和壞處?一些特殊的關(guān)鍵字[7]={1,2,3,4,5,6,7}本地全局變量b;不被優(yōu)化c;不對(duì)其初始化為什么要慎重使用全局變量?62青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.1變量我們?yōu)槭裁匆x各種變量?13青島大學(xué)大學(xué)1.3.2數(shù)學(xué)運(yùn)算盡可能避免浮點(diǎn)數(shù)運(yùn)算。運(yùn)算慢、非常慢。占用多。所以應(yīng)盡量避免使用浮點(diǎn)數(shù)。防止定點(diǎn)數(shù)溢出。x;a;*1000和1000都是型,a>65溢出應(yīng)改為*(1000)或()a*100063青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.2數(shù)學(xué)運(yùn)算盡可能避免浮點(diǎn)數(shù)運(yùn)算。14青島大學(xué)大學(xué)小數(shù)的處理例如,溫度的最后計(jì)算公式為:*1.32/1.25-273為避免浮點(diǎn)數(shù)可改為:()*132/125-273如需保留1位小數(shù),則:()*1320/125-2730擴(kuò)大10倍程序中加上明確注釋在顯示時(shí),將小數(shù)點(diǎn)移位即可減小乘除法取平均時(shí),盡量取2、4、8等2次冪,這樣可以用移位代替乘除(可編譯器自動(dòng))后綴帶A的型號(hào)有硬件乘法器(自動(dòng)使用)64青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)小數(shù)的處理15青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.3位操作精簡(jiǎn)指令處理器如何寫口?P2=P2|0x01; 2.0置高按位或P20x01; 一般均簡(jiǎn)寫成這樣P20x01; 2.1置低按位與P2^=0x04; 2.2取反按位異或0 (0x01) 宏定義......P20; 2.0置高P1(123) 1.1P1.2P1.3置低精簡(jiǎn)指令處理器如何讀口?;((P15)0) P20;(P15) P20;(P1(56)) P20;(P15) 1; 讀P1.5值賦給 0;65青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.3位操作精簡(jiǎn)指令處理器如何寫口?16青島大學(xué)大學(xué)1.3.4寄存器操作如何理解寄存器操作?如果設(shè)計(jì)模擬電路算是天才干的事情,那么操作單片機(jī)的寄存器就算是傻瓜干的事情。處理器把能干的事全干了,需要人過問的事情,通過一系列開關(guān)讓人來選擇,所以這是傻瓜就能干的事情越是功能強(qiáng)大的處理器,需要配置的寄存器越多。處理器說明書就是用來查寄存器功能的66青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.4寄存器操作如何理解寄存器操作?17青島大學(xué)大學(xué)宏定義幫助我們理解抽象的數(shù)字查說明書,找到控制串口收發(fā)的是1寄存器的最高兩位,我們可以用下面的賦值。16 開串口收中斷17 開串口發(fā)中斷為便于記憶和理解,頭文件中有如下宏定義:0 (0x40)在430x420 (0x80)頭文件中已有100以后我們接觸高級(jí)處理器的程序中,大部分都是這么寫,不會(huì)像51里面直接寫0x20這樣67青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)宏定義幫助我們理解抽象的數(shù)字查說明書,找到控制串口收發(fā)的是1特別注意:使用“”賦值不會(huì)影響其他位,但要搞清楚是不是要先對(duì)標(biāo)志位清0。例如:控制器輸出模式有3個(gè)控制位,可以表示8種模式。頭文件中定義了07宏定義,000-111。13011...16110實(shí)際效果是111,也就是模式768青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)特別注意:使用“”賦值不會(huì)影響其他位,但要搞清楚是不是要先對(duì)1.3.5中斷中斷的作用是快速響應(yīng)事件430中幾乎所有“資源”都帶中斷,為的是休眠后,喚醒。發(fā)送指令給模塊,然后休眠。模塊執(zhí)行完畢后,中斷喚醒。中斷向量表位于最高段000~0(512B)特別注意!430的中斷沒有中斷嵌套的優(yōu)先級(jí)

() { ... }69青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.5中斷中斷的作用是快速響應(yīng)事件20青島大學(xué)大學(xué)生430x42x頭文件中的中斷向量表 (0*2u) /*00基礎(chǔ)定時(shí)器)2(1*2u)/*02P2*/1(4*2u)/*08P1*/1(5*2u)/*0A1/2*/0(6*2u)/*0A0*/0(8*2u)/*00串口發(fā)送*/0(9*2u)/*02串口接收*/(10*2u)/*04*/16(12*2u)/*0816位*/(14*2u)/*0*/(15*2u)/*0*/70青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)21青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)中斷的具體過程事先將中斷服務(wù)程序入口地址裝入中斷向量表。中斷發(fā)生后,如果中斷被允許(可屏蔽中斷),將當(dāng)前程序地址和狀態(tài)寄存器壓入堆棧。跳轉(zhuǎn)到中斷服務(wù)程序入口,備份寄存器入堆棧。開始執(zhí)行中斷服務(wù)程序。退出中斷前,恢復(fù)寄存器。取回寄存器,跳轉(zhuǎn)回中斷前主程序地址。71青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)中斷的具體過程事先將中斷服務(wù)程序入口地址裝入中斷向量表。22退出中斷時(shí)喚醒進(jìn)中斷前休眠,那么退出中斷后仍然休眠??梢栽谥袛嘧映绦蛑行薷亩褩V械?,使得中斷結(jié)束后,不休眠。

(){ ... ()此函數(shù)經(jīng)匯編優(yōu)化}72青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)退出中斷時(shí)喚醒進(jìn)中斷前休眠,那么退出中斷后仍然休眠。23青島中斷標(biāo)志位同類中斷合并成一個(gè)總的中斷。由軟件判斷中斷標(biāo)志位來確定具體中斷。什么是標(biāo)志位?不急用、待查詢。1P1(){ (P15) {...} (P16) {...} P10;}73青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)中斷標(biāo)志位同類中斷合并成一個(gè)總的中斷。24青島大學(xué)大學(xué)生創(chuàng)1.3.6內(nèi)部函數(shù)頭文件和4300();或0();();();或();();或;();或();(x);()74青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.6內(nèi)部函數(shù)頭文件和43025青島大學(xué)大學(xué)生創(chuàng)新中1.3.7庫函數(shù)430提供100個(gè)庫函數(shù) 字符處理類 數(shù)學(xué)類 輸入和輸出類 通用子程序類 字符串處理類庫函數(shù)是C語言通用的,內(nèi)部函數(shù)與特定處理器有關(guān)。75青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.3.7庫函數(shù)430提供100個(gè)庫函數(shù)26青島大學(xué)大1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方法是按功能模塊劃分(對(duì)象)。/*DataProcess.c*/intSum(inta,intb,intc){ inty; y=a+b+c; return(y);}floatAverage(inta,intb,intc){ floaty; y=a+b+c; return(y/3);}/*DataProcess.h*/ExternintSum(inta,intb,intc);ExternfloatAverage(inta,c);/*main.c*/#include“DataProcess.h”...voidmain(){ ...Tem=Average(tem1,tem2,tem3);Weight=Sum(W1,W2,W3); ...}76青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方全局變量的處理隸屬關(guān)系模糊的全局變量單獨(dú)建隸屬于某模塊的,寫在模塊c文件中/*global.c*/intBattVoltage;unsignedintSystemStatus;intTemperature;/*global.h*/ExternintBattVoltage;ExternunsignedintSystemStatus;ExternintTemperature;/*DataProcess.c*/UnsignedcharOverflowFlag;intSum(inta,intb,intc){ inty; y=a+b+c; If(y>65535) OverflowFlag=1; return(y);}/*DataProcess.h*/ExternintSum(inta,intb,intc);ExternunsignedcharOverflowFlag;77青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)全局變量的處理隸屬關(guān)系模糊的全局變量單獨(dú)建/*glob1.5代碼優(yōu)化編譯器可自動(dòng)對(duì)代碼進(jìn)行優(yōu)化速度快,但占多速度慢,占少可選優(yōu)化等級(jí),等級(jí)越高,占越小調(diào)試階段最好關(guān)閉優(yōu)化要是不優(yōu)化還有變量改變,則加78青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.5代碼優(yōu)化編譯器可自動(dòng)對(duì)代碼進(jìn)行優(yōu)化29青島大學(xué)大學(xué)1.6風(fēng)格對(duì)于寫程序代碼,有3個(gè)層次首先,計(jì)算機(jī)要能讀其次,要自己能讀最后,要?jiǎng)e人能讀79青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6風(fēng)格對(duì)于寫程序代碼,有3個(gè)層次30青島大學(xué)大學(xué)生創(chuàng)1.6.1變量命名規(guī)則變量名要有含義,不要隨便用變量名最好是名詞詞性,1-4個(gè)單詞每個(gè)單詞首字母大寫;;必須出現(xiàn)空格時(shí),用下劃線代替;;單詞較長(zhǎng),適當(dāng)簡(jiǎn)寫;;多個(gè)模塊都有的變量,按“模塊名_變量名”;1;約定俗成的變量不要改動(dòng)I、j作為循環(huán)變量,p、q作為指針,s、t表示字符串80青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.1變量命名規(guī)則變量名要有含義,不要隨便用31青島大1.6.2函數(shù)命名規(guī)則模塊名_不及物動(dòng)詞模塊名_及物動(dòng)詞+名詞首字母大寫專用名詞全部大寫長(zhǎng)單詞縮寫返回值是布爾型的,對(duì)返回1還是0的表意清晰UnsignedintADC16_Sample();Char LCD_Init();Char RTC_Get();Void PWM_SetPeriod();Void Flash_WriteChar();Void UART_GetChar();Char Key_GetKey();Char TouchPad_GetKey();Transmit TxRecetive RxCount CntTo 2Char UART_CheckTxBuff();//檢查緩沖區(qū)Char UART_IsTxBuffFull();//緩沖區(qū)是否已滿81青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.2函數(shù)命名規(guī)則模塊名_不及物動(dòng)詞Unsigned1.6.3表達(dá)式好的表達(dá)式可以朗讀出來消除歧義,運(yùn)算優(yōu)先級(jí)拿不準(zhǔn)就加括號(hào),表達(dá)式復(fù)雜就拆開。If(UART_IsTxBuffFull()) UART_ClearTxBuff();Else UART_PutChar(0x55);i=5;j=++i; 結(jié)果i=6,j=6 等效于i=5;i=i+1;j=i;i=5;j=i++; 結(jié)果i=6,j=5 等效于i=5;j=i;i=i+1;82青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.3表達(dá)式好的表達(dá)式可以朗讀出來If(UART_1.6.4風(fēng)格一致性For(i=0;i<100;i++){ for(j=0;j<200;j++) { Count++; }}While(a==b){ if(c==d) { Flag=1; } else { Flag=0; }} 83青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.4風(fēng)格一致性For(i=0;i<100;i++)31.6.5注釋注釋不是對(duì)代碼的重復(fù)。要意譯,不要直譯。For(i=6;i>DOT;i--) //從第6位到小數(shù)點(diǎn)依次遞減

{if(DispBuff[i]==0)DispBuff[i]=‘‘;//如果該位數(shù)值是0,則替換成空格else break; //如果不是,則跳出循環(huán)} For(i=6;i>DOT;i--) //對(duì)全部6位顯示數(shù)據(jù)進(jìn)行判斷

{if(DispBuff[i]==0)DispBuff[i]=‘‘;//消隱小數(shù)點(diǎn)前的無效0else break; } 84青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.5注釋注釋不是對(duì)代碼的重復(fù)。要意譯,不要直譯。Fo功能函數(shù)的注釋/***************************************************************************************名稱: LCD_DisplayDigit()*功能:

在LCD上任意位置顯示一個(gè)數(shù)字*入口參數(shù): Digit: 待顯示數(shù)字(0~9)

Location:顯示位置從左至右對(duì)應(yīng)76543210*出口參數(shù):

無*說明:

調(diào)用該函數(shù)不影響LCD其他位的顯示。*范例: LCD_DisplayDigit(3,0); //在第一位(右側(cè)最低位)顯示3 LCD_DisplayDigit(2,1); //在第二位顯示2 LCD_DisplayDigit(1,2); //在第三位顯示1--->顯示結(jié)果:123****************************************************************************************/voidLCD_DisplayDigit(charDigit,charLocation){charDigitSeg; //存放字形筆劃的變量

char*pLCD; //存放LCD顯存指針的變量

DigitSeg=LCD_Tab[Digit]; //得到待顯示數(shù)字的字形筆劃

pLCD=&LCDM1; //獲得LCDM1的地址

pLCD[Location]=DigitSeg;//在LCDM1之后Location個(gè)單元顯示出數(shù)字}

85青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)功能函數(shù)的注釋36青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.6宏定義宏定義給予常數(shù)可讀性宏定義全部大寫,以區(qū)別變量數(shù)據(jù)加括號(hào),注釋使用/**/#defineTXBUFF_SIZE (128) /*發(fā)送緩沖區(qū)大小*/#defineLCD_ROW (128) /*點(diǎn)陣液晶行數(shù)*/#defineLCD_CLUMN (128) /*點(diǎn)陣液晶列數(shù)*/#defineLCD_BUF_SIZE (LCD_CLUMN*LCD_ROW/8) /*點(diǎn)陣液晶緩沖區(qū)大小*/ UnsignedcharTxBuff[TXBUFF_SIZE]; //定義發(fā)送緩沖區(qū)CharIsTxBuffFull(){ if(NumOfTxChars>=TXBUFF_SIZE)return(1); //緩沖區(qū)是否滿? else return(0);}86青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.6.6宏定義宏定義給予常數(shù)可讀性#defineTXB使用宏定義時(shí),要防止定點(diǎn)數(shù)溢出宏定義的用途廣泛增強(qiáng)程序的可移植性進(jìn)行軟件版本的管理#defineVOLT_RATE (1000) /*比例系數(shù)*/...longVoltage;IntInputValue;...Voltage=InputValue*VOLT_RATE; /*可能溢出*/#defineVOLT_RATE (long(1000)) /*比例系數(shù),強(qiáng)行整成long*/87青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)使用宏定義時(shí),要防止定點(diǎn)數(shù)溢出宏定義的用途廣泛#define1.7 可移植性可移植性是嵌入式軟件設(shè)計(jì)的重要思想用到不同的硬件,比如到數(shù)碼管用到不同的處理器,比如51到430,編程時(shí)應(yīng)盡量消除硬件差異無法消除的差異,集中到小的局部來修改88青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7 可移植性可移植性是嵌入式軟件設(shè)計(jì)的重要思想39青島大1.7.1消除差異例如用宏定義消除口操作的差異此后的程序不用修改,直接用和來操作口#include”MSP430x42x.h”#defineLED_ON P2OUT|=BIT0#defineLED_OFF P2OUT&=~BIT0#include”reg51.h”SbitLED=P2^0;#defineLED_ON P2.0=1;#defineLED_OFF P2.0=0;89青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.1消除差異例如用宏定義消除口操作的差異#inclu1.7.2消除硬件差異用宏定義消除硬件差異例如或數(shù)碼管的口,順序經(jīng)常會(huì)改變/*宏定義,數(shù)碼管a~g、DP各段對(duì)應(yīng)的比特,更換硬件只用改動(dòng)以下8行*/#definea 0x01#defineb 0x02#definec 0x04#defined 0x08#definee 0x10#definef 0x20#defineg 0x40#defineDP 0x80/*宏定義自動(dòng)生成段碼表,不要改動(dòng)*/ConstcharLCD_Tab[]={a+b+c+d+e+f, //0b+c, //1a+b+d+e+g, //2a+b+c+d+g, //3b+c+f+g, //4a+c+d+f+g, //5a+c+d+e+f+g, //6a+b+c, //7a+b+c+d+e+f+g, //8a+b+c+d+f+g, //9}#undefa...90青島大學(xué)大學(xué)生創(chuàng)新中心傅強(qiáng)1.7.2消除硬件差異用宏定義消除硬件差異/*宏定義,數(shù)碼用函數(shù)來消除硬件差異例如控制

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論