C51程序設(shè)計(jì)代碼實(shí)例_第1頁(yè)
C51程序設(shè)計(jì)代碼實(shí)例_第2頁(yè)
C51程序設(shè)計(jì)代碼實(shí)例_第3頁(yè)
C51程序設(shè)計(jì)代碼實(shí)例_第4頁(yè)
C51程序設(shè)計(jì)代碼實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C51程序設(shè)計(jì)的菜單的代碼實(shí)例/* Module :Kbdmenu.cDate:Usage:P10P12 use to DownKey,UpKey,CRKey*/#include#include#define SIZE_OF_KEYBD_MENU 20 / 菜單長(zhǎng)度uchar KeyFuncIndex=0;uchar KeyFuncIndexNew=0;void (*KeyFuncPtr)(); / 按鍵功能指針typedef structuchar KeyStateIndex; /當(dāng)前狀態(tài)索引號(hào)uchar KeyDnState; 按下"向下"鍵時(shí)轉(zhuǎn)向的狀態(tài)索引號(hào) ucha

2、r KeyUpState; /按下"向上”鍵時(shí)轉(zhuǎn)向的狀態(tài)索引號(hào) uchar KeyCrState; 按下"回車"鍵時(shí)轉(zhuǎn)向的狀態(tài)索引號(hào) void (*CurrentOperate)(); /當(dāng)前狀態(tài)應(yīng)該執(zhí)行的功能操作 KbdTabStruct;KbdTabStruct code KeyTabSIZE_OF_KEYBD_MENU= 0, 0, 0, 1,(*DummyJob),/ 頂層 1,2, 0, 3,(*DspUserInfo),/ 第二層 2, 1, 1, 9,(*DspServiceInfo), / 第二層 3, 0, 0, 1,(*DspVoltInfo)

3、,/ 第三層 >>DspUserInfo 的展開 4, 0, 0, 1,(*DspCurrInfo), 第三層 >>DspUserInfo 的展開 5, 0, 0, 1,(*DspFreqInfo),/ 第三層 >>DspUserInfo 的展開 6, 0, 0, 1,(*DspCableInfo),/ 第三層 >>DspUserInfo 的展開 9, 0, 0, 1,(*DspSetV oltLevel)/ 第三層 >>DspServiceInfo 的展;void GetKeyInput(void)uchar KeyValue;Ke

4、yValue=P1&0x07; 去掉高 5bit delay(50000);switch(KeyValue)case 1: 回車鍵,找出新的菜單狀態(tài)編號(hào)KeyFuncIndex=KeyTabKeyFuncIndex.KeyCrState; break;case 2: 向上鍵,找出新的菜單狀態(tài)編號(hào)KeyFuncIndex=KeyTabKeyFuncIndex.KeyUpState; break;case 4: 向下鍵,找出新的菜單狀態(tài)編號(hào)KeyFuncIndex=KeyTabKeyFuncIndex.KeyDnState; break;default: /按鍵錯(cuò)誤的處理break;Key

5、FuncPtr=KeyTabKeyFuncIndex.CurrentOperate;(*KeyFuncPtr)();執(zhí)行當(dāng)前按鍵的操作/其中KeyTab的設(shè)計(jì)頗費(fèi)盡心機(jī)51單片機(jī)浮點(diǎn)數(shù)據(jù)存儲(chǔ)代碼實(shí)例Float浮點(diǎn)形。它是符合IEEE-754標(biāo)準(zhǔn)的單精度浮點(diǎn)形數(shù)據(jù),在十進(jìn)制中具有7位有效數(shù)字。FLOAT型據(jù)占用四個(gè)字節(jié)(32位二進(jìn)制數(shù)),在內(nèi)存中的存放格式如下:字節(jié)地址(由低到高)0123浮點(diǎn)數(shù)內(nèi)容MMMMMMMM MMMMMMMM E MMMMMMM S EEEEEEE其中,S為符號(hào)位,存放在最高字節(jié)的最高位。“1表示負(fù),“0表示正。E為階碼,占8位二進(jìn)制數(shù),存放在高兩個(gè)字節(jié)中。注意,階碼E值

