中级会员
- 积分
- 445
- 威望
- 280
- 贡献
- 55
- 兑换币
- 0
- 注册时间
- 2009-4-3
- 在线时间
- 55 小时
|
2贡献
芯片为dg128,BusClock=8MHz
AN8和AN9输入模拟信号,在1-3.5V左右,参考电压5V,但是只有0和255两个转换结果,另外电平触发是进行连续转换还是一次转换,在使用ATD模块应注意什么,好心人帮我看看,谢谢了。
#ifndef _AD_LightDetection_H_
#define _AD_LightDetection_H_
#define AD_signal5 PORTK_BIT4
#define AD_signal2 PORTK_BIT5
#define AD_DDR5 DDRK_BIT4
#define AD_DDR2 DDRK_BIT5
#define AD_switch PORTK_BIT0
#define AD_sw_DIR DDRK_BIT0
#define on 0
#define off 1
#define in 0
#define out 1
void AD_Init(void);
void Get_AD_Value5(unsigned char *A);
void Get_AD_Value2(unsigned char *A);
void AD_Transfer(char *Dis,unsigned char *A);
#endif
unsigned char AD_Result[5]={0x00,0x00,0x00,0x00,0x00}; //AD转换结果
char Display_AD[]="000,000,000,000";
/*******************main()*************************/
void main(void)
{
LcdInit();
AD_Init();
for(;;)
{
Get_AD_Value2(AD_Result);
AD_Transfer(Display_AD,AD_Result); //将结果转换成字符在显示器上显示
LcdWriteStr(1,0,Display_AD);
}
}
/******************使用两个AD转换模块分别控制,均采用高电平触发*******************/
void AD_Init(void)
{
AD_sw_DIR=out;
AD_switch=on;
_asm (nop);
_asm (nop);
_asm (nop);
ATD1CTL2=0xCC; //AD模块上电, 快速清零, 无等待模式,外部上升沿触发, 中断禁止
ATD1CTL3=0x10; //每次转换2个序列, No FIFO, Freeze模式下继续转
ATD1CTL4=0xC7&0x7f; //8位精度, 采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=2MHz
ATD1CTL5=0xB0; //右对齐无符号,连续转换 ,从8通道开始,轮流通道采样
ATD1DIEN=0x00; //禁止数字输入
AD_DDR5=1; //I/O口输出
AD_DDR2=1;
AD_signal5=0; //初始信号为低电平
AD_signal2=0;
}
void Get_AD_Value2(unsigned char *A)
{
AD_signal2=1;
while(!ATD1STAT1_CCF1);
A[0]=ATD1DR0L;
A[1]=ATD1DR1L;
AD_signal2=0;
_asm (nop);
}
void AD_Transfer(char *Dis,unsigned char *A)
{
Dis[0]=A[0]/100+0x30;
Dis[1]=A[0]%100/10+0x30;
Dis[2]=A[0]%100%10+0x30;
Dis[4]=A[1]/100+0x30;
Dis[5]=A[1]%100/10+0x30;
Dis[6]=A[1]%100%10+0x30;
} |
|