单片机编程新手求助..

2019-07-16 07:10发布

有人能给我解释下这个AD转换的程序没..谢谢
主要是  主函数只调用AD_Change();这个函数
那么 AD_Filter()   和Average(uint buffer[30]) 这两个函数的拿来什么用?
或者说 主进程有调用吗?


  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit AD_Out = P3^4;    //TLC549输出端
  6. sbit CS = P1^4;           //TLC549片选信号
  7. sbit AD_In = P1^3;    //TLC549输入端
  8. uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  9. void delay()
  10. {
  11. int i,j;
  12. for(i=0; i<=10; i++)
  13.   for(j=0; j<=2; j++)
  14.   ;
  15. }
  16. void Delay(uint del)
  17. {
  18. uchar i, j;
  19. for(i=0; i<del; i++)
  20.   for(j=0; j<=148; j++)
  21.   ;
  22. }
  23. uchar AD_Change(void)
  24. {
  25. uchar i,temp = 0;
  26. AD_In = 0;
  27. _nop_();
  28. _nop_();
  29. CS = 0;
  30. _nop_();
  31. _nop_();
  32. _nop_();
  33. _nop_();
  34. if(AD_Out == 1) temp += 1;
  35. for(i=0; i<8; i++)
  36. {
  37.   AD_In = 1;
  38.   _nop_();
  39.   _nop_();  
  40.   AD_In = 0;
  41.   _nop_();
  42.   _nop_();
  43.   if(i != 7)
  44.   {
  45.    temp = temp << 1;
  46.    if(AD_Out == 1) temp += 1;
  47.   }
  48. }
  49. CS = 1;
  50. return temp;
  51. }
  52. uint Average(uint buffer[30])
  53. {
  54. uchar i,j;
  55. uint temp;
  56. for(i=1; i<30; i++)    ////先对整个数组的三十个值进行从小到大的排列
  57.   for(j=29; j>=i; --j)
  58.   {
  59.    if(buffer[j-1] > buffer[j])
  60.    {
  61.     temp = buffer[j-1];
  62.     buffer[j-1] = buffer[j];
  63.     buffer[j] = temp;
  64.    }
  65.   }
  66. ////对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值
  67. temp = 0;
  68. for(i=5; i<25; i++)
  69. {
  70.   temp += buffer[i];
  71. }   
  72. temp = (uint)(((float)temp) / 20 + 0.5);
  73. return(temp);
  74. }
  75. uint AD_Filter()
  76. {
  77. uint Date_Buffer[30] = {0}, temp;   
  78. uchar i;
  79. for(i=0; i<30; i++)
  80. {
  81.   Date_Buffer[i] = AD_Change();
  82.   Delay(1);   
  83. }
  84. temp = Average(Date_Buffer);  
  85. return(temp);
  86. }
  87. void Main(void)
  88. {
  89. uint i = 0,temp;
  90. uint j;
  91. P2 = 0x00;
  92. P1 = 0xff;
  93. while(1)
  94. {
  95.   temp = AD_Change();
  96.   j = temp * 2; //这里取的是一个大概的值。真实电压应为 temp * 5 / 256, 得出的数为 "x.xx"。
  97.    P2 = 7;
  98.   P0 = table[j%10];
  99.   Delay(10);
  100.   P2 = 6;
  101.   P0 = table[j/10%10];
  102.   Delay(10);
  103.   P2 = 5;
  104.   P0 = table[j/100];
  105.   Delay(10);
  106. }
  107. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
assingle
1楼-- · 2019-07-16 12:16
主进程没有调用,你应该看看是不是有中断处理函数,在中断里面处理的。AD_Filter()  用来进行采集30次,并将采集到的30个采样值通过调用 Average(uint buffer[30]) 进行取平均数; Average(uint buffer[30]) 用来进行对buffer数组里面的30个元素进行去大,去小后,再去平均值;返回平均值;
1020
2楼-- · 2019-07-16 13:45
haohaohao
1020
3楼-- · 2019-07-16 18:21
haohao
leebilly007
4楼-- · 2019-07-16 18:24
沙发正解。。。
hjhhhjy@163.com
5楼-- · 2019-07-16 19:22
 精彩回答 2  元偷偷看……

一周热门 更多>