金牌会员
- 积分
- 2604
- 威望
- 567
- 贡献
- 1795
- 兑换币
- 130
- 注册时间
- 2009-6-6
- 在线时间
- 121 小时
|
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
void main(void) {
int ad[14];
int i,k;
ATD0CTL1=0x00; //八位精度,无采样预充电,禁止外部触发
ATD0CTL2=0x40; //快速清零,停止模式下AD转换停止,忽略外部触发,开中断,禁止比较中断
ATD0CTL3=0xE8; //右对齐,13位长度,noFIFO,Freeze模式下继续转换
ATD0CTL4=0x05; //四倍采样时钟,PRS=10,ATDclock=[busclock/2*(PRS+1)]=12/6=2MHZ
ATD0CTL5=0x30; //禁止特殊转换模式,连续转换模式,多通道采样,通道0
ATD0DIEN=0x00; //禁止数字输入
DDRB=0XFF;
PORTB=0X00;
for(;;) {
while(ATD0STAT0_SCF==1){
ad[1]=ATD0DR7;
ad[2]=ATD0DR6;
ad[3]=ATD0DR5;
ad[4]=ATD0DR4;
ad[5]=ATD0DR3;
ad[6]=ATD0DR2;
ad[7]=ATD0DR1;
ad[8]=ATD0DR0;
ad[9]=ATD0DR8;
ad[10]=ATD0DR9;
ad[11]=ATD0DR10;
ad[12]=ATD0DR11;
ad[13]=ATD0DR12;
}
for(i=1;i<14;i++){
if(ad[i]<155)
ad[i]=1;
else
ad[i]=0;
}
PORTB_PB0=ad[13];
PORTB_PB1=ad[12];
PORTB_PB2=ad[11];
PORTB_PB3=ad[10];
PORTB_PB4=ad[9];
PORTB_PB5=ad[8];
PORTB_PB6=ad[7];
PORTB_PB7=ad[6];
}
}
这样单步运行的话SCF实际上永远是1,所以理论上AD的采样永远就循环于while(ATD0STAT0_SCF==1){....}之中,也就是说他不会执行之后的程序。而且如果你单步运行的话就是如此。但是当把程序烧进去以后芯片自己运行他就会跳出这个循环执行以后的程序。这个是为什么?很奇怪~ |
|