C51程序设计代码实例_第1页
C51程序设计代码实例_第2页
C51程序设计代码实例_第3页
C51程序设计代码实例_第4页
C51程序设计代码实例_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C51程序设计的菜单的代码实例/* Module :Kbdmenu.cDate:Usage:P10P12 use to DownKey,UpKey,CRKey*/#include#include#define SIZE_OF_KEYBD_MENU 20 / 菜单长度uchar KeyFuncIndex=0;uchar KeyFuncIndexNew=0;void (*KeyFuncPtr)(); / 按键功能指针typedef structuchar KeyStateIndex; /当前状态索引号uchar KeyDnState; 按下"向下"键时转向的状态索引号 ucha

2、r KeyUpState; /按下"向上”键时转向的状态索引号 uchar KeyCrState; 按下"回车"键时转向的状态索引号 void (*CurrentOperate)(); /当前状态应该执行的功能操作 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: 回车键,找出新的菜单状态编号KeyFuncIndex=KeyTabKeyFuncIndex.KeyCrState; break;case 2: 向上键,找出新的菜单状态编号KeyFuncIndex=KeyTabKeyFuncIndex.KeyUpState; break;case 4: 向下键,找出新的菜单状态编号KeyFuncIndex=KeyTabKeyFuncIndex.KeyDnState; break;default: /按键错误的处理break;Key

5、FuncPtr=KeyTabKeyFuncIndex.CurrentOperate;(*KeyFuncPtr)();执行当前按键的操作/其中KeyTab的设计颇费尽心机51单片机浮点数据存储代码实例Float浮点形。它是符合IEEE-754标准的单精度浮点形数据,在十进制中具有7位有效数字。FLOAT型据占用四个字节(32位二进制数),在内存中的存放格式如下:字节地址(由低到高)0123浮点数内容MMMMMMMM MMMMMMMM E MMMMMMM S EEEEEEE其中,S为符号位,存放在最高字节的最高位。“1表示负,“0表示正。E为阶码,占8位二进制数,存放在高两个字节中。注意,阶码E值

6、是以2为底的指数再加上偏移量127,样处理的目的是为了避免出现负的阶码值,而指数是可正可负的。阶码 E的正常取值范围是1254,从而实际指数的取值范围为-126-127。M为尾数的小数部分,用 23位二进制数表示,存放在低三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含的。小数点位于隐含的整数位 “1的后面。例如浮点数124.75 = 42F98000H在内存中的存放格式为字节地址+0+1+2+3浮点数内容 00000000100000001 1111001 0 1000010124.75D=1111100.11B=1.11110011*2E6阶码=6D+127D=133D=100

7、00101B符号位=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");串口中断程序设计代码实例#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 做波特率发生器9600bps at 11.0592 MHzvoid InitUART()unsigned char x;T2CON = 0x30; /t2 做波特率发生器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;/*串口中断优先级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) / 是否是发送中断unsigned char tmptail;TI=0;if (UART_TxTail=UART_TxHead)fSeri0_Send_Ok=0; /* 已发送完毕*/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();一些常用的软件滤波方法程序设计(C语言)1、限副滤波/* A值可根据实际情况调整value为有效值,new_value为当前采样值滤波程序返回有效的实层值*/#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值可根据实际情况调整排序采用冒泡法*/#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、算术平均滤波法/*/#define N 12char filter()int sum = 0;for ( count=0;count<N;count+)sum + = get_ad();delay();return (char)(sum/N);4、递推平均滤波法(又称滑动平均滤波法)/*/#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、一阶滞后滤波法/* 为加快程序处理速度假定基数为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、加权递推平均滤波法/* coe 数组为加权系数表,存在程序存储区。*/#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;数字滤波常用的软件方法代码实例数字滤波常用的软件滤波方法很多,下面介绍几种常用的数字滤波方法。在微机控

23、制系统的模拟输入信号中,一般均含有各种噪声和干扰,他们来自被测信号源本身、传感器、外界干扰等。为了进行准确测量和控制,必须消除被测信号中的噪声和干扰。噪声有 2大类:一类为周期性的,其典型代表为50 Hz的工频干扰,对于这类信号,采用积分时间等于20 ms整倍数的双积分A/D转换器,可有效地消除其影响;另一类为非周期的不规则随机信号,对于随机干扰,可以用数字滤 波方法予以削弱或滤除。所谓数字滤波,就是通过一定的计算或判断程序减少干扰信号在有用信号中的 比重,因此他实际上是一个程序滤波。数字滤波器克服了模拟滤波器的许多不足,他与模拟滤波器相比有以下优点:(1)数字滤波器是用软件实现的,不需要增加

24、硬设备,因而可靠性高、稳定性好,不存在阻抗匹配问题。(2)模拟滤波器通常是各通道专用,而数字滤波器则可多通道共享,从而降低了成本。(3)数字滤波器可以对频率很低 (如0.01 Hz)的信号进行滤波,而模拟滤波器由于受电容容量的限制,频 率不可能太低。(4)数字滤波器可以根据信号的不同,采用不同的滤波方法或滤波参数,具有灵活、方便、功能强的 特点。10种软件滤波方法的示例程序OurWay 发表于 2005-9-2 22:24:0010种软件滤波方法的示例程序 (JKRL)假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();1、限副滤波A、方法:根据经验

25、判断,确定两次采样允许的最大偏差值(设为 A),每次检测到新值时判断:如果 本次值与上次值之差 <=A,则本次值有效。如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰。C、缺点:无法抑制那种周期性的干扰,平滑度差。/* A值可根据实际情况调整value为有效值,new_value为当前采样值滤波程序返回有效的实琮值*/#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、方法:连续采样 N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。B、优点:能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的 滤波效果。C、缺点:对流量、速度等快速变化的参数不宜。/* N 值可根据实际情况调整排序采用冒泡法*/#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、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算。N值较大时:信号平滑度较高,但灵敏度较低;N值较小时:信号平滑度较低,但灵敏度较高。N值的选取:一般流量,N=12;压力:N=4B 、

28、优点:适用于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费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、递推平均滤波法(又称滑动平均滤波法)A、 方法: 把连续取N 个采样值看成一个队列,队列的长度固定为N, 每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先

29、出原则),把队列中的N 个数据进行算术平均运算,就可获得新的滤波结果。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、方法:相当于 中位值滤波法”

30、+算术平均滤波法”。连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2 个数据的算术平均值。N 值的选取:314B 、优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差。C、缺点:测量速度较慢,和算术平均滤波法#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 、方法:相当于“限幅滤波法” +递推平均滤波法 “列进行递推平均滤波处理。RAM 。,每次采样到的新数据先进行限幅处理,再送入队B 、优点:融合了两种滤波法的优点,对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的 采

32、样值偏差。C、缺点:比较浪费 RAM。 /*/略 参考子程序1 、 37、一阶滞后滤波法A、方法:取a=01,本次滤波结果=(1-a) *本次采样值+a*上次滤波结果。B 、优点:对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。C、缺点:相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2 的干扰信号。/* 为加快程序处理速度假定基数为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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论