⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM-lpc23xx系列ADC源程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			zhmj
** Created date:		2004-09-16
** Version:				2007-3-26
** Descriptions:		ADC_Display Mat1.0
**
**------------------------------------------------------------------------------------------------------
** Modified by:			yangshiping	
** Modified date:		2007-09-03
** Version:				
** Descriptions:		对程序的注释和风格作部分调整,并验证程序。	
** Rechecked by:		Litiantian
********************************************************************************************************/

/********************************************************************************************************
** 函数功能:当MAT1.0匹配输出下降沿使ADC模块的通道5进行电压的测量,然后将转换结果从串口送出。
** 			 上位机使用EasyARM软件全仿真的DOS窗口观察。
** 调试说明:1、用户需要把开发板上的JP4短接;
**			 2、由W1调节测量电压值;
** 			 3、通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
********************************************************************************************************/

#include "config.h"

uint32  addr5_data;			    // 存放AD结果寄存器内容的全局变量
uint8   ADC_Send_Enable;        // 发送AD转换结果给上位机的标志

#define	UART_BPS	115200		// 通讯波特率115200

/*********************************************************************************************************
** 函数名称 :IRQ_ADC
** 函数功能 :AD中断服务程序 
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void __irq IRQ_ADC(void)
{
			
	addr5_data		= ADDR5;	// 读取ADC数据
	ADC_Send_Enable = 1; 		// 使能串口发送ADC0数据的控制位		
	VICVectAddr 	= 0x00;		// 通知VIC中断处理结束 
}

/*********************************************************************************************************
** 函数名称 :UART0_IniDft
** 函数功能 :按默认值初始化串口0的引脚和通讯参数。设置为8位数据位,1位停止位,无奇偶校验,波特率115200。
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void UART0_IniDft(void)
{
	uint32 	Fdiv = 0;

	/* 初始化相关的IO */
	PINSEL0 = (0x01 << 4) | (0x01 << 6);	// 设置P0.2和P0.3连接到UART0
	/* 初始化串口通讯参数 */
	U0LCR 	= 0x80;							// 设置为8位数据位,1位停止位,无奇偶校验,DLAB=1,允许设置波特率
	Fdiv 	= (Fpclk / 16) / 115200;		// 设置波特率
	U0DLM 	= Fdiv / 256;
	U0DLL 	= Fdiv % 256;
	U0LCR 	= 0x03;							// 令DLAB位为0
	U0FCR  &= ~0x07;						// 禁用FIFO
    U0IER  &= ~0x07;						// 禁止UART0产生中断
}

/*******************************************************************************************************
** 函数名称 :UART0_SendByte
** 函数功能 :向串口发送字节数据,并等待数据发送完毕。
** 入口参数 :data		要发送的数据
** 出口参数 :无
********************************************************************************************************/
void UART0_SendByte(uint8 data)
{
	U0THR = data;
	while ((U0LSR & 0x40) == 0);			// 等待数据发送完毕
}

/*******************************************************************************************************
** 函数名称 :PC_DispChar
** 函数功能 :向PC机发送显示字符。
** 入口参数 :x		显示字符的横坐标
**			  y		显示字符的纵坐标
**			  chr	显示的字符,不能为ff
**			  color	显示的状态,包括前景色、背景色、闪烁位。
**					与DOS字符显示一样:0~3,前景色,4~6,背景色,7,闪烁位。
** 出口参数 :无	
********************************************************************************************************/
void PC_DispChar(uint8 x, uint8 y, uint8 chr, uint8 color)
{
	UART0_SendByte(0xff);					// 起始字符
	UART0_SendByte(x);
	UART0_SendByte(y);
	UART0_SendByte(chr);
	UART0_SendByte(color);
}

/*******************************************************************************************************
** 函数名称 :ISendStr
** 函数功能 :向上位机发送字符串。
** 入口参数 :x		显示字符的横坐标
**			  y		显示字符的纵坐标
**			  color	显示的状态,包括前景色、背景色、闪烁位。
**					与DOS字符显示一样:0~3,前景色,4~6,背景色,7,闪烁位。
**			  str	要发送的字符串,以'\0'结束
** 出口参数 :无	
********************************************************************************************************/
void ISendStr(uint8 x, uint8 y, uint8 color, char *str)
{
	while (1)
	{
		if (*str == '\0')	
		{
			break;							// 结束字符
		}
		PC_DispChar(x++, y, *str++, color);
		if (x >= 80)
		{
			x = 0;
			y++;
		}
	}
}

/*******************************************************************************************************
** 函数名称 :main
** 函数功能 :进行5通道电压ADC转换,并把结果转换成电压值,发送到串口。
** 调试说明 :1、实验前在config.h中包含stdio.h;
**            2、将JP4短接;
**			  3、在Flash中进行调试。
********************************************************************************************************/
int main(void)
{ 
	uint32 ADC_Data;
	char str[20];
	
	UART0_IniDft();							// 串口0初始化为8位数据位,1位停止位,无奇偶校验
	
	PCONP |= (1 << 12);						// 必须打开ADC的功率控制位ADC才可以正常工作
	
	PINSEL3 = ((unsigned)0x03) << 30;		// 设置P1.31为AIN5功能
	
	T1MCR = 0x02;							// 设置T1MR0匹配后将T1TC复位
	T1EMR = (3 << 4);							// T1MR0匹配后MAT1.0输出翻转
	T1MR0 = Fpclk;		    				// 输出频率周期控制,定时1s钟MAT1.0翻转一次
	T1TCR = 0x01;							// 启动T1TC
	
	/* 进行ADC模块设置 */
	AD0CR = (1 << 5)					 |	// SEL=0x20,选择通道5
			((Fpclk / 1000000 - 1) << 8) |	// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
			(0 << 16)					 |	// BURST=0,软件控制转换操作
			(0 << 17)					 |	// CLKS=0, 使用11clock转换
			(1 << 21)					 |  // PDN=1,正常工作模式
			(6 << 24)					 |	// START=6,当EDGE选择的边沿出现在MAT1.0时启动AD转换
			(1 << 27);						// 下降沿
	
	AD0INTEN = (1 << 5);                    // 使能AD通道5转换结束后产生中断 
	
	IRQEnable();                            // 打开IRQ中断
	
	/* 进行VIC设置 */
	VICIntSelect 	= 0x00;					// 所有中断通道设置为IRQ中断		
	VICVectPri18 	= 00;					// 设置ADC中断最高优先级	
	VICVectAddr18 	= (uint32)IRQ_ADC;		// 设置中断服务程序地址					
	VICIntEnable 	= (1 << 18);			// 使能ADC中断	
	
	
	while (1)
	{
		/* 等待定时器匹配事件产生的MAT1.0下降沿触发启动ADC */
		if (ADC_Send_Enable == 1)               	// ADC有转换吗
		{
			ADC_Data = addr5_data;					// 读取AD通道5结果
			ADC_Data = (addr5_data >> 6) & 0x3ff;
			ADC_Data = ADC_Data * 2500;				// 参考电压由精密恒压源提供的2.5V
			ADC_Data = ADC_Data / 1024;
			sprintf(str, "%4d mV VIN5", ADC_Data);	// 格式转换
			ISendStr(0, 0, 0x30, str);              // 串口0发送数据给上位机显示
			addr5_data 		= 0;
			ADC_Send_Enable = 0;
		}
	}
	
	return (0);		
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -