|
/******************************************************************************************** * 文 件 名:ADC.c * 功 能:使用ADC模块的通道3进行电压的测量,然后将转换结果从串口输出,上位机使用串口调试 * 助手软件进行观察。 * 说 明:由W1调节测量电压值。 * 串口配置:8位数据位,1位停止位,无奇偶校验,波特率115200。 *********************************************************************************************/ #include "config.h"
#define UART_BPS 115200 // 定义串口通讯波特率
/******************************************************************************************** * 函数名称:Delay() * 功 能:软件延时 * 入口参数:count 延时参数,值越大,延时越长 * 出口参数:无 *********************************************************************************************/ void Delay(uint32 count) { uint32 i; for(;count>0;count--) for(i=0;i<5000;i++); } /******************************************************************************************** * 函数名称:UART0_Ini() * 功 能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200 * 入口参数:无 * 出口参数:无 *********************************************************************************************/ void UART0_Ini(void) { uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率 Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率 U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; } /******************************************************************************************** * 函数名称:UART0_SendByte() * 功 能:从串口0发送字节数据,并等待发送完毕。 * 入口参数:data 要发送的数据 * 出口参数:无 *********************************************************************************************/ void UART0_SendByte(uint8 data) { U0THR = data; // 发送数据 while( (U0LSR&0x40)==0 ); // 等待数据发送完毕 }
/******************************************************************************************** * 函数名称:UART0_SendStr() * 功 能:从串口0发送一字符串。 * 入口参数:str 要发送的字符串的指针 * 出口参数:无 *********************************************************************************************/ void UART0_SendStr (char const *str) { while (1) { if (*str == '\0') break; // 遇到结束符,退出 UART0_SendByte(*str++); // 发送数据 } }
/******************************************************************************************* * 函数名称:main() * 功 能:进行通道3电压ADC转换,并把结果转换成电压值,然后发送到串口。 * 说 明:在CONFIG.H文件中包含stdio.h。 ********************************************************************************************/ int main(void) { uint32 ADC_Data; char str[20];
PINSEL0 = 0x00000005; // 设置P0.0、P0.1连接到UART0的TXD、RXD PINSEL1 = 1<<28; // 设置P0.30连接到AD0.3 UART0_Ini(); // 初始化UART0 /* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */ AD0CR =(1 << 3) | // SEL = 8 ,选择通道3 ((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz (0 << 16) | // BURST = 0 ,软件控制转换操作 (0 << 17) | // CLKS = 0 ,使用11clock转换 (1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式) (0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式) (1 << 24) | // START = 1 ,直接启动ADC转换 (0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换) Delay(10); // 延时 ADC_Data = AD0DR; // 读取ADC结果,并清除DONE标志位 while(1) { AD0CR|=1<<24; // 进行第一次转换 while((AD0DR & 0x80000000)==0); // 等待转换结束 AD0CR|=1<<24; // 再次启动转换 while((AD0DR & 0x80000000)==0); // 等待转换结束 ADC_Data=AD0DR; // 读取ADC结果 ADC_Data = (ADC_Data>>6) & 0x3FF; ADC_Data = ADC_Data * 3300; // 满额电压 ADC_Data = ADC_Data / 1024; // 10位AD转换,1024级 sprintf(str, "%4dmV at VIN ", ADC_Data); UART0_SendStr(str); // 向上位机发送VIN的采集结果 Delay(600); } return(0); }
|