EDN首页   博客首页

最新日志

发表于:2008-3-27 14:40:51
标签:无标签

1

数字滤波C程序

/***************************** 数字滤波C程 *************************/

/////////////////////////////////限副滤波///////////////////
/*滤波程序返回有效的实际值*/

#define A 10      //A值可根据实际情况调整
char value;       //value为有效值
char filter()
{
char new_value;   //new value为当前采样值
new value="get"_ad();
if ((new_value-value>A)‖(value-new_value> A)
return value;
return new_value;
}

/////////////////////////中位值滤波/////////////////////////

#define N 11      //N值可根据实际情况调整
char filter()
{
char value_buf[N];
char count,i,j,temp;
for (count=0;count<N;count++)
{
value_buf[count]=get_ad();  //获取采样值
delay();
}
for (j=0;j<N-1;j++)   //采样值由小到大排列,排序采用冒泡法
{
for (i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}
return value_buf[(N-1)/2];   //取中间值
}

/////////////////////////算术平均滤波//////////////////////

#define N 12
char filter()
{
int sum="0";
for(count=0;count<N;count++)
{
sum+=get_ad();
delay();
}
return (char)(sum/N);
}


///////////////////去极值平均滤波  //////////////////////

#define N 11      //N值可根据实际情况调整
int sum="0";

char filter()
{
char value_buf[N];
char count,i,j,temp;
for (count=0;count<N;count++)
{
value_buf[count]=get_ad();    //获取采样值
delay();
}
for (j=0;j<N-1;j++)  //采样值由小到大排列,排序采用冒泡法
{
for (i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}

for(count=1;count<(N-1);count++)    //去掉第一个和末一个数
{
sum+=value_buf[count];
delay();
}
return (char)(sum/(N-2));
}

///////////////////移动平均滤波(递推平均滤波)///////////

#define N 12
char value_buf[N];
char i="0";
char filter()
{
char count;
int sum="0";
value_buf[i++]=get_ad();
if(i=N) i=0;
for (count=0;count<N;count++)
sum+=value_buf[count];
return (char)(sum/N)

}


//////////////////////加权平均滤波///////////////////////
#define N 12
char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//加权系数表
char code sum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buf[N];
int sum="0";
for (count=0;count<N;count++)
{value_buf[count]=get_ad();    //获取采样值
delay();
}
for (count=0;count<N;count++)
sum+=value_buf[count]*jq[count];
return (char)(sum/sum_jq);
}


/////////////////////////低通滤波////////////////////////

#define a  0.25
char value;       //value为已有值
char filter()
{
char new_value;   //new value为当前采样值
new_value=get_ad();
return (a*new_value+(1-a)*value);
}

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(175)
发表于:2008-3-27 14:40:30
标签:无标签

1

数字滤波C程序

/***************************** 数字滤波C程 *************************/

/////////////////////////////////限副滤波///////////////////
/*滤波程序返回有效的实际值*/

#define A 10      //A值可根据实际情况调整
char value;       //value为有效值
char filter()
{
char new_value;   //new value为当前采样值
new value="get"_ad();
if ((new_value-value>A)‖(value-new_value> A)
return value;
return new_value;
}

/////////////////////////中位值滤波/////////////////////////

#define N 11      //N值可根据实际情况调整
char filter()
{
char value_buf[N];
char count,i,j,temp;
for (count=0;count<N;count++)
{
value_buf[count]=get_ad();  //获取采样值
delay();
}
for (j=0;j<N-1;j++)   //采样值由小到大排列,排序采用冒泡法
{
for (i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}
return value_buf[(N-1)/2];   //取中间值
}

/////////////////////////算术平均滤波//////////////////////

#define N 12
char filter()
{
int sum="0";
for(count=0;count<N;count++)
{
sum+=get_ad();
delay();
}
return (char)(sum/N);
}


///////////////////去极值平均滤波  //////////////////////

#define N 11      //N值可根据实际情况调整
int sum="0";

char filter()
{
char value_buf[N];
char count,i,j,temp;
for (count=0;count<N;count++)
{
value_buf[count]=get_ad();    //获取采样值
delay();
}
for (j=0;j<N-1;j++)  //采样值由小到大排列,排序采用冒泡法
{
for (i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}

for(count=1;count<(N-1);count++)    //去掉第一个和末一个数
{
sum+=value_buf[count];
delay();
}
return (char)(sum/(N-2));
}

///////////////////移动平均滤波(递推平均滤波)///////////

#define N 12
char value_buf[N];
char i="0";
char filter()
{
char count;
int sum="0";
value_buf[i++]=get_ad();
if(i=N) i=0;
for (count=0;count<N;count++)
sum+=value_buf[count];
return (char)(sum/N)

}


//////////////////////加权平均滤波///////////////////////
#define N 12
char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12};//加权系数表
char code sum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buf[N];
int sum="0";
for (count=0;count<N;count++)
{value_buf[count]=get_ad();    //获取采样值
delay();
}
for (count=0;count<N;count++)
sum+=value_buf[count]*jq[count];
return (char)(sum/sum_jq);
}


/////////////////////////低通滤波////////////////////////

#define a  0.25
char value;       //value为已有值
char filter()
{
char new_value;   //new value为当前采样值
new_value=get_ad();
return (a*new_value+(1-a)*value);
}

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(292)
发表于:2008-3-25 20:18:02
标签:无标签

0

ADC0809A/D转换器基本应用技术

系统分类: 模拟技术   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(148)
发表于:2008-3-25 20:16:15
标签:无标签

1

AT24C04 读写程序

2404 是一个4KB的EEPROM,具有1,000,000次擦写周期,数据保存100年不变,非挥发性存

;介质,I2C总线形式,页面存储方式,能方便地读写数据,数据保存安全可靠。

;本程序主要为AT24C04的读写程序,具有单字节读、写;多字节连续读、写等方式。

 

        BEEP        BIT        P3.7                 ;蜂鸣器定义

        MDIO        BIT        P2.5                 ;EEPROM数据输入输出口

        MCLK        BIT        P2.4                 ;EEPROM时钟口线

        MEM_R1      EQU        0BH                  ;延时寄存器1

        MEM_R2      EQU        0CH                  ;延时寄存器2

 

        WP           BIT        P2.3                  ;EEPROM写保护,高电平保护

    

        AD0          BIT        P2.0                   ;EEPROM地址A0

        AD1          BIT        P2.1                   ;EEPROM地址A1

        AD2          BIT        P2.2                   ;EEPROM地址A2

 

        DATA_A       EQU        20H                    ;地址缓冲区

 

        ORG 00H                                        ;程序开始

        JMP MAIN                                       ;主程序

       

         ORG 30H                                      ;主程序开始 30H

 

MAIN:     MOV SP,#30H                                 ;设置堆栈

          LCALL REST                                  ;初始化

          MOV DATA_A,#00H                             ;数据在AT24C04中的首地址                         

          MOV R1,#0                                   ;待存数据首地址

          MOV R0,#255                                 ;需要存储的数据数量

LP:       MOV A,R1                                    ;获得首地址

          MOV DPTR,#TAB                               ;查数据表

          MOVC A,@A+DPTR                              ;得到数据

          JZ LPE                                      ;如果为0返回

          MOV B,A                                     ;寄存

          MOV DPH,DATA_A                              ;数据在AT24C04中的地址

          Lcall wt_mem                                ;写入一个字节数据

          INC DATA_A                                  ;准备下一个地址

          INC R1                                      ;准备下一个数据

          JMP LP                                      ;重复写入

LPE:  MOV DPH,#00H                                    ;要读取的数据地址

          MOV B,#00H                                  ;寄存器清零

          LCALL RD_MEM                                ;读取数据从AT24C04

          MOV P1,B                                    ;数据从P1口反映出来

          JMP $                                       ;停止

 

REST:                                                    ;初始化

           CLR AD0                                       ;给AT24C04的地址端清零

           CLR AD1                                       ;

           CLR AD2                                       ;

           CLR WP                                        ;清除写保护

           CLR MCLK                                      ;时钟为低

           CLR MDIO                                      ;数据为低

           MOV P0,#00H                                   ;禁止数码管显示

           CLR BEEP                                      ;禁止蜂鸣器           

         RET

;****************  AT24C04  操作程序  ****************

WT_MEM:                                              ;写入的地址在DPH中,数据在B中

      ACALL MEM_START                                ;给AT24C04开始信号

      MOV A,#0A0H                                    ;"写"命令字+片选地址信息

      ACALL WR1                                      ;写入以上信息

MWRITE2:             

      MOV A,DPH                                      ;准备写入片内地址信息

      ACALL WR1                                      ;写入

      MOV A,B                                        ;准备数据

      ACALL WR1                                      ;写入数据

      ACALL MEM_STOP                                 ;发送停止信号,

                                                     ;如果要重复写,可以不发结束信号,

                                                     ;返回MWRITE2继续写下一个数据

                                                     ;写完后发送结束信号。

      RET                                            ;返回,一个字节写结束

 

;**********  AT24CXX  读字节程序   ***************************

; 要读入的地址信息在DPH中,返回的读取数据在B中

 

RD_MEM:       

      ACALL MEM_START                     ;发送开始信号

      MOV   A,#0A0H                       ;"写"命令字+片选地址信号

      ACALL WR1                           ;写入以上信息

      MOV   A,DPH                         ;准备片内信息

      ACALL WR1                           ;写入片地址信息

      ACALL MEM_START                     ;重复发送开始信号,这里和写不同

      MOV A,#0A1H                         ;准备命令字(读)+片选地值

      ACALL WR1                           ;写入以上信息

      CLR    A                            ;准备接收读取的数据

      MOV   DPL,#08H                      ;数据位数

      CLR MCLK                            ;时钟为低

RD1: SETB  MCLK                           ;时钟上跳

      NOP                                 ;等待数据出现

      LCALL MDELAY                        ;延时等待

      MOV   C,MDIO                        ;数据移入C

      RLC   A                             ;数据移入寄存器A

      CLR   MCLK                          ;时钟下跳,准备读取下一位数据

      LCALL MDELAY  

      DJNZ  DPL,RD1                       ;没有读完则继续,否则返回

      MOV   B,A                           ;数据送B

      ACALL MEM_STOP                      ;发送结束信号

      RET                                 ;返回,

 

WR1: MOV   MEM_R1,#08H                   ;写入8个字节数

  WR2: RLC   A                            ;A带进位左移

       MOV   MDIO,C                       ;数据输出一位

       SETB  MCLK                         ;向AT24C04锁存数据

       ACALL MDELAY                       ;等待

       CLR   MCLK                         ;准备写入下一个字节数据

       ACALL MDELAY                       ;等待

       DJNZ  MEM_R1,WR2                   ;没有写完,继续

                                                          ;

WR4:      LCALL MDELAY                   ;等待写完8字节信息

           SETB MCLK                      ;发送第9个时钟作为应答信号

           LCALL MDELAY                   ;等待,AT24C04应答信号

           CLR    MCLK                    ;完成,清除时钟

       RET                                ;返回

 

;***********  发送开始信号  ********************

;开始信号:在时钟为高电平,数据线出现下跳;

 

MEM_START:           SETB  MDIO            ;数据线高电平

                     SETB   MCLK           ;时钟提高        

                     NOP                   ;等待电平稳定

                     CLR   MDIO            ;数据下跳作为开始信号

                     ACALL MDELAY          ;延时

                     CLR   MCLK            ;时钟下跳

                     ACALL MDELAY          ;等待一段时间

                     RET                           ;返回

;**********  发送停止信号   *********************

;停止信号:在时钟为高电平,数据线出现上跳;

MEM_STOP:           SETB MCLK                      ;时钟线高                   

                    ACALL MDELAY                   ;等待电平稳定

                    SETB MDIO                      ;数据线高,停止信号    

                    ACALL MDELAY                   ;等待

                    LCALL DELAY20MS                ;写周期延时

                   ; LCALL DELAY20MS                ;延时

                   RET                             ;返回

 

MDELAY:                                            ;短时间延时

               MOV MEM_R2,#04H      

LOOP:          NOP

               DJNZ MEM_R2,LOOP

               RET

 

DELAY20MS:                                        ;20ms延时

           MOV    R5,#40

  DELAY1:  MOV    R4,#00H

  DELAY2:  DJNZ   R4,DELAY2

           DJNZ   R5,DELAY1

           RET

; ************  这张表格位要写入AT24C04的数据  ***********************

;  "  HEJOIN "

;  "  LiZaoping"

;  "  ZHEJIANGHAIYAN"

;  "  HTTP://WWW.HEJOIN.COM"

;  "  Email:Hejoin@163.net"

 

TAB:       DB  ‘H‘,  ‘E‘,  ‘J‘,  ‘O‘,  ‘I‘,  ‘N‘, 0AH

           DB  ‘L‘,  ‘i‘,  ‘Z‘,  ‘a‘,  ‘o‘,  ‘p‘,  ‘i‘,   ‘n‘,  ‘g‘, 0AH

           DB  ‘Z‘,  ‘H‘,  ‘E‘,  ‘J‘,  ‘I‘,  ‘A‘,  ‘N‘,   ‘G‘,  ‘H‘, ‘A‘,  ‘I‘,  ‘Y‘,  ‘A‘,  ‘N‘,0AH

           DB  ‘H‘,  ‘T‘,  ‘T‘,  ‘P‘,  ‘/‘,  ‘/‘,   ‘:‘,   ‘W‘, ‘W‘, ‘W‘,  ‘.‘,  ‘H‘,  ‘E‘,  ‘J‘,  ‘O‘,  ‘I‘,  ‘N‘,  ‘.‘,  ‘C‘, ‘O‘,  ‘M‘,0AH

           DB  ‘E‘,  ‘m‘,  ‘a‘,  ‘i‘,   ‘l‘,  ‘:‘,  ‘H‘,  ‘e‘,  ‘j‘, ‘o‘,  ‘i‘,  ‘n‘,  ‘@‘, ‘1‘,  ‘6‘, ‘3‘,  ‘.‘,  ‘n‘,  ‘e‘,  ‘t‘,0AH

           db   00h   

END

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(254)
发表于:2008-3-25 20:13:59
标签:无标签

2

C和汇编混合编程的一点经验之谈

本人在调试混合编程的程序时,苦于资料太少,结果折腾了两天才调通。对于混合编程的方法初有体会,不敢独享,特发此贴,以飨众网友。

  C调用汇编有两种方法,一是直接在C中插入汇编语句,而是用汇编编写一个子程序,供C调用。方法一适用于类似看门狗复位这样的只需一两句汇编就能完成的场合;方法二更为通用,比如用汇编编写延时子程序,就能实现精确延时。下面讨论一下方法二的注意事项。

  1。函数声明: C中在函数前加extern声明此函数为外部函数,在汇编中要声明函数名为全局变量,如:

  extern void delay(void) ;  /*in C*/

  globl delay   ; in asm

_delay:   ; delay function begins

2 参数传递 :一般是用寄存器传递参数的,比如ImageCraft,就用人R16,R17,R18,R19充电输入参数,用R16,R17传递返回结果。如果返回结果需要多个字节才能表示,最好用SRAM充电结果,即在汇编中,把结果存入SRAM中,在C中读取相应的地址。

3 保存寄存器。 一些寄存器在调用子程序时,内容是不能被改变的,这些寄存器称为Reserved register,如果汇编子程序用到了这些寄存器,就要在程序入口出将它们入栈,程序返回时再出栈。

 

系统分类: 单片机   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(220)
发表于:2008-3-25 20:13:06
标签:无标签

1

51的汇编控制指令详细列表

 

 

 

 8051 INSTRUCTION SET

 

1.Arithmetic operations:

  

    Mnemonic            Byte    Cyc

    ADD   A,@Ri 1 1

    ADD   A,Rn 1 1       

    ADD   A,direct 2 1       

    ADD   A,#data 2 1       

    ADDC  A,@Ri 1 1          

    ADDC  A,Rn 1 1    

    ADDC  A,direct 2 1          

    ADDC  A,#data 2 1    

    SUBB  A,@Ri 1 1    

    SUBB  A,Rn 1 1    

    SUBB  A,direct 2 1    

    SUBB  A,#data 2 1    

    INC   A 1 1

    INC   @Ri 1 1

    INC   Rn 1 1

    INC   DPTR 1 1

    INC   direct 2 1

    INC   direct 2 1

    DEC   A 1 1

    DEC   @Ri 1 1

 &nbs