6、是以2為底的指數(shù)再加上偏移量127,樣處理的目的是為了避免出現(xiàn)負(fù)的階碼值,而指數(shù)是可正可負(fù)的。階碼 E的正常取值范圍是1254,從而實(shí)際指數(shù)的取值范圍為-126-127。M為尾數(shù)的小數(shù)部分,用 23位二進(jìn)制數(shù)表示,存放在低三個(gè)字節(jié)中。尾數(shù)的整數(shù)部分永遠(yuǎn)為1,因此不予保存,但它是隱含的。小數(shù)點(diǎn)位于隱含的整數(shù)位 “1的后面。例如浮點(diǎn)數(shù)124.75 = 42F98000H在內(nèi)存中的存放格式為字節(jié)地址+0+1+2+3浮點(diǎn)數(shù)內(nèi)容 00000000100000001 1111001 0 1000010124.75D=1111100.11B=1.11110011*2E6階碼=6D+127D=133D=100

7、00101B符號(hào)位=0參考示例程序一:typedef unionfloat flt;unsigned char fltc4; Float;main()Float a;unsigned char i;a.flt=124.75;for(i = 0; i < 4; i+) printf("%xt",a.fltci);printf("n");參考示例程序二:main()float a;unsigned char i;unsigned char *j; a=124.75;j = (unsigned char *)&a; for(i = 0; i &l

8、t; 4; i+) printf("%xt",ji);printf("n");串口中斷程序設(shè)計(jì)代碼實(shí)例#include <reg52.h>/* UART Buffer Defines */#define UART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 bytes */#define UART_RX_BUFFER_MASK ( UART_RX_BUFFER_SIZE - 1 )#define UART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128

9、or 256 bytes */#define UART_TX_BUFFER_MASK ( UART_TX_BUFFER_SIZE - 1 )/* Static Variables */static data unsigned char UART_RxBufUART_RX_BUFFER_SIZE;static data volatile unsigned char UART_RxHead;static data volatile unsigned char UART_RxTail;static data unsigned char UART_TxBufUART_TX_BUFFER_SIZE;st

10、atic data volatile unsigned char UART_TxHead;static data volatile unsigned char UART_TxTail;bit fSeri0_Send_Ok;/* initialize UART */t2 做波特率發(fā)生器9600bps at 11.0592 MHzvoid InitUART()unsigned char x;T2CON = 0x30; /t2 做波特率發(fā)生器TH2 = 0xFF;TL2 = 0xdc;RCAP2H = 0xFF;RCAP2L = 0xdc;SCON = 0x50;/* SM0 SM1 SM2 REN

11、 TB8 RB8 TI RI:9 bit */PCON = 0x00;/* baut rate, 80h:double; 00h: normal */ES = 1;/* 串口中斷允許 1-enable */PS = 0;/*串口中斷優(yōu)先級(jí)1-高,0-低 */TR2 = 1;/* Start T2 as baut rate generator */ x = 0; /* flush receive buffer */ UART_RxTail = x;UART_RxHead = x;UART_TxTail = x; UART_TxHead = x; /* interrupt handlers */v

12、oid UART_interrupt( void ) interrupt 4一if (TI) / 是否是發(fā)送中斷unsigned char tmptail;TI=0;if (UART_TxTail=UART_TxHead)fSeri0_Send_Ok=0; /* 已發(fā)送完畢*/elsetmptail = ( UART_TxTail + 1 ) & UART_TX_BUFFER_MASK;UART_TxTail = tmptail; /* store new index */ SBUF = UART_TxBuftmptail; /* start transmition */ if (RI

13、)unsigned char revdata;unsigned char tmphead;RI=0;revdata = SBUF;tmphead = ( UART_RxHead + 1 ) & UART_RX_BUFFER_MASK;UART_RxHead = tmphead; /* store new index */UART_RxBuftmphead = revdata; /* store received data in buffer */ unsigned char ReceiveByte( void ) unsigned char tmptail;while ( UART_R

14、xHead = UART_RxTail ) /* wait for incomming data */ ;tmptail = ( UART_RxTail + 1 ) & UART_RX_BUFFER_MASK;/* calculate buffer index */UART_RxTail = tmptail; /* store new index */ return UART_RxBuftmptail; /* return data */ void TransmitByte( unsigned char senddata )unsigned char tmphead;tmphead =

