一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
楼主: gw168sh

[其他综合] 请教单片机采集电压数字滤波怎么弄的

  [复制链接]
发表于 2012-6-2 18:03 | 显示全部楼层
先求和的,就是我说的累加

最大,最小值是单独的变量保存
回复

使用道具 举报

 楼主| 发表于 2012-6-8 12:38 | 显示全部楼层
现在可以分离出最大和最小了,
可以使怎么把最大和最小给踢出来呢?
回复

使用道具 举报

 楼主| 发表于 2012-6-8 12:59 | 显示全部楼层
我现在把所有的加起来,然后在减去最大,最小, 再除以8,这样可以了,
笨办法,哈哈。
回复

使用道具 举报

发表于 2012-6-8 15:44 | 显示全部楼层
晕!就是这样办的呀
回复

使用道具 举报

 楼主| 发表于 2012-6-8 20:42 | 显示全部楼层
回复 14# yanjian


    看来遇到问题还是多动动脑子好。
回复

使用道具 举报

发表于 2012-6-8 21:26 | 显示全部楼层
加权平均数,基本算法...
根据单片机编译,可以用8的倍数,算法有效率点
回复

使用道具 举报

 楼主| 发表于 2012-6-9 20:08 | 显示全部楼层
本帖最后由 gw168sh 于 2012-6-9 21:24 编辑

奇怪了用Proteus仿真没问题,下载到板上总是跳。
帮看看是哪里的问题。4M晶振
会不会是单片机或者是万能板飞线的事?

刚才出去下,又重新开机稳定了,难道是USB供电的事?


  1. #include <pic.h> //
  2. #include <stdio.h> //
  3. #include <math.h> //
  4. #define uchar unsigned char //
  5. #define uint unsigned int //
  6. __CONFIG(0x3fb1); //11101100110001 4m xt


  7. #define Setbit(y,x) y|=(1<<(x)) //setb(p1,2); p12=1;
  8. #define Clrbit(y,x) y&=~(1<<(x)) //clrb(p1,2); p12=0;
  9. #define Getbit(y,x) (0x01&(y>>(x))) //获取某一位值

  10. void ping(void);
  11. void pingjun(void);
  12. void init(void); //
  13. void display(uchar qian,uchar bai,uchar shi,uchar ge);
  14. void read_adc(void);
  15. static volatile unsigned char ADRES @ 0x1E;
  16. bit adbz;//

  17. bank1 uint a[12];//定义存放A/D转换结果的数组,在bank0中
  18. uint i,j,k; //定义几个整型变量
  19. uint uo,bai,qian;
  20. uchar ge,shi,temp,del; //,gewei,shiwei,baiwei,qianwei

  21. unsigned long V,V1,shu1,AD1,AD0;
  22. uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //
  23. /*延时函数*/
  24. //*********************************//
  25. void delay_10ms() //
  26. { uint x; //
  27. for(x=0;x<2200;x++) //
  28. {;} //
  29. } //
  30. //*********************************
  31. void delay_50us() //
  32. { uchar x; //
  33. for(x=0;x<20;x++) //20
  34. {;} //
  35. } //
  36. //=================================
  37. //延时最大255毫秒
  38. //=================================
  39. void delay_ms(uchar ms) //
  40. {
  41. uchar w,q; //
  42. for(w=0;w<ms;w++) //
  43. for(q=0;q<86;q++) //
  44. {
  45. #asm //
  46. nop //
  47. nop //
  48. #endasm //
  49. }
  50. }

  51. void init()
  52. {
  53. PORTB = 0xff;//PD口输出全1
  54. TRISB = 0x00;//设置方向寄存器为输出

  55. PORTC = 0xff;//PD口输出全1
  56. TRISC = 0x00;//设置方向寄存器为输出
  57. }


  58. //*********************************
  59. //AD转换初始化子程序 //
  60. //*********************************

  61. void read_adc()
  62. {
  63. TRISA=0b00001001;//

  64. ADCON0=0B00000001;//fosc/8 RA1/AN1 ADON=1

  65. //ADCON1=0B00000010;//
  66. ADCON1=0B00000101;//
  67. PIE1=0; //外设中断控制寄存器全关
  68. INTCON=0; //中断控制寄存器全关
  69. ADIF=0; //AD转换状态标志位,0没有完成
  70. ADRES=0; //AD值清零
  71. delay_50us();
  72. ADGO=1; // GODONE=1启动AD
  73. while(ADIF==0) //AD转换状态标志位,0没有完成,如过为1则AD转换完成
  74. {
  75. ;
  76. } //
  77. AD0=ADRES; //
  78. AD1=AD0;
  79. }
  80. void pingjun()

  81. {
  82. uint i,j,max,min;
  83. max=a[0];min=a[0];

  84. for(i=1;i<12;i++)

  85. {

  86. j=a[i];

  87. if(j>max) max=j;

  88. if(j<min) min=j;
  89. }

  90. printf("max=%d\nmin=%d\n",max,min); //最大和最小

  91. shu1=max+min;


  92. }

  93. void ping()
  94. {
  95. uchar i;
  96. for(i=0;i<=12;i++)
  97. {
  98. V=a[i];
  99. V1=V1+V;
  100. }
  101. V=V1-shu1;
  102. V1=0;
  103. }



  104. void main(void)
  105. {

  106. init();
  107. adbz=0;
  108. while(1)
  109. {

  110. for(i=0;i<=12;i++)
  111. {
  112. read_adc();//A/D转换初始化
  113. a[i]=AD1;//1次A/D转换的结果存入数组
  114. delay_50us();
  115. adbz=1;
  116. }

  117. if(adbz==1)
  118. {
  119. adbz=0;
  120. pingjun();
  121. ping();
  122. //V=V/1.0;
  123. qian=V/1000; //
  124. bai=V/100%10; //
  125. shi=V/10%10; //0000001求十的倍数再求余
  126. ge=V%10;
  127. }

  128. display(qian,bai,shi,ge);

  129. }
  130. }

  131. //显示子程序
  132. //**********************************
  133. void display(uchar qian,uchar bai,uchar shi,uchar ge)

  134. {

  135. PORTC=table[ge];
  136. Clrbit(PORTB,4);//PD0清零,点亮LED
  137. delay_ms(6);
  138. Setbit(PORTB,4);//PD0置一,熄灭LED 仿真是GE 0 SHI 1 BAI 2 QIAN 3


  139. PORTC=table[shi]; //shiwei=0;
  140. Clrbit(PORTB,5);//PD0清零,点亮LED
  141. delay_ms(6);
  142. Setbit(PORTB,5);//PD0置一,熄灭LED


  143. PORTC=table[bai];
  144. Clrbit(PORTB,6);//PD0清零,点亮LED
  145. delay_ms(6);
  146. Setbit(PORTB,6);//PD0置一,熄灭LED

  147. PORTC=table[qian];
  148. Clrbit(PORTB,7);//PD0清零,点亮LED
  149. delay_ms(6);
  150. Setbit(PORTB,7);//PD0置一,熄灭LED
  151. }










复制代码
回复

使用道具 举报

 楼主| 发表于 2012-6-9 21:37 | 显示全部楼层
奇怪,为什么有的地方稳定,有的地方最后两位跳。。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-20 18:20 , Processed in 0.040027 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表