本帖最后由 明眸 于 2015-10-29 09:41 编辑
比如采集3.534电压,采集到确实3.023V,请什么原因啊?
#include <STC12C5A60S2.h>
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//extern void InitLcd1602();
//extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
//extern void LcdWriteCmd(unsigned char cmd);
unsigned char str[10];
//unsigned char str1[]={"Measuring..."};
long result;
int ADC;
void DELAY_MS (unsigned int a)
{
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
void InitADC(unsigned char CHA)
{
P1ASF=0xFF; //设置P1.7口为模拟输入端口
CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)
ADC_CONTR=0x60; //设置180个时钟周期为转换周期 0110 0000
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR|=CHA; //选择通道
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR|=0x80; //启动电源
DELAY_MS(1);//延时1ms
AUXR1|=0xFB;//ADRJ=0,10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中
}
unsigned int ReadADC()
{
unsigned char ADC_FIN=0;//储存AD转换标志
ADC_CONTR|=0X08;//启动AD转换标志
_nop_();
_nop_();
_nop_();
_nop_();
while(ADC_FIN==0)//等待AD转换结束
{
ADC_FIN=ADC_CONTR&0x10;//0001 0000测试AD转换是否结束
}
ADC_CONTR&=0xE7;//1110 0111 清ADC_FLAG位, 关闭A/D转换
return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}
/*平均滤波*/
float filter()
{
float val;
unsigned char i;
for(i=0;i<100;i++)
{
val+=ReadADC();
}
val=val/100;
return (val);
}
/*void ValueToString(unsigned char *str, unsigned int val)
{
val = (val*4.94)/1024;
str[0] = (val/10) + '0';
str[1] = '.';
str[2] = (val%100/10) + '0';
str[3] = (val%100%10)+'0';
str[4] = 'V';
}*/
void UART_init()
{
TMOD=0x20; //设置T1为方式1
SCON=0x50; //设置SCON方式1
TH1=0xFD;
TL1=0xFD; //256-11059200(12*32*9600)
TR1=1; //打开定时器1
}
void UART_send_byte(unsigned char dat) //UART 发送一字节
{
SBUF=dat; //现将数据存放在SBUF,然后单片机自动发送
while(TI==0); //判断发送中断标志
TI=0; //清零
}
void UART_send_string(unsigned char *buf) //UART 发送字符串
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}
void main()
{
//InitLcd1602();
InitADC(7);
UART_init();
P1M1=0x80;
P1M0=0X00;//将P1.7设置为高阻输入
while(1)
{
result=filter(); //10位
result = (result*49.4)/1024;
str[0] = (result/10) + '0';
str[1] = '.';
str[2] = (result%1000/100) + '0';
str[3] = (result%1000%100/10) + '0';
str[4] = (result%10) + '0';
str[5] = 'V';
str[6] = '\n';
UART_send_string(str);
// ValueToString(str,result);
// LcdShowStr(0,0,str1);
//LcdShowStr(0,1,str);
DELAY_MS(1000);
//LcdWriteCmd(0x01); //清屏
}
}
|