15、 ( UART_TxHead + 1 ) & UART_TX_BUFFER_MASK;UART_TxBuftmphead = senddata; /* store data in buffer */ UART_TxHead = tmphead; /* store new index */if(fSeri0_Send_Ok=0)fSeri0_Send_Ok=1;TI=1;unsigned char DataInReceiveBuffer( void )return ( UART_RxHead != UART_RxTail );void main(void)InitUART();EA=1;

16、whileif (DataInReceiveBuffer()TransmitByte(ReceiveByte();一些常用的軟件濾波方法程序設(shè)計(jì)(C語(yǔ)言)1、限副濾波/* A值可根據(jù)實(shí)際情況調(diào)整value為有效值,new_value為當(dāng)前采樣值濾波程序返回有效的實(shí)層值*/#define A 10char value;char filter()char new_value;new_value = get_ad();if ( ( new_value - value > A ) | ( value - new_value > A ) return value;return new_val

17、ue;一2、中位值濾波法/* N值可根據(jù)實(shí)際情況調(diào)整排序采用冒泡法*/#define N 11char filter()char value_bufN;char count,i,j,temp;for ( count=0;count<N;count+)value_bufcount = get_ad();delay。;for (j=0;j<N-1;j+)for (i=0;i<N-j;i+)if ( value_buf >value_bufi+1) 一一temp = value_buf;value_buf = value_bufi+1;value_bufi+1 = temp;

18、 一return value_buf(N-1)/2;一3、算術(shù)平均濾波法/*/#define N 12char filter()int sum = 0;for ( count=0;count<N;count+)sum + = get_ad();delay();return (char)(sum/N);4、遞推平均濾波法(又稱滑動(dòng)平均濾波法)/*/#define N 12char value_bufN;char i=0;char filter()char count;int sum=0;value_bufi+ = get_ad();if ( i = N ) i = 0;for ( coun

19、t=0;count<N,count+) sum = value_bufcount;return (char)(sum/N); 5、中位值平均濾波法(又稱防脈沖干擾平均濾波法)/*/#define N 12char filter()char count,i,j;char value_bufN;int sum=0;for (count=0;count<N;count+)value_bufcount = get_ad();delay();for (j=0;j<N-1;j+)for (i=0;i<N-j;i+)if ( value_buf >value_bufi+1 )t

20、emp = value_buf;value_buf = value_bufi+1;value_bufi+1 = temp;for(count=1;count<N-1;count+) sum += valuecount;return (char)(sum/(N-2); 6、限幅平均濾波法/*/略 參考子程序1 、 37、一階滯后濾波法/* 為加快程序處理速度假定基數(shù)為100, a=0100 */#define a 50char value;char filter()char new_value;new_value = get_ad();return (100-a)*value + a*ne

21、w_value; 8、加權(quán)遞推平均濾波法/* coe 數(shù)組為加權(quán)系數(shù)表,存在程序存儲(chǔ)區(qū)。*/#define N 12 char code coeN = 1,2,3,4,5,6,7,8,9,10,11,12;char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;char filter()char count;char value_bufN;int sum=0;for (count=0,count<N;count+)value_bufcount = get_ad();delay();for (count=0,count<N;count+)sum

22、+= value_bufcount*coecount;return (char)(sum/sum_coe);9、消抖濾波法#define N 12 char filter。char count=0;char new_value;new_value = get_ad();while (value !=new_value);一count+;if (count>=N) return new_value; delay();new_value = get_ad(); 一一return value;數(shù)字濾波常用的軟件方法代碼實(shí)例數(shù)字濾波常用的軟件濾波方法很多,下面介紹幾種常用的數(shù)字濾波方法。在微機(jī)控

23、制系統(tǒng)的模擬輸入信號(hào)中,一般均含有各種噪聲和干擾,他們來(lái)自被測(cè)信號(hào)源本身、傳感器、外界干擾等。為了進(jìn)行準(zhǔn)確測(cè)量和控制,必須消除被測(cè)信號(hào)中的噪聲和干擾。噪聲有 2大類:一類為周期性的,其典型代表為50 Hz的工頻干擾,對(duì)于這類信號(hào),采用積分時(shí)間等于20 ms整倍數(shù)的雙積分A/D轉(zhuǎn)換器,可有效地消除其影響;另一類為非周期的不規(guī)則隨機(jī)信號(hào),對(duì)于隨機(jī)干擾,可以用數(shù)字濾 波方法予以削弱或?yàn)V除。所謂數(shù)字濾波,就是通過(guò)一定的計(jì)算或判斷程序減少干擾信號(hào)在有用信號(hào)中的 比重,因此他實(shí)際上是一個(gè)程序?yàn)V波。數(shù)字濾波器克服了模擬濾波器的許多不足,他與模擬濾波器相比有以下優(yōu)點(diǎn):(1)數(shù)字濾波器是用軟件實(shí)現(xiàn)的,不需要增加

