STC内置ad转换问题

yoyobbs 2010-04-03 12:55:29
我的STC 内置的AD里面,ADC_FLAG是置1了,但是我用串口发送出去的数据总是FF,不知道为什么,哪怕我的电压只有2V,困惑不解啊.
...全文
483 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
freetime-wxj 2010-12-16
  • 打赏
  • 举报
回复
哪位高手在啊???AD芯片怎么写三路输入信号的程序啊
yoyobbs 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 finder_zhang 的回复:]

我也在用STC的ADC,大家交流一下.
ADC_CONTR=0xe0; //打开ADC,设最快的速度
AUXR |= 0x10; //设置EADCI位为1,允许ADC中断
EADC_SPI=1; //允许ADC与SPI中断
EA=1; //开所有中断
请确定这些中断有打开.
ADC_CONTR |= 0x08; //启动ADC
读值时也要看8个channel……
[/Quote]

你的硬件输入是怎样的,我得到的数据现在跳动很大.
finder_zhang 2010-04-06
  • 打赏
  • 举报
回复
我的跳动也是很大的,误差有十几左右.而且我的CPU与发模拟信号的IC间距做得非常地小.
有资料建议我在ADC输入处接上104的电容,但我试过,效果不明显,我是在内部把数据类加32次后求平均值,才会显出效果来,而效果很好.
hallowwar 2010-04-06
  • 打赏
  • 举报
回复
楼上说的不错,数据跳动就是滤波问题,除了电容之外,可以在程序内部通过数字滤波实现。即求最大可能值。
yoyobbs 2010-04-05
  • 打赏
  • 举报
回复
#include <STC12C5620AD.H>

#define uchar unsigned char
#define uint unsigned int

//sfr P1M0 = 0X91;
//sfr P1M1 = 0X92;

//sfr ADC_CONTR = 0XC5;
//sfr ADC_DATA = 0XC6;

delay(uint t);

//---------------------------------------------------------------------
void init_RS232 (void) // 串口初始化
{
ES = 0; // 禁止串口中断
TMOD = 0x20; // 设置 T1 为波特率发生器
SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验
TH1 = 0xFD; // 18.432MHz 晶振, 波特率 = 9600
TL1 = 0xFD;
RI = 0;
TR1 = 1;
ES = 1; // 允许串口中断
}
//---------------------------------------------------------------------

void Send_Byte(unsigned char one_byte) // 发送一个字节
{
TI = 0; // 清零串口发送中断标志
SBUF = one_byte;
while (!TI);
TI = 0;
}

main()
{
unsigned char AD_finished=0;
init_RS232();
P1M0 = 0X01;
P1M1 = 0X00;
//P1=0X00;
while(1)
{
ADC_CONTR=ADC_CONTR|0X80; //打开AD电源,设置转换速度最快
ADC_CONTR=ADC_CONTR|0X08; //设置转换标志为1,开始转换
delay(2000); //延时

while(!AD_finished)

AD_finished=(ADC_CONTR&0x10);

Send_Byte(ADC_DATA);

ADC_CONTR &= 0XF7;
ADC_DATA=0X00;

}

}

delay(uint t)
{
while(t--);
}

贴出程序,这个程序我调试的时候,在串口里面发现发送的数据很乱,也不像实际传送的电压值.希望达人能指点一二
finder_zhang 2010-04-04
  • 打赏
  • 举报
回复
我也在用STC的ADC,大家交流一下.
ADC_CONTR=0xe0; //打开ADC,设最快的速度
AUXR |= 0x10; //设置EADCI位为1,允许ADC中断
EADC_SPI=1; //允许ADC与SPI中断
EA=1; //开所有中断
请确定这些中断有打开.
ADC_CONTR |= 0x08; //启动ADC
读值时也要看8个channel有没有设对
void ADCInt(void) interrupt 5
{
ADC_CONTR &= 0xef; //清中断标志位
a_u2ADCRxBuf[0] = ((ADC_DATA<<2)+ADC_LOW2); //这样读入ADC值
}
我就是这样,可以读到ADC值的了.10位的,我用的是STC12LE5412AD
kyzf 2010-04-04
  • 打赏
  • 举报
回复
先好好核实下程序,
是否拟对应IO配置成ADC 有问题,

或者你处理ADC转换后的数值有问题,
当然也可能是硬件有问题,

建议先在网上下载一个实验程序,测试下你的单板等硬件,
宇帆 2010-04-03
  • 打赏
  • 举报
回复
应该调试一下,看AD采集那出问题了,还是串口发送出问题了
lbing7 2010-04-03
  • 打赏
  • 举报
回复
看看你的IO配置成什么状态了?

感觉像是ADC的配置不完全
hallowwar 2010-04-03
  • 打赏
  • 举报
回复
FF 说明你的AD采集是满量程的,2V也满量程显然是你的ADC设置正确。ADC_FLAG 置1 说明ADC中断有效,但不见得就是正确的值了。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