求高手指点stc12c5a60S2内部AD程序

急啊急啊!!求高手指点,用12C5A60S2的内部AD来采集波形,已知周期T,每个周期采样20次,下面是我自己写的程序,但是效果很不好,求高手指点一下,或能附上c语言例程,能借鉴一下,先谢谢啦

void AD_Init()
{ /* 初始化AD */
P1M0 |= 0x01; /* 设置为高阻输入模式 */
P1M1 |= 0x01;
P1ASF = 0x01; /* 清零标志位 */
ADC_RES = 0; /* 清零结果寄存器 */
ADC_RESL = 0;
ADC_CONTR = 0xe0; /* 开启转换电源,设置转换周期为90个时钟周期 */
AUXR1 = 0X00;
delayms(1); /* 必要的延时 */
}
uchar AD_sample() //AD采样
{

ADC_CONTR |= 0X08; /* 启动AD转换 */ delayms(1);
while(!(ADC_CONTR & 0X10)); /* 查询AD转换标志位 */
res = ADC_RES * 4 + ADC_RESL; /* 将查询结果保存为10位字符 */
ADC_CONTR &= 0xef; /* 清零标志位 */
res = res * 5000 / 256;

return (res);
}

viod main(void)
{
for(i = 0; i < 20; i ++)
{

resnum[i] = AD_sample();
while(ndelay --); //ndelay = T/20, 意为采样间隔,每隔T/20采样一次。不知道这么写对不对
}
for(i = 0; i < 20; i ++)
{
P2 = resum[i]; //da转换
}
}

以上只是部分程序。
求指教。。。。。。。

第1个回答  2013-10-31
#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

sfr P1ASF = 0X9D;
//P1口选择功能寄存器
sfr ADC_CONTR = 0XBC; //ADC控制寄存器
sfr
ADC_RES = 0XBD; //ADC转换结果寄存器高
sfr
ADC_RESL = 0XBE; //ADC转换结果寄存器低
sfr
AUXR1 = 0XA2; //ADC转换结果调整位
//sfr
IE = 0XA8;
//ADC中断允许寄存器
//sfr IP =
0XB8; //ADC中断优先级控制寄存器高
//sfr
IPH = 0XB7;
//ADC中断优先级控制寄存器低

uint ADC_Result1, ADC_Result2, ADC_Result;

void ADC_init(void); //AD转换初始化
void
Delay(uint z);
//延时函数

void main(void)
{
uint gei, shi, bai, qian;
uchar code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

while
(1)
{
ADC_init();
ADC_Result =
ADC_Result2 + ADC_Result1 * 256;
gei = ADC_Result %
10;
shi = ADC_Result / 10 % 10;
bai = ADC_Result /
100 % 10;
qian = ADC_Result /
1000;
//数码管动态显示显示采集数值
P2 = 1;
P0 =
table[qian];
Delay(5);
P2 = 2;
P0 =
table[bai];
Delay(5);
P2 = 3;
P0 =
table[shi];
Delay(5);
P2 = 4;
P0 =
table[gei];
Delay(5);
}
}

void ADC_init(void)
//AD转换初始化
{
P1ASF = 0X01;
//X选择P1.0作为ADC转换输入通道
ADC_CONTR = 0X80;
//打开ADC转换电源
_nop_();
_nop_();

AUXR1 = 0X04;
//将高两位存放在寄存器ADC_RES,低八位存放在寄存器ADC_RESL中
ADC_CONTR |= 0X68;
//ADC初始化设置
_nop_();
_nop_();
_nop_();
_nop_
();

ADC_Result1 = ADC_RES;
ADC_Result2 =
ADC_RESL;

}
void Delay(uint z)
//延时函数
{
uint x, y;
for (x = 0; x < z;
x++)
for (y = 0; y < 140; y++);
}
第2个回答  2012-11-26
ad