24、硬設(shè)備,因而可靠性高、穩(wěn)定性好,不存在阻抗匹配問(wèn)題。(2)模擬濾波器通常是各通道專用,而數(shù)字濾波器則可多通道共享,從而降低了成本。(3)數(shù)字濾波器可以對(duì)頻率很低 (如0.01 Hz)的信號(hào)進(jìn)行濾波,而模擬濾波器由于受電容容量的限制,頻 率不可能太低。(4)數(shù)字濾波器可以根據(jù)信號(hào)的不同,采用不同的濾波方法或?yàn)V波參數(shù),具有靈活、方便、功能強(qiáng)的 特點(diǎn)。10種軟件濾波方法的示例程序OurWay 發(fā)表于 2005-9-2 22:24:0010種軟件濾波方法的示例程序 (JKRL)假定從8位AD中讀取數(shù)據(jù)(如果是更高位的AD可定義數(shù)據(jù)類型為int),子程序?yàn)間et_ad();1、限副濾波A、方法:根據(jù)經(jīng)驗(yàn)

25、判斷,確定兩次采樣允許的最大偏差值(設(shè)為 A),每次檢測(cè)到新值時(shí)判斷:如果 本次值與上次值之差 <=A,則本次值有效。如果本次值與上次值之差>A,則本次值無(wú)效,放棄本次值,用上次值代替本次值B、優(yōu)點(diǎn):能有效克服因偶然因素引起的脈沖干擾。C、缺點(diǎn):無(wú)法抑制那種周期性的干擾,平滑度差。/* A值可根據(jù)實(shí)際情況調(diào)整value為有效值,new_value為當(dāng)前采樣值濾波程序返回有效的實(shí)琮值*/#define A 10char value;char filter()char new_value;new_value = get_ad();if ( ( new_value - value >

26、; A ) | ( value - new_value > A ) return value;return new_value;2、中位值濾波法A、方法:連續(xù)采樣 N次(N取奇數(shù)),把N次采樣值按大小排列,取中間值為本次有效值。B、優(yōu)點(diǎn):能有效克服因偶然因素引起的波動(dòng)干擾,對(duì)溫度、液位的變化緩慢的被測(cè)參數(shù)有良好的 濾波效果。C、缺點(diǎn):對(duì)流量、速度等快速變化的參數(shù)不宜。/* N 值可根據(jù)實(shí)際情況調(diào)整排序采用冒泡法*/#define N 11char filter()char value_bufN;char count,i,j,temp;for ( count=0;count<N;co

27、unt+)value_bufcount = get_ad();delay();for (j=0;j<N-1;j+)for (i=0;i<N-j;i+)if ( value_bufi>value_bufi+1 )temp = value_bufi;value_bufi = value_bufi+1;value_bufi+1 = temp;return value_buf(N-1)/2;3、算術(shù)平均濾波法A、方法:連續(xù)取N個(gè)采樣值進(jìn)行算術(shù)平均運(yùn)算。N值較大時(shí):信號(hào)平滑度較高,但靈敏度較低;N值較小時(shí):信號(hào)平滑度較低,但靈敏度較高。N值的選?。阂话懔髁浚琋=12;壓力:N=4B 、

