




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一章430單片機入門基礎第一章430單片機入門基礎1前沿1、《430系列單片機系統工程設計與實踐》這本書是我見過的最好的關于單片機的書,非常值得逐字逐句的徹底學習一遍。2、與51不同,430單片機是處理器,通過對比兩者的區別,可以建立起代碼移植的思想。3、430單片機屬于混合信號處理器,資源極其豐富,有利于全面學習硬件知識。2青島大學大學生創新中心傅強前沿1、《430系列單片機系統工程設計與實踐》這本書是我見過1.1初識430單片機430:低功耗之王,水果電池驅動1、為什么我們在乎功耗?凡是以電池為電源的電子設備都看重低功耗。幾乎所有的單片機會標榜自己有低功耗方面的設計。2、430為什么可以成為低功耗之王?在硬件上,和不用的模塊可以休眠在軟件上,必須設計恰當的休眠和喚醒430是實現低功耗的必要條件,非充分條件。3青島大學大學生創新中心傅強1.1初識430單片機430:低功耗之王,水果電池驅動3青1.1.1430單片機的應用前景便攜設備,高集成度、小型化。野外安置的終身電池設備。無需額外供電的自供電設備。高精度測量、控制領域。當普通單片機用。4青島大學大學生創新中心傅強1.1.1430單片機的應用前景便攜設備,高集成度、小型化1.1.2430單片機的特點多時鐘系統時鐘、功能模塊時鐘、休眠喚醒時鐘軟件設置時鐘16位處理器,單指令周期模塊化結構各模塊完全獨立,不需要干涉避免了與外部模塊復雜的數據通信學會最貴的430,等于會用了全系列4305青島大學大學生創新中心傅強1.1.2430單片機的特點多時鐘系統5青島大學大學生創采用馮?諾依曼結構(普林斯頓結構),程序指令存儲器和數據存儲器統一編址。舉例:實現存儲器中兩數據相乘,要經過3個步驟,通過總線取兩個數據和取出指令(干什么)到。如果是哈佛結構,數據總線和指令總線分開。430可以在里跑程序,加上具有控制器,可實現固件更新。中的升級代碼->復制到運行->擦除>升級1.1.2430單片機的特點6青島大學大學生創新中心傅強采用馮?諾依曼結構(普林斯頓結構),程序指令存儲器和數據存儲科普:、、、、、存儲器揮發性存儲器非揮發性存儲器可擦寫只讀速度最高最貴要定時刷新紫外線擦寫電擦寫電擦寫計算機一二級緩存計算機內存條絕種貴,慢前途無量絕種了6個晶體管構成1一個晶體管+電容充放電
我們現在用的51,都是的,但是內部沒有控制器,所以需要存實時數據。430帶控制器,單片機自己就能擦寫,所以不用。7青島大學大學生創新中心傅強科普:、、、、、存儲器揮發性存儲器非揮發性存儲器可擦寫只讀速430425A資源8處理速度512(數據)+16(程序代碼)內置控制器,剩余可存數據。內置時鐘管理單元,可內部倍頻3路同步采樣、差分輸入、32倍程控增益放大器的16位溫度傳感器1.2V基準源和輸出緩沖器128段驅動器增強串口看門狗定時器16位定時器,3路捕獲和2路內置復位電路16個雙向可中斷口內置電能計量模塊后綴帶A的,比如425A帶硬件乘法器8青島大學大學生創新中心傅強430425A資源8青島大學大學生創新中心傅強1.1.3430單片機最小系統一般單片機最小系統需要什么?電源、晶振、復位、下載/仿真接口430425自帶片內數控時鐘(),掉電復位電路()一般講究一點都需要“電源監視芯片”內部時鐘一般不如晶振精確可以外接手表晶振32.768k,然后倍頻、、可下載+調試,只能下載9青島大學大學生創新中心傅強1.1.3430單片機最小系統一般單片機最小系統需要什么?1.2430單片機開發軟件入門一般用430軟件工程管理、程序編輯、代碼編譯下載、仿真調試工程管理:管理外部函數、頭文件。。。程序編輯:寫代碼編譯:替程序員處理所有打雜的事情>匯編調試:真正的考驗水平的地方,不是所有單片機都支持調試,這是要硬件支持的。10青島大學大學生創新中心傅強1.2430單片機開發軟件入門一般用430軟件10青島大學全速執行、單步執行。。。執行到光標處設置斷點(在程序中加一個空操作,然后用來設斷點)查看變量寄存器查看調用函數關系11青島大學大學生創新中心傅強全速執行、單步執行。。。11青島大學大學生創新中心傅強1.3430單片機C語言基礎C語言、編譯器和機器碼之間的關系(){...}C語言源文件編譯器(8086)機器碼430編譯器430單片機機器碼51編譯器51單片機機器碼在寫C語言的過程中,盡量消除不同的差異,或者將差異集中到一個地方做修改,那么就能方便的實現代碼移植。我們現在寫C程序,就必須按此要求嚴格要求自己。這樣才能一通百通,才能減少重復勞動。12青島大學大學生創新中心傅強1.3430單片機C語言基礎C語言、編譯器和機器碼之間的關1.3.1變量我們為什么要定義各種變量?定義短字節變量有哪些好處和壞處?定義長字節變量有哪些好處和壞處?一些特殊的關鍵字[7]={1,2,3,4,5,6,7}本地全局變量b;不被優化c;不對其初始化為什么要慎重使用全局變量?13青島大學大學生創新中心傅強1.3.1變量我們為什么要定義各種變量?13青島大學大學1.3.2數學運算盡可能避免浮點數運算。運算慢、非常慢。占用多。所以應盡量避免使用浮點數。防止定點數溢出。x;a;*1000和1000都是型,a>65溢出應改為*(1000)或()a*100014青島大學大學生創新中心傅強1.3.2數學運算盡可能避免浮點數運算。14青島大學大學小數的處理例如,溫度的最后計算公式為:*1.32/1.25-273為避免浮點數可改為:()*132/125-273如需保留1位小數,則:()*1320/125-2730擴大10倍程序中加上明確注釋在顯示時,將小數點移位即可減小乘除法取平均時,盡量取2、4、8等2次冪,這樣可以用移位代替乘除(可編譯器自動)后綴帶A的型號有硬件乘法器(自動使用)15青島大學大學生創新中心傅強小數的處理15青島大學大學生創新中心傅強1.3.3位操作精簡指令處理器如何寫口?P2=P2|0x01; 2.0置高按位或P20x01; 一般均簡寫成這樣P20x01; 2.1置低按位與P2^=0x04; 2.2取反按位異或0 (0x01) 宏定義......P20; 2.0置高P1(123) 1.1P1.2P1.3置低精簡指令處理器如何讀口?;((P15)0) P20;(P15) P20;(P1(56)) P20;(P15) 1; 讀P1.5值賦給 0;16青島大學大學生創新中心傅強1.3.3位操作精簡指令處理器如何寫口?16青島大學大學1.3.4寄存器操作如何理解寄存器操作?如果設計模擬電路算是天才干的事情,那么操作單片機的寄存器就算是傻瓜干的事情。處理器把能干的事全干了,需要人過問的事情,通過一系列開關讓人來選擇,所以這是傻瓜就能干的事情越是功能強大的處理器,需要配置的寄存器越多。處理器說明書就是用來查寄存器功能的17青島大學大學生創新中心傅強1.3.4寄存器操作如何理解寄存器操作?17青島大學大學宏定義幫助我們理解抽象的數字查說明書,找到控制串口收發的是1寄存器的最高兩位,我們可以用下面的賦值。16 開串口收中斷17 開串口發中斷為便于記憶和理解,頭文件中有如下宏定義:0 (0x40)在430x420 (0x80)頭文件中已有100以后我們接觸高級處理器的程序中,大部分都是這么寫,不會像51里面直接寫0x20這樣18青島大學大學生創新中心傅強宏定義幫助我們理解抽象的數字查說明書,找到控制串口收發的是1特別注意:使用“”賦值不會影響其他位,但要搞清楚是不是要先對標志位清0。例如:控制器輸出模式有3個控制位,可以表示8種模式。頭文件中定義了07宏定義,000-111。13011...16110實際效果是111,也就是模式719青島大學大學生創新中心傅強特別注意:使用“”賦值不會影響其他位,但要搞清楚是不是要先對1.3.5中斷中斷的作用是快速響應事件430中幾乎所有“資源”都帶中斷,為的是休眠后,喚醒。發送指令給模塊,然后休眠。模塊執行完畢后,中斷喚醒。中斷向量表位于最高段000~0(512B)特別注意!430的中斷沒有中斷嵌套的優先級
() { ... }20青島大學大學生創新中心傅強1.3.5中斷中斷的作用是快速響應事件20青島大學大學生430x42x頭文件中的中斷向量表 (0*2u) /*00基礎定時器)2(1*2u)/*02P2*/1(4*2u)/*08P1*/1(5*2u)/*0A1/2*/0(6*2u)/*0A0*/0(8*2u)/*00串口發送*/0(9*2u)/*02串口接收*/(10*2u)/*04*/16(12*2u)/*0816位*/(14*2u)/*0*/(15*2u)/*0*/21青島大學大學生創新中心傅強21青島大學大學生創新中心傅強中斷的具體過程事先將中斷服務程序入口地址裝入中斷向量表。中斷發生后,如果中斷被允許(可屏蔽中斷),將當前程序地址和狀態寄存器壓入堆棧。跳轉到中斷服務程序入口,備份寄存器入堆棧。開始執行中斷服務程序。退出中斷前,恢復寄存器。取回寄存器,跳轉回中斷前主程序地址。22青島大學大學生創新中心傅強中斷的具體過程事先將中斷服務程序入口地址裝入中斷向量表。22退出中斷時喚醒進中斷前休眠,那么退出中斷后仍然休眠??梢栽谥袛嘧映绦蛑行薷亩褩V械?,使得中斷結束后,不休眠。
(){ ... ()此函數經匯編優化}23青島大學大學生創新中心傅強退出中斷時喚醒進中斷前休眠,那么退出中斷后仍然休眠。23青島中斷標志位同類中斷合并成一個總的中斷。由軟件判斷中斷標志位來確定具體中斷。什么是標志位?不急用、待查詢。1P1(){ (P15) {...} (P16) {...} P10;}24青島大學大學生創新中心傅強中斷標志位同類中斷合并成一個總的中斷。24青島大學大學生創1.3.6內部函數頭文件和4300();或0();();();或();();或;();或();(x);()25青島大學大學生創新中心傅強1.3.6內部函數頭文件和43025青島大學大學生創新中1.3.7庫函數430提供100個庫函數 字符處理類 數學類 輸入和輸出類 通用子程序類 字符串處理類庫函數是C語言通用的,內部函數與特定處理器有關。26青島大學大學生創新中心傅強1.3.7庫函數430提供100個庫函數26青島大學大1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方法是按功能模塊劃分(對象)。/*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青島大學大學生創新中心傅強1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方全局變量的處理隸屬關系模糊的全局變量單獨建隸屬于某模塊的,寫在模塊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青島大學大學生創新中心傅強全局變量的處理隸屬關系模糊的全局變量單獨建/*glob1.5代碼優化編譯器可自動對代碼進行優化速度快,但占多速度慢,占少可選優化等級,等級越高,占越小調試階段最好關閉優化要是不優化還有變量改變,則加29青島大學大學生創新中心傅強1.5代碼優化編譯器可自動對代碼進行優化29青島大學大學1.6風格對于寫程序代碼,有3個層次首先,計算機要能讀其次,要自己能讀最后,要別人能讀30青島大學大學生創新中心傅強1.6風格對于寫程序代碼,有3個層次30青島大學大學生創1.6.1變量命名規則變量名要有含義,不要隨便用變量名最好是名詞詞性,1-4個單詞每個單詞首字母大寫;;必須出現空格時,用下劃線代替;;單詞較長,適當簡寫;;多個模塊都有的變量,按“模塊名_變量名”;1;約定俗成的變量不要改動I、j作為循環變量,p、q作為指針,s、t表示字符串31青島大學大學生創新中心傅強1.6.1變量命名規則變量名要有含義,不要隨便用31青島大1.6.2函數命名規則模塊名_不及物動詞模塊名_及物動詞+名詞首字母大寫專用名詞全部大寫長單詞縮寫返回值是布爾型的,對返回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();//檢查緩沖區Char UART_IsTxBuffFull();//緩沖區是否已滿32青島大學大學生創新中心傅強1.6.2函數命名規則模塊名_不及物動詞Unsigned1.6.3表達式好的表達式可以朗讀出來消除歧義,運算優先級拿不準就加括號,表達式復雜就拆開。If(UART_IsTxBuffFull()) UART_ClearTxBuff();Else UART_PutChar(0x55);i=5;j=++i; 結果i=6,j=6 等效于i=5;i=i+1;j=i;i=5;j=i++; 結果i=6,j=5 等效于i=5;j=i;i=i+1;33青島大學大學生創新中心傅強1.6.3表達式好的表達式可以朗讀出來If(UART_1.6.4風格一致性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青島大學大學生創新中心傅強1.6.4風格一致性For(i=0;i<100;i++)31.6.5注釋注釋不是對代碼的重復。要意譯,不要直譯。For(i=6;i>DOT;i--) //從第6位到小數點依次遞減
{if(DispBuff[i]==0)DispBuff[i]=‘‘;//如果該位數值是0,則替換成空格else break; //如果不是,則跳出循環} For(i=6;i>DOT;i--) //對全部6位顯示數據進行判斷
{if(DispBuff[i]==0)DispBuff[i]=‘‘;//消隱小數點前的無效0else break; } 35青島大學大學生創新中心傅強1.6.5注釋注釋不是對代碼的重復。要意譯,不要直譯。Fo功能函數的注釋/***************************************************************************************名稱: LCD_DisplayDigit()*功能:
在LCD上任意位置顯示一個數字*入口參數: Digit: 待顯示數字(0~9)
Location:顯示位置從左至右對應76543210*出口參數:
無*說明:
調用該函數不影響LCD其他位的顯示。*范例: LCD_DisplayDigit(3,0); //在第一位(右側最低位)顯示3 LCD_DisplayDigit(2,1); //在第二位顯示2 LCD_DisplayDigit(1,2); //在第三位顯示1--->顯示結果:123****************************************************************************************/voidLCD_DisplayDigit(charDigit,charLocation){charDigitSeg; //存放字形筆劃的變量
char*pLCD; //存放LCD顯存指針的變量
DigitSeg=LCD_Tab[Digit]; //得到待顯示數字的字形筆劃
pLCD=&LCDM1; //獲得LCDM1的地址
pLCD[Location]=DigitSeg;//在LCDM1之后Location個單元顯示出數字}
36青島大學大學生創新中心傅強功能函數的注釋36青島大學大學生創新中心傅強1.6.6宏定義宏定義給予常數可讀性宏定義全部大寫,以區別變量數據加括號,注釋使用/**/#defineTXBUFF_SIZE (128) /*發送緩沖區大小*/#defineLCD_ROW (128) /*點陣液晶行數*/#defineLCD_CLUMN (128) /*點陣液晶列數*/#defineLCD_BUF_SIZE (LCD_CLUMN*LCD_ROW/8) /*點陣液晶緩沖區大小*/ UnsignedcharTxBuff[TXBUFF_SIZE]; //定義發送緩沖區CharIsTxBuffFull(){ if(NumOfTxChars>=TXBUFF_SIZE)return(1); //緩沖區是否滿? else return(0);}37青島大學大學生創新中心傅強1.6.6宏定義宏定義給予常數可讀性#defineTXB使用宏定義時,要防止定點數溢出宏定義的用途廣泛增強程序的可移植性進行軟件版本的管理#defineVOLT_RATE (1000) /*比例系數*/...longVoltage;IntInputValue;...Voltage=InputValue*VOLT_RATE; /*可能溢出*/#defineVOLT_RATE (long(1000)) /*比例系數,強行整成long*/38青島大學大學生創新中心傅強使用宏定義時,要防止定點數溢出宏定義的用途廣泛#define1.7 可移植性可移植性是嵌入式軟件設計的重要思想用到不同的硬件,比如到數碼管用到不同的處理器,比如51到430,編程時應盡量消除硬件差異無法消除的差異,集中到小的局部來修改39青島大學大學生創新中心傅強1.7 可移植性可移植性是嵌入式軟件設計的重要思想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青島大學大學生創新中心傅強1.7.1消除差異例如用宏定義消除口操作的差異#inclu1.7.2消除硬件差異用宏定義消除硬件差異例如或數碼管的口,順序經常會改變/*宏定義,數碼管a~g、DP各段對應的比特,更換硬件只用改動以下8行*/#definea 0x01#defineb 0x02#definec 0x04#defined 0x08#definee 0x10#definef 0x20#defineg 0x40#defineDP 0x80/*宏定義自動生成段碼表,不要改動*/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青島大學大學生創新中心傅強1.7.2消除硬件差異用宏定義消除硬件差異/*宏定義,數碼用函數來消除硬件差異例如控制電機的啟和停直流電機設置口高低電平即可步進電機要輸出一定規則的脈沖序列大型交流電機需要用串口控制變頻器我們把具體操作“封”在函數里Moter_ON(){ ...}Moter_OFF(){ ...}42青島大學大學生創新中心傅強用函數來消除硬件差異例如控制電機的啟和停Mot1.7.3軟件層次劃分大量復雜的調用函數需要有清晰的層次關系菜單/人機界面Key_GetKey();Key_WaitKey();鍵盤緩沖區【FIFO】定時掃描并判斷按鍵LCD_Clear();LCD_DisplayNumber();LCD_DisplayDecimal();LCD_InsertChar();LCD_DeleteChar();顯示緩沖區【數組】LED定時循環掃描LED顯存映射應用層功能函數層硬件隔離層硬件驅動層43青島大學大學生創新中心傅強1.7.3軟件層次劃分大量復雜的調用函數需要有清晰的層次關應用層:最終功能,往往和人的感官有關功能層:功能函數,表達具體要干什么硬件隔離層:宏定義、緩沖區、函數封裝硬件隔離層(硬件抽象層,)是非常重要的環節。功能函數只操作硬件隔離層的數據,與具體硬件無關。硬件驅動層:和具體硬件有關的代碼,硬件驅動層從硬件隔離層獲得“指示”,或是將“結果”發送至硬件隔離層。44青島大學大學生創新中心傅強應用層:最終功能,往往和人的感官有關44青島大學大學生創新軟件劃分層次的好處每個層的函數只對上下層“可見”,這樣設置好接口參數后,各單元軟件可獨立開發。改動硬件時,只需配置相應的底層驅動,修改硬件隔離層,而整個大軟件功能可以不變。軟件的可移植性增強。功能層的函數無需關心硬件如何實現,以及何時何處被應用層調用,專心做好自己的事情就行。將大型軟件任務分塊,團隊合作。只要明確了模塊功能,接口規范,就能分派任務。45青島大學大學生創新中心傅強軟件劃分層次的好處每個層的函數只對上下層“可見”,這樣設置好1.7.4接口VoidRTC_Tick(intDivSec) //硬件無關的走時函數,DivSec入口{charDays; //每月的天數變量
DSEC++; //定時中斷加數DISABLE_INT; //宏定義關總中斷
If(DSEC>=DivSec) {SECOND++;DSEC=0} //校正中斷時間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]; //月份天數查表If(DATE>Days) {MONTH++;DATE=1;}If(MONTH>12) {YEAR++;MONTH=1;}If(YEAR>=100) {YEAR=0;} //只顯近百年時間
RESTORE_INT; //宏定義恢復中斷}46青島大學大學生創新中心傅強1.7.4接口VoidRTC_Tick(intDivS1.7.5屏蔽一個好的子函數,應消滅細節特征,只暴露最基本的要程序員選擇的選項。類似于處理器中,設置各種特殊功能寄存器。比如,手機撥號。手機和手機的實際撥號過程差異巨大,但是我們看起來的撥號程序都是一樣操作的。UART_Init(2400,’n’,8,1);//2400比特,無校驗,8位數據,1位停止位47青島大學大學生創新中心傅強1.7.5屏蔽一個好的子函數,應消滅細節特征,只暴露最基本1.8版本管理如果一個程序一開始設計就有N個變種(版本),用移植的辦法改寫,變成N種程序是不明智的。因為維護起來困難。例如,有一個版本的軟件按鍵帶聲音、另一個不帶聲音??梢杂煤甓x+條件編譯宏來實現版本管理。/*********************************Config.h*************************************/#define KEYTONE ON /*是否打開按鍵音*/#define RS485 ON /*是否打開RS485通信口*/#define SCREEN LCD /*顯示屏驅動LED=數碼管LCD=液晶*/......CharKey_GetKey() //讀鍵盤函數{ charKey Key=Key_ReadFIFO(); //從鍵盤緩沖區讀一個按鍵#if(KEYTONE==ON) //KEYTONE打開才編譯下一句 if(Key!=NOKEY)Beep(30); //有效按鍵則蜂鳴30ms#endif return(Key); //返回鍵值}48青島大學大學生創新中心傅強1.8版本管理如果一個程序一開始設計就有N個變種(版本),本章小結MSP430單片機的入門知識特點(低功耗、混合信號)資源與結構(精簡指令、普林斯頓結構)C語言(位操作、寄存器操作、中斷、內部函數、庫函數)軟件工程的共性問題文件管理(拆成小的c程序,頭文件調用)代碼優化(編譯器的作用,先不優化)風格(命名規則、表達式、注釋、宏定義)可移植性(cpu差異、硬件差異、軟件層次、接口、屏蔽)版本管理(宏定義與條件編譯宏)49青島大學-TI大學生創新中心傅強本章小結MSP430單片機的入門知識49青島大學-TI大學第一章430單片機入門基礎第一章430單片機入門基礎50前沿1、《430系列單片機系統工程設計與實踐》這本書是我見過的最好的關于單片機的書,非常值得逐字逐句的徹底學習一遍。2、與51不同,430單片機是處理器,通過對比兩者的區別,可以建立起代碼移植的思想。3、430單片機屬于混合信號處理器,資源極其豐富,有利于全面學習硬件知識。51青島大學大學生創新中心傅強前沿1、《430系列單片機系統工程設計與實踐》這本書是我見過1.1初識430單片機430:低功耗之王,水果電池驅動1、為什么我們在乎功耗?凡是以電池為電源的電子設備都看重低功耗。幾乎所有的單片機會標榜自己有低功耗方面的設計。2、430為什么可以成為低功耗之王?在硬件上,和不用的模塊可以休眠在軟件上,必須設計恰當的休眠和喚醒430是實現低功耗的必要條件,非充分條件。52青島大學大學生創新中心傅強1.1初識430單片機430:低功耗之王,水果電池驅動3青1.1.1430單片機的應用前景便攜設備,高集成度、小型化。野外安置的終身電池設備。無需額外供電的自供電設備。高精度測量、控制領域。當普通單片機用。53青島大學大學生創新中心傅強1.1.1430單片機的應用前景便攜設備,高集成度、小型化1.1.2430單片機的特點多時鐘系統時鐘、功能模塊時鐘、休眠喚醒時鐘軟件設置時鐘16位處理器,單指令周期模塊化結構各模塊完全獨立,不需要干涉避免了與外部模塊復雜的數據通信學會最貴的430,等于會用了全系列43054青島大學大學生創新中心傅強1.1.2430單片機的特點多時鐘系統5青島大學大學生創采用馮?諾依曼結構(普林斯頓結構),程序指令存儲器和數據存儲器統一編址。舉例:實現存儲器中兩數據相乘,要經過3個步驟,通過總線取兩個數據和取出指令(干什么)到。如果是哈佛結構,數據總線和指令總線分開。430可以在里跑程序,加上具有控制器,可實現固件更新。中的升級代碼->復制到運行->擦除>升級1.1.2430單片機的特點55青島大學大學生創新中心傅強采用馮?諾依曼結構(普林斯頓結構),程序指令存儲器和數據存儲科普:、、、、、存儲器揮發性存儲器非揮發性存儲器可擦寫只讀速度最高最貴要定時刷新紫外線擦寫電擦寫電擦寫計算機一二級緩存計算機內存條絕種貴,慢前途無量絕種了6個晶體管構成1一個晶體管+電容充放電
我們現在用的51,都是的,但是內部沒有控制器,所以需要存實時數據。430帶控制器,單片機自己就能擦寫,所以不用。56青島大學大學生創新中心傅強科普:、、、、、存儲器揮發性存儲器非揮發性存儲器可擦寫只讀速430425A資源8處理速度512(數據)+16(程序代碼)內置控制器,剩余可存數據。內置時鐘管理單元,可內部倍頻3路同步采樣、差分輸入、32倍程控增益放大器的16位溫度傳感器1.2V基準源和輸出緩沖器128段驅動器增強串口看門狗定時器16位定時器,3路捕獲和2路內置復位電路16個雙向可中斷口內置電能計量模塊后綴帶A的,比如425A帶硬件乘法器57青島大學大學生創新中心傅強430425A資源8青島大學大學生創新中心傅強1.1.3430單片機最小系統一般單片機最小系統需要什么?電源、晶振、復位、下載/仿真接口430425自帶片內數控時鐘(),掉電復位電路()一般講究一點都需要“電源監視芯片”內部時鐘一般不如晶振精確可以外接手表晶振32.768k,然后倍頻、、可下載+調試,只能下載58青島大學大學生創新中心傅強1.1.3430單片機最小系統一般單片機最小系統需要什么?1.2430單片機開發軟件入門一般用430軟件工程管理、程序編輯、代碼編譯下載、仿真調試工程管理:管理外部函數、頭文件。。。程序編輯:寫代碼編譯:替程序員處理所有打雜的事情>匯編調試:真正的考驗水平的地方,不是所有單片機都支持調試,這是要硬件支持的。59青島大學大學生創新中心傅強1.2430單片機開發軟件入門一般用430軟件10青島大學全速執行、單步執行。。。執行到光標處設置斷點(在程序中加一個空操作,然后用來設斷點)查看變量寄存器查看調用函數關系60青島大學大學生創新中心傅強全速執行、單步執行。。。11青島大學大學生創新中心傅強1.3430單片機C語言基礎C語言、編譯器和機器碼之間的關系(){...}C語言源文件編譯器(8086)機器碼430編譯器430單片機機器碼51編譯器51單片機機器碼在寫C語言的過程中,盡量消除不同的差異,或者將差異集中到一個地方做修改,那么就能方便的實現代碼移植。我們現在寫C程序,就必須按此要求嚴格要求自己。這樣才能一通百通,才能減少重復勞動。61青島大學大學生創新中心傅強1.3430單片機C語言基礎C語言、編譯器和機器碼之間的關1.3.1變量我們為什么要定義各種變量?定義短字節變量有哪些好處和壞處?定義長字節變量有哪些好處和壞處?一些特殊的關鍵字[7]={1,2,3,4,5,6,7}本地全局變量b;不被優化c;不對其初始化為什么要慎重使用全局變量?62青島大學大學生創新中心傅強1.3.1變量我們為什么要定義各種變量?13青島大學大學1.3.2數學運算盡可能避免浮點數運算。運算慢、非常慢。占用多。所以應盡量避免使用浮點數。防止定點數溢出。x;a;*1000和1000都是型,a>65溢出應改為*(1000)或()a*100063青島大學大學生創新中心傅強1.3.2數學運算盡可能避免浮點數運算。14青島大學大學小數的處理例如,溫度的最后計算公式為:*1.32/1.25-273為避免浮點數可改為:()*132/125-273如需保留1位小數,則:()*1320/125-2730擴大10倍程序中加上明確注釋在顯示時,將小數點移位即可減小乘除法取平均時,盡量取2、4、8等2次冪,這樣可以用移位代替乘除(可編譯器自動)后綴帶A的型號有硬件乘法器(自動使用)64青島大學大學生創新中心傅強小數的處理15青島大學大學生創新中心傅強1.3.3位操作精簡指令處理器如何寫口?P2=P2|0x01; 2.0置高按位或P20x01; 一般均簡寫成這樣P20x01; 2.1置低按位與P2^=0x04; 2.2取反按位異或0 (0x01) 宏定義......P20; 2.0置高P1(123) 1.1P1.2P1.3置低精簡指令處理器如何讀口?;((P15)0) P20;(P15) P20;(P1(56)) P20;(P15) 1; 讀P1.5值賦給 0;65青島大學大學生創新中心傅強1.3.3位操作精簡指令處理器如何寫口?16青島大學大學1.3.4寄存器操作如何理解寄存器操作?如果設計模擬電路算是天才干的事情,那么操作單片機的寄存器就算是傻瓜干的事情。處理器把能干的事全干了,需要人過問的事情,通過一系列開關讓人來選擇,所以這是傻瓜就能干的事情越是功能強大的處理器,需要配置的寄存器越多。處理器說明書就是用來查寄存器功能的66青島大學大學生創新中心傅強1.3.4寄存器操作如何理解寄存器操作?17青島大學大學宏定義幫助我們理解抽象的數字查說明書,找到控制串口收發的是1寄存器的最高兩位,我們可以用下面的賦值。16 開串口收中斷17 開串口發中斷為便于記憶和理解,頭文件中有如下宏定義:0 (0x40)在430x420 (0x80)頭文件中已有100以后我們接觸高級處理器的程序中,大部分都是這么寫,不會像51里面直接寫0x20這樣67青島大學大學生創新中心傅強宏定義幫助我們理解抽象的數字查說明書,找到控制串口收發的是1特別注意:使用“”賦值不會影響其他位,但要搞清楚是不是要先對標志位清0。例如:控制器輸出模式有3個控制位,可以表示8種模式。頭文件中定義了07宏定義,000-111。13011...16110實際效果是111,也就是模式768青島大學大學生創新中心傅強特別注意:使用“”賦值不會影響其他位,但要搞清楚是不是要先對1.3.5中斷中斷的作用是快速響應事件430中幾乎所有“資源”都帶中斷,為的是休眠后,喚醒。發送指令給模塊,然后休眠。模塊執行完畢后,中斷喚醒。中斷向量表位于最高段000~0(512B)特別注意!430的中斷沒有中斷嵌套的優先級
() { ... }69青島大學大學生創新中心傅強1.3.5中斷中斷的作用是快速響應事件20青島大學大學生430x42x頭文件中的中斷向量表 (0*2u) /*00基礎定時器)2(1*2u)/*02P2*/1(4*2u)/*08P1*/1(5*2u)/*0A1/2*/0(6*2u)/*0A0*/0(8*2u)/*00串口發送*/0(9*2u)/*02串口接收*/(10*2u)/*04*/16(12*2u)/*0816位*/(14*2u)/*0*/(15*2u)/*0*/70青島大學大學生創新中心傅強21青島大學大學生創新中心傅強中斷的具體過程事先將中斷服務程序入口地址裝入中斷向量表。中斷發生后,如果中斷被允許(可屏蔽中斷),將當前程序地址和狀態寄存器壓入堆棧。跳轉到中斷服務程序入口,備份寄存器入堆棧。開始執行中斷服務程序。退出中斷前,恢復寄存器。取回寄存器,跳轉回中斷前主程序地址。71青島大學大學生創新中心傅強中斷的具體過程事先將中斷服務程序入口地址裝入中斷向量表。22退出中斷時喚醒進中斷前休眠,那么退出中斷后仍然休眠??梢栽谥袛嘧映绦蛑行薷亩褩V械模沟弥袛嘟Y束后,不休眠。
(){ ... ()此函數經匯編優化}72青島大學大學生創新中心傅強退出中斷時喚醒進中斷前休眠,那么退出中斷后仍然休眠。23青島中斷標志位同類中斷合并成一個總的中斷。由軟件判斷中斷標志位來確定具體中斷。什么是標志位?不急用、待查詢。1P1(){ (P15) {...} (P16) {...} P10;}73青島大學大學生創新中心傅強中斷標志位同類中斷合并成一個總的中斷。24青島大學大學生創1.3.6內部函數頭文件和4300();或0();();();或();();或;();或();(x);()74青島大學大學生創新中心傅強1.3.6內部函數頭文件和43025青島大學大學生創新中1.3.7庫函數430提供100個庫函數 字符處理類 數學類 輸入和輸出類 通用子程序類 字符串處理類庫函數是C語言通用的,內部函數與特定處理器有關。75青島大學大學生創新中心傅強1.3.7庫函數430提供100個庫函數26青島大學大1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方法是按功能模塊劃分(對象)。/*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青島大學大學生創新中心傅強1.4文件管理將大程序劃分為若干小的C文件,最常用的劃分方全局變量的處理隸屬關系模糊的全局變量單獨建隸屬于某模塊的,寫在模塊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青島大學大學生創新中心傅強全局變量的處理隸屬關系模糊的全局變量單獨建/*glob1.5代碼優化編譯器可自動對代碼進行優化速度快,但占多速度慢,占少可選優化等級,等級越高,占越小調試階段最好關閉優化要是不優化還有變量改變,則加78青島大學大學生創新中心傅強1.5代碼優化編譯器可自動對代碼進行優化29青島大學大學1.6風格對于寫程序代碼,有3個層次首先,計算機要能讀其次,要自己能讀最后,要別人能讀79青島大學大學生創新中心傅強1.6風格對于寫程序代碼,有3個層次30青島大學大學生創1.6.1變量命名規則變量名要有含義,不要隨便用變量名最好是名詞詞性,1-4個單詞每個單詞首字母大寫;;必須出現空格時,用下劃線代替;;單詞較長,適當簡寫;;多個模塊都有的變量,按“模塊名_變量名”;1;約定俗成的變量不要改動I、j作為循環變量,p、q作為指針,s、t表示字符串80青島大學大學生創新中心傅強1.6.1變量命名規則變量名要有含義,不要隨便用31青島大1.6.2函數命名規則模塊名_不及物動詞模塊名_及物動詞+名詞首字母大寫專用名詞全部大寫長單詞縮寫返回值是布爾型的,對返回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();//檢查緩沖區Char UART_IsTxBuffFull();//緩沖區是否已滿81青島大學大學生創新中心傅強1.6.2函數命名規則模塊名_不及物動詞Unsigned1.6.3表達式好的表達式可以朗讀出來消除歧義,運算優先級拿不準就加括號,表達式復雜就拆開。If(UART_IsTxBuffFull()) UART_ClearTxBuff();Else UART_PutChar(0x55);i=5;j=++i; 結果i=6,j=6 等效于i=5;i=i+1;j=i;i=5;j=i++; 結果i=6,j=5 等效于i=5;j=i;i=i+1;82青島大學大學生創新中心傅強1.6.3表達式好的表達式可以朗讀出來If(UART_1.6.4風格一致性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青島大學大學生創新中心傅強1.6.4風格一致性For(i=0;i<100;i++)31.6.5注釋注釋不是對代碼的重復。要意譯,不要直譯。For(i=6;i>DOT;i--) //從第6位到小數點依次遞減
{if(DispBuff[i]==0)DispBuff[i]=‘‘;//如果該位數值是0,則替換成空格else break; //如果不是,則跳出循環} For(i=6;i>DOT;i--) //對全部6位顯示數據進行判斷
{if(DispBuff[i]==0)DispBuff[i]=‘‘;//消隱小數點前的無效0else break; } 84青島大學大學生創新中心傅強1.6.5注釋注釋不是對代碼的重復。要意譯,不要直譯。Fo功能函數的注釋/***************************************************************************************名稱: LCD_DisplayDigit()*功能:
在LCD上任意位置顯示一個數字*入口參數: Digit: 待顯示數字(0~9)
Location:顯示位置從左至右對應76543210*出口參數:
無*說明:
調用該函數不影響LCD其他位的顯示。*范例: LCD_DisplayDigit(3,0); //在第一位(右側最低位)顯示3 LCD_DisplayDigit(2,1); //在第二位顯示2 LCD_DisplayDigit(1,2); //在第三位顯示1--->顯示結果:123****************************************************************************************/voidLCD_DisplayDigit(charDigit,charLocation){charDigitSeg; //存放字形筆劃的變量
char*pLCD; //存放LCD顯存指針的變量
DigitSeg=LCD_Tab[Digit]; //得到待顯示數字的字形筆劃
pLCD=&LCDM1; //獲得LCDM1的地址
pLCD[Location]=DigitSeg;//在LCDM1之后Location個單元顯示出數字}
85青島大學大學生創新中心傅強功能函數的注釋36青島大學大學生創新中心傅強1.6.6宏定義宏定義給予常數可讀性宏定義全部大寫,以區別變量數據加括號,注釋使用/**/#defineTXBUFF_SIZE (128) /*發送緩沖區大小*/#defineLCD_ROW (128) /*點陣液晶行數*/#defineLCD_CLUMN (128) /*點陣液晶列數*/#defineLCD_BUF_SIZE (LCD_CLUMN*LCD_ROW/8) /*點陣液晶緩沖區大小*/ UnsignedcharTxBuff[TXBUFF_SIZE]; //定義發送緩沖區CharIsTxBuffFull(){ if(NumOfTxChars>=TXBUFF_SIZE)return(1); //緩沖區是否滿? else return(0);}86青島大學大學生創新中心傅強1.6.6宏定義宏定義給予常數可讀性#defineTXB使用宏定義時,要防止定點數溢出宏定義的用途廣泛增強程序的可移植性進行軟件版本的管理#defineVOLT_RATE (1000) /*比例系數*/...longVoltage;IntInputValue;...Voltage=InputValue*VOLT_RATE; /*可能溢出*/#defineVOLT_RATE (long(1000)) /*比例系數,強行整成long*/87青島大學大學生創新中心傅強使用宏定義時,要防止定點數溢出宏定義的用途廣泛#define1.7 可移植性可移植性是嵌入式軟件設計的重要思想用到不同的硬件,比如到數碼管用到不同的處理器,比如51到430,編程時應盡量消除硬件差異無法消除的差異,集中到小的局部來修改88青島大學大學生創新中心傅強1.7 可移植性可移植性是嵌入式軟件設計的重要思想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青島大學大學生創新中心傅強1.7.1消除差異例如用宏定義消除口操作的差異#inclu1.7.2消除硬件差異用宏定義消除硬件差異例如或數碼管的口,順序經常會改變/*宏定義,數碼管a~g、DP各段對應的比特,更換硬件只用改動以下8行*/#definea 0x01#defineb 0x02#definec 0x04#defined 0x08#definee 0x10#definef 0x20#defineg 0x40#defineDP 0x80/*宏定義自動生成段碼表,不要改動*/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青島大學大學生創新中心傅強1.7.2消除硬件差異用宏定義消除硬件差異/*宏定義,數碼用函數來消除硬件差異例如控制
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 旅游地產項目規劃設計中的旅游與文化創意產業融合報告
- 企業檔案技術管理辦法
- 臨時用工許可管理辦法
- 企業人才建設管理辦法
- 中試基地資金管理辦法
- 住房保障考核管理辦法
- 云南逗留人員管理辦法
- 企業自備油罐管理辦法
- 企業控制開支管理辦法
- 信息廣告制作管理辦法
- 裝修設計文件消防專篇
- 八年級物理浮力壓強專題經典計算題(含答案解析)
- GB/T 3211-2008金屬鉻
- GB/T 12703.7-2010紡織品靜電性能的評定第7部分:動態靜電壓
- ps6000自動化系統用戶操作及問題處理培訓
- 2023年韶關市法院書記員招聘筆試模擬試題及答案解析
- 革蘭氏陰性菌課件
- 聘用證書合集通用PPT模板
- 建筑工程文件歸檔管理明細表
- 海姆立克手法理論知識、臨床應用及注意事項考核試題與答案
- 堿性脫漆劑配方
評論
0/150
提交評論