有人能给我解释下这个AD转换的程序没..谢谢
主要是 主函数只调用AD_Change();这个函数
那么 AD_Filter() 和Average(uint buffer[30]) 这两个函数的拿来什么用?
或者说 主进程有调用吗?
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit AD_Out = P3^4; //TLC549输出端
- sbit CS = P1^4; //TLC549片选信号
- sbit AD_In = P1^3; //TLC549输入端
- uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void delay()
- {
- int i,j;
- for(i=0; i<=10; i++)
- for(j=0; j<=2; j++)
- ;
- }
- void Delay(uint del)
- {
- uchar i, j;
- for(i=0; i<del; i++)
- for(j=0; j<=148; j++)
- ;
- }
- uchar AD_Change(void)
- {
- uchar i,temp = 0;
- AD_In = 0;
- _nop_();
- _nop_();
- CS = 0;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- if(AD_Out == 1) temp += 1;
- for(i=0; i<8; i++)
- {
- AD_In = 1;
- _nop_();
- _nop_();
- AD_In = 0;
- _nop_();
- _nop_();
- if(i != 7)
- {
- temp = temp << 1;
- if(AD_Out == 1) temp += 1;
- }
- }
- CS = 1;
- return temp;
- }
- uint Average(uint buffer[30])
- {
- uchar i,j;
- uint temp;
- for(i=1; i<30; i++) ////先对整个数组的三十个值进行从小到大的排列
- for(j=29; j>=i; --j)
- {
- if(buffer[j-1] > buffer[j])
- {
- temp = buffer[j-1];
- buffer[j-1] = buffer[j];
- buffer[j] = temp;
- }
- }
- ////对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值
- temp = 0;
- for(i=5; i<25; i++)
- {
- temp += buffer[i];
- }
- temp = (uint)(((float)temp) / 20 + 0.5);
- return(temp);
- }
- uint AD_Filter()
- {
- uint Date_Buffer[30] = {0}, temp;
- uchar i;
- for(i=0; i<30; i++)
- {
- Date_Buffer[i] = AD_Change();
- Delay(1);
- }
- temp = Average(Date_Buffer);
- return(temp);
- }
- void Main(void)
- {
- uint i = 0,temp;
- uint j;
- P2 = 0x00;
- P1 = 0xff;
- while(1)
- {
- temp = AD_Change();
- j = temp * 2; //这里取的是一个大概的值。真实电压应为 temp * 5 / 256, 得出的数为 "x.xx"。
- P2 = 7;
- P0 = table[j%10];
- Delay(10);
- P2 = 6;
- P0 = table[j/10%10];
- Delay(10);
- P2 = 5;
- P0 = table[j/100];
- Delay(10);
- }
- }
复制代码
一周热门 更多>