28、優(yōu)點(diǎn):適用于對(duì)一般具有隨機(jī)干擾的信號(hào)進(jìn)行濾波,這樣信號(hào)的特點(diǎn)是有一個(gè)平均值,信號(hào)在某一數(shù)值范圍附近上下波動(dòng)。C、缺點(diǎn):對(duì)于測(cè)量速度較慢或要求數(shù)據(jù)計(jì)算速度較快的實(shí)時(shí)控制不適用,比較浪費(fèi)RAM o#define N 12 char filter() int sum = 0;for ( count=0;count<N;count+)sum + = get_ad();delay();return (char)(sum/N);4、遞推平均濾波法(又稱滑動(dòng)平均濾波法)A、 方法: 把連續(xù)取N 個(gè)采樣值看成一個(gè)隊(duì)列,隊(duì)列的長(zhǎng)度固定為N, 每次采樣到一個(gè)新數(shù)據(jù)放入隊(duì)尾,并扔掉原來(lái)隊(duì)首的一次數(shù)據(jù).(先進(jìn)先

29、出原則),把隊(duì)列中的N 個(gè)數(shù)據(jù)進(jìn)行算術(shù)平均運(yùn)算,就可獲得新的濾波結(jié)果。N值的選?。毫髁?,N=12;壓力:N=4;液面,N=412;溫度,N=14#define N 12char value_bufN;char i=0;char filter()char count;int sum=0;value_bufi+ = get_ad();if ( i = N ) i = 0;for ( count=0;count<N,count+)sum = value_bufcount;return (char)(sum/N);5、中位值平均濾波法(又稱防脈沖干擾平均濾波法)A、方法:相當(dāng)于 中位值濾波法”

30、+算術(shù)平均濾波法”。連續(xù)采樣N個(gè)數(shù)據(jù),去掉一個(gè)最大值和一個(gè)最小值,然后計(jì)算N-2 個(gè)數(shù)據(jù)的算術(shù)平均值。N 值的選?。?14B 、優(yōu)點(diǎn):融合了兩種濾波法的優(yōu)點(diǎn),對(duì)于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的采樣值偏差。C、缺點(diǎn):測(cè)量速度較慢,和算術(shù)平均濾波法#define N 12 char filter() char count,i,j;char value_bufN;int sum=0;for (count=0;count<N;count+)value_bufcount = get_ad();delay();for (j=0;j<N-1;j+)for (i=0;i<N

31、-j;i+)if ( value_bufi>value_bufi+1 ) temp = value_bufi;value_bufi = value_bufi+1;value_bufi+1 = temp;for(count=1;count<N-1;count+) sum += valuecount;return (char)(sum/(N-2);6、限幅平均濾波法A 、方法:相當(dāng)于“限幅濾波法” +遞推平均濾波法 “列進(jìn)行遞推平均濾波處理。RAM 。,每次采樣到的新數(shù)據(jù)先進(jìn)行限幅處理,再送入隊(duì)B 、優(yōu)點(diǎn):融合了兩種濾波法的優(yōu)點(diǎn),對(duì)于偶然出現(xiàn)的脈沖性干擾,可消除由于脈沖干擾所引起的 采

32、樣值偏差。C、缺點(diǎn):比較浪費(fèi) RAM。 /*/略 參考子程序1 、 37、一階滯后濾波法A、方法:取a=01,本次濾波結(jié)果=(1-a) *本次采樣值+a*上次濾波結(jié)果。B 、優(yōu)點(diǎn):對(duì)周期性干擾具有良好的抑制作用,適用于波動(dòng)頻率較高的場(chǎng)合。C、缺點(diǎn):相位滯后,靈敏度低,滯后程度取決于a值大小,不能消除濾波頻率高于采樣頻率的1/2 的干擾信號(hào)。/* 為加快程序處理速度假定基數(shù)為100, a=0100 */#define a 50char value;char filter()char new_value;new_value = get_ad();return (100-a)*value + a*new_value;8、加

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論