智能车制作

标题: 9S12XS四路AD转换 [打印本页]

作者: yoncos    时间: 2011-3-22 10:28
标题: 9S12XS四路AD转换
/*
**********************************************************************************
*
* 工程名称:9S12XS AD TO RS232
* 功能描述:结合飞思卡尔16位单片机MC9S12XS128完成4路AD采集,并通过RS232发送到上位机。
* IDE环境: Metrowerks CodeWarrior 5.90
* 组成文件:
* main.c
*  
* 说明: 本版本为AD及RS232通讯程序早期版本,还有待更进一步完善                                             
* 日期:2011-3-6
*                             (c) Copyright 2011,Yoncos
*                                        All Rights Reserved
*
*  
* By   : Yoncos
**********************************************************************************/

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

byte  ad_value0;          //保存AD转换结果高位
byte ad_value1;
byte ad_value2;
byte ad_value3;
byte  ad_value0_1;          //保存AD转换结果地位
byte ad_value1_1;
byte ad_value2_1;
byte ad_value3_1;

/***---------------延时程序---------------***/
void Delay(int i)

{        

int j;

for(;i>0;i--)

for(j=500;j>0;j--);



}

/***---------------时钟初始化程序---------------***/
//这也是前辈写的,未改动
void InitBusClk(void)

{

CLKSEL=0X80;                  //PLLSEL  1 : Bus Clock=PLLCLK/2

//          0 : Bus Clock=OSCCLK/2

PLLCTL_PLLON=1;             //开启PLL

SYNR=0;

REFDV=0X03;                 //OSCCLK=16MHz

//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/4=8MHz

while(!(CRGFLG_LOCK==1));    //直到LOCK=1,when PLL is ready,退出循环

CLKSEL_PLLSEL=1;           

//PLLSEL  1 : Bus Clock=PLLCLK/2=8MHz/2=4MHz

//         0 : Bus Clock=OSCCLK/2=16M/2=8MHz

}

/***---------------AD初始化程序---------------***/
//部分是参考前辈的,CTL345根据自己的需求设置。此处已设置打开0123四个通道,保存结果到对应ATD0DRx(x表示结果寄存器编号)
void InitAD(void)

{   

ATD0CTL2 = 0XC0;          // 1100 0000    启动A/D,

ATD0CTL3=0X24;
//00100100 打开0/1/2/3通道,FIFO打开结果保存到相应的结果寄存器

ATD0CTL4 = 0XE1;         // 11100001   8位精度, 16AD采样时间

ATD0CTL5=0X30;   //3月22日修改,多通道,左对齐,无符号,连续转换,起始通道ATD0

ATD0DIEN = 0X00;          // 数字输入 disabled

}


/***---------------主程序---------------***/

void main(void)

{

_DISABLE_COP();        // 关看门狗  

InitBusClk();

InitAD();

DDRB=0XFF;            // 设PORTB为输出口

PORTB=0x00;

EnableInterrupts;          // 开放总中断


for(;;)

{

while(!ATD0STAT2);     //等待转换结束,退出循环

{


ad_value0=(byte)ATD0DR0H;     //0通道高位数据,下同123通道

ad_value1=(byte)ATD0DR1H;

ad_value2=(byte)ATD0DR2H;

ad_value3=(byte)ATD0DR3H;

ad_value0_1=(byte)ATD0DR0L;     //0通道低位数据,下同123通道

ad_value1_1=(byte)ATD0DR1L;

ad_value2_1=(byte)ATD0DR2L;

ad_value3_1=(byte)ATD0DR3L;

}

Delay(200);          //延时

PORTB=ad_value0;          //B口有LED,就让它来显示结果吧。调试的时候把value的后缀改一下就能分别检测个个通道


}   

}

//到此结束
[attach]6282[/attach]
作者: CCGOGO    时间: 2011-4-2 16:18
学习~
作者: 败类爪爪    时间: 2011-4-20 12:56
回复 1# yoncos


    请问一下,转换完之后为什么要分高低位取出,结果寄存器中的数???
作者: 行走齿轮间    时间: 2011-4-20 20:50
我也有同四楼一样的疑问
作者: dqgcjude    时间: 2011-4-26 21:08
回复 1# yoncos


    转换完之后为什么要分高低位取出?
作者: excellentlizhen    时间: 2011-8-25 15:25
kankan
作者: gaowenzhao123    时间: 2011-10-14 20:21
我都有同样的疑问。。能解答一下吗?
作者: bloong    时间: 2011-10-18 20:59
8错  呵呵
作者: ListenHappy    时间: 2011-10-18 21:42
同样疑问!!
作者: bxsjc    时间: 2011-12-4 17:34
求楼主解释为什么分高低位~
作者: Messi    时间: 2012-1-22 13:58
不是高低位读取会出错吗?????
作者: 骑单车的日子    时间: 2012-3-13 11:20
寄存器是16位的,定义的变量是8位的,
作者: 木花@任    时间: 2012-3-28 23:15
既然是8位转换精度,又是左对齐,低8位有读的必要吗?
作者: longmaner    时间: 2012-3-30 16:46

作者: yyq20104668    时间: 2013-3-19 14:33





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2