//注:将P0.23作为模拟量输入管脚,将测量的电压值通过uart1发送给上位机。(波特率9600)
#include "LPC17xx.h" /* LPC17xx外设寄存器 */
#include
#include
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define BEEP (1ul << 11) /* 蜂鸣器P0.11 */
#define BEEPINIT() LPC_GPIO0->FIODIR |= BEEP /* 蜂鸣器关 */
#define BEEPOFF() LPC_GPIO0->FIOSET = BEEP /* 蜂鸣器关 */
#define BEEPON() LPC_GPIO0->FIOCLR = BEEP /* 蜂鸣器开 */
#define UART_BPS 9600 /* 串口通信波特率 */
char GcRcvBuf[20]; /* AD采集到的数据 */
/*********************************************************************************************************
** Function name: myDelay
** Descriptions: 软件延时
** input parameters: ulTime
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void myDelay (uint32_t ulTime)
{
uint32_t i;
i = 0;
while (ulTime--) {
for (i = 0; i < 5000; i++);
}
}
/*********************************************************************************************************
** Function name: uart0Init
** Descriptions: 按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void uart0Init (void)
{
uint16_t usFdiv;
LPC_PINCON->PINSEL0 |= (0x01 << 4)|(0x01 << 6);
LPC_UART0->LCR = 0x83; /* 允许设置波特率 */
usFdiv = (SystemFrequency/4/16)/UART_BPS; /* 设置波特率 */
LPC_UART0->DLM = usFdiv / 256;
LPC_UART0->DLL = usFdiv % 256;
LPC_UART0->LCR = 0x03; /* 锁定波特率 */
LPC_UART0->FCR = 0x06;
}
void uart1Init (void)
{
uint16_t usFdiv;
LPC_PINCON->PINSEL0 |= (1 << 30);
LPC_PINCON->PINSEL1 |= (1 << 0);
LPC_SC->PCONP |= (1<<4); /* 开启串口1功能模块 */
LPC_UART1->LCR = 0x83; /* 允许设置波特率 */
usFdiv = (SystemFrequency / 4 / 16) / 9600; /* 设置波特率 */
LPC_UART1->DLM = usFdiv / 256;
LPC_UART1->DLL = usFdiv % 256;
LPC_UART1->LCR = 0x03; /* 锁定波特率 */
LPC_UART1->FCR = 0x87; /* 使能FIFO,设置8个字节触发点 */
NVIC_EnableIRQ(UART1_IRQn);
NVIC_SetPriority(UART1_IRQn, 5);
LPC_UART1->IER = 0x01; /* 使能接收中断 */
}
/*********************************************************************************************************
** Function name: uart0SendByte
** Descriptions: 从串口0发送数据
** input parameters: data: 发送的数据
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void uart0SendByte (uint8_t ucData)
{
LPC_UART0->THR = ucData;
while ( (LPC_UART0->LSR & 0x40) == 0 );
}
void uart1SendByte (uint8_t ucDat)
{
LPC_UART1->THR = ucDat; /* 写入数据 */
while ((LPC_UART1->LSR & 0x20) == 0); /* 等待数据发送完毕 */
}
/*********************************************************************************************************
** Function name: pcDispChar
** Descriptions: 向PC机发送显示字符
** input parameters: x: 显示字符的横坐标
** y: 显示字符的纵坐标
** ucChr: 显示的字符,不能为ff
** ucColor: 显示的状态,包括前景色、背景色、闪烁位。
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void pcDispChar (uint8_t x, uint8_t y, uint8_t ucChr, uint8_t ucColor)
{
#if 0
uart0SendByte(0xff); /* 起始字符 */
uart0SendByte(x);
uart0SendByte(y);
uart0SendByte(ucChr);
uart0SendByte(ucColor);
#else
uart1SendByte(0xff); /* 起始字符 */
uart1SendByte(x);
uart1SendByte(y);
uart1SendByte(ucChr);
uart1SendByte(ucColor);
#endif
}
/*********************************************************************************************************
** Function name: iSendStr
** Descriptions: 向上位机发送字符串
** input parameters: x: 显示字符的横坐标
** y: 显示字符的纵坐标
** ucColor: 显示的状态,包括前景色、背景色、闪烁位。
** 与DOS字符显示一样:0~3,前景色,4~6,背景色,7,闪烁位
** pcStr: 要发送的字符串,以'\0'结束
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void iSendStr (uint8_t x, uint8_t y, uint8_t ucColor, char *pcStr)
{
while (1) {
if (*pcStr == '\0') { /* 结束字符 */
break;
}
pcDispChar(x++, y, *pcStr++, ucColor);
if (x >= 80) {
x = 0;
y++;
}
}
}
/*********************************************************************************************************
** Function name: uart0SendStr
** Descriptions: 向串口发送字符串
** input parameters: pucStr: 要发送的字符串指针
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void uart0SendStr (uint8_t const *pucStr)
{
while (1) {
if (*pucStr == '\0')break; /* 遇到结束符,退出 */
uart0SendByte (*pucStr++);
}
}
/*********************************************************************************************************
* Function name: adcInit
* Descriptions: ADC初始化
* input parameters: 无
* output parameters: 无
* Returned value: 无
*********************************************************************************************************/
void adcInit (void)
{
uint32_t ulTemp;
LPC_SC->PCONP |= 1 << 12; /* 打开ADC电源 */
LPC_PINCON->PINSEL1 |= (0x01 << 14);
ulTemp = (24000000 / (13000000));
ulTemp = (1 << 0) /* 选择AD0.0为AD输入引脚 */
|(( ulTemp) << 8) /* 转换时钟为13MHz */
|(0 << 16) /* BURST = 0,软件控制转换操作 */
|(1 << 21) /* PDN = 1,正常工作模式 */
|(1 << 24) /* 设置直接启动模式 */
|(0 << 27 ); /* 设置模式,直接启动模式下无效 */
LPC_ADC->ADCR = ulTemp;
}
/*********************************************************************************************************
** Function name: main
** Descriptions: AD采集数据例程,需将跳线一端(AN0)连到JP22的P0.23脚,另一端连接待测电压端。同时将PC机的
** 串口线连接到开发板UART0,然后短接JP14跳线组,打开Easyarm串口调试软件,观察采样结果
** 注意:由于AD参考电压是3.0V,若直接采用P0.23采集电压,电压不得高于3.0V。若经过开发板
** 的采集电路后,JP16端输入电压范围为-5V~+5V
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main (void)
{
static uint32_t ulADCbuf; /* AD采集数据缓冲区 */
static uint32_t ulADCData;
static uint8_t i;
SystemInit(); /* 系统初始化,切勿删除 */
//uart0Init();
uart1Init();
adcInit();
while (1) {
ulADCData = 0;
for(i = 0;i < 8; i++) {
LPC_ADC->ADCR |= 1 << 24; /* 立即转换 */
while ((LPC_ADC->ADSTAT & (1 << 0)) == 0); /* 读取AD0STAT的通道0的Done */
LPC_ADC->ADCR |= (1 <<24); /* 第一次转换结果丢弃 */
while ((LPC_ADC->ADSTAT & (1 << 0)) == 0); /* 读取AD0STAT的通道0的Done */
ulADCbuf = LPC_ADC->ADDR0; /* 只有一路,则读取全局寄存器 */
ulADCbuf = (ulADCbuf >> 4) & 0xfff;
ulADCData += ulADCbuf;
}
ulADCData = (ulADCData/8); /* 采样8次进行虑波处理 */
ulADCData = (ulADCData*3000)/4096;
sprintf(GcRcvBuf,"VIN0 = %4d mv",ulADCData);
iSendStr(0,0,0x30,GcRcvBuf); /* 将数据发送到串口显示 */
myDelay(20);
}
}
/*********************************************************************************************************
End Of File
*********************************************************************************************************/
说明:
当P0.23管脚悬空时,测出的电压是一个浮动的值。如下图:
当把该管脚连接到被测量端时,电压值为一个比较稳定的值,如下图:
阅读(2426) | 评论(0) | 转发(0) |