版主
- 积分
- 2080
- 威望
- 1012
- 贡献
- 600
- 兑换币
- 642
- 注册时间
- 2014-12-6
- 在线时间
- 234 小时
- 毕业学校
- 华南农业大学
|
2#
楼主 |
发表于 2015-3-20 17:45:04
|
只看该作者
贴上程序::::
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LEDCPU PORTE_PE4
#define LEDCPU_dir DDRE_DDRE4
#define LED_ON 0
#define LED_OFF 1
#define BUS_CLOCK 32000000 //总线频率
#define QSC_CLOCK 16000000 //晶振频率
#define BAUD 9600
unsigned char data_receive;
unsigned int AD,i,AD_data0,AD_data1,AD_data2,AD_data3,a;//存储AD转换的结果
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/*************************************************************/
/* 初始化SCI */
/*************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2 = 0x0c; //允许接收和发送数据,禁止中断功能
}
/*************************************************************/
/* 串口发送函数 */
/*************************************************************/
void SCI_send(unsigned int data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口接收函数 */
/*************************************************************/
unsigned char SCI_receive(void)
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满
return(SCI0DRL);
}
/********AD初始化******************/
/*void AD_Init(void)
{
ATD0DIEN=0X00;//禁止数字输入功能
ATD0CTL1=0X20;//分辨率8位,采样前不放电
ATD0CTL2=0X40;//快速清零,禁止外部触发,禁止中断
ATD0CTL3=0XA0;//转换结果右对齐,序列长度为4,NO FIFO
ATD0CTL4=0X0B;//采样时间4个周期,PRS=3
ATD0CTL5=0X30;//从通道0开始多通道连续采样,同时启动转换序列
} */
/**********AD转换的值**************/
/*unsigned int AD_GetValue(int ch)
{
while(!ATD0STAT0_SCF)
switch (ch)
{
default:
case 0: AD=ATD0DR0;
break;
case 1: AD=ATD0DR1;
break;
case 2: AD=ATD0DR2;
break;
case 3: AD=ATD0DR3;
break;
}
return AD;
}
*/
/*********发送电感的值*******************/
/*void PC(void)
{
AD_data0=AD_GetValue(0);
AD_data1=AD_GetValue(1);
AD_data2=AD_GetValue(2);
AD_data3=AD_GetValue(3);
/* SCI_send(AD_data0);
SCI_send(AD_data1);
SCI_send(AD_data2);
SCI_send(AD_data3); */
//}
//*****************************************************************************
//功 能:AD初始化设置
//说 明:多通道转换,16路AD,从AD0开始,8位精度,数据右对齐,禁止中断使能,
// 采样前放电,快速自动清零
//*****************************************************************************
void InitATD(void)
{
// ATD0CTL0 = 0X05; //转换到A5就在从A0开始
ATD0CTL0 = 0X03; //转换到A3就在从A0开始
ATD0CTL1 = 0X20; //设置转换精度、外部触发方式选择位;10位精度
/*
0 ATD0CTL1_ETRIGCH0 = 0; //外部触发源选择位,下同
1 ATD0CTL1_ETRIGCH1 = 0;
2 ATD0CTL1_ETRIGCH2 = 0;
3 ATD0CTL1_ETRIGCH3 = 0;
4 ATD0CTL1_SMP_DIS = 0; //采样前bu放电
5* ATD0CTL1_SRES0 = 1; //SRES[1:0] = 00, AD Resolution = 8; SRES[1:0] = 01, AD Resolution = 10
6* ATD0CTL1_SRES1 = 0; //SRES[1:0] = 10 AD Resolution = 12 SRES[1:0] = 11, AD Resolution = 保留
7* ATD0CTL1_ETRIGSEL = 0; //外部触发源选择位
*/
ATD0CTL2 = 0X60; //中断、外部触发方式、内部时钟(停止模式);快速自动清零?
// ATD0CTL3 = 0xb0; //转换序列长度6
ATD0CTL3 = 0xA0;
ATD0CTL4 = 0x07; //设置AD转换频率、第二阶段采样时间
//假设 4MHZ A/D 时钟频率转换时间 =
//Initial Sample Time 初始化+ 采样时间Programmed
// Sample Time + 分辨率时间Resolution Period
//= 2 + 4 + 10 = 16A/D Clocks
//= 4uS
ATD0CTL5 = 0X30; //多通道连续转换,A0起始
ATD0DIEN = 0X00; //禁止数字输入
}
//读取AD采集回来的值
uint Get_AD(uchar ch)
{
// uint ad;
while(!(ATD0STAT0 & (1 << 7)) );
switch (ch)
{
case 0: a = ATD0DR0; break;
// case 1: ad = ATD0DR1; break;
// case 2: ad = ATD0DR2; break;
// case 3: ad = ATD0DR3; break;
// default: break;
}
return a;
}
/*************串口发送AD值*****************************/
void convert_ad(unsigned int ad)
{
unsigned int a,b,c;
a=ad/100;
SCI_send(a+48);
b=ad%100;
b=b/10;
SCI_send(b+48);
c=ad%10;
SCI_send(c+48);
SCI_send(' ');
}
/*************************************************************/
/* 主函数 */
/*************************************************************/
void main(void)
{
DisableInterrupts;
INIT_PLL();
//AD_Init();
InitATD();
LEDCPU_dir = 1;
INIT_SCI();
EnableInterrupts;
LEDCPU=LED_ON;
for(;;)
{
data_receive = SCI_receive();
if(data_receive == 'O')
{
SCI_send('Y');
LEDCPU = LED_ON;
}
if(data_receive == 'C')
{
convert_ad(a); //直接用函数发送AD值
//convert_ad(900);
// PC();
LEDCPU = LED_OFF;
}
}
}
|
|