📄 iar-
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http:// www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File Name: user.c
** Last modified Date: 2007.08.24
** Last Version: V1.0
** Description: Stellaris系列单片机处理器触发A/D转换
** 通过ADC0、ADC1分别采样W1、W2的电压值,并输出到串口显示
** 通过内部温度传感器采样芯片温度值,并输出到串口显示
**
**--------------------------------------------------------------------------------------------------------
** Created By: Kang qinhua
** Created date: 2007.10.10
** Version: V1.0
** Descriptions: The original version 初始版本
**
**--------------------------------------------------------------------------------------------------------
** Modified by: Kang qinhua
** Modified date: 2008.01.13
** Version: v1.1
** Description:
**
*********************************************************************************************************/
#include "includes.h"
#include "uart_send.h"
#include "adc.h"
static const unsigned char g_channel0[] = "通道0使用第一个数据采样点,采样电压是";
static const unsigned char g_channel1[] = "通道1使用第二个数据采样点,采样电压是";
static const unsigned char g_channel2[] = "第三个数据采样点,使用内部温度传感器,采样电压是";
static const unsigned char g_channel3[] = "第三个数据采样点,使用内部温度传感器,采样温度是";
static const unsigned char tempunint[] = "摄氏度";
/*********************************************************************************************************
** Function name: Test_ADC
** Descriptions: 通过PC5产生一个方波,与PB4(模拟比较器C-输入端)连接,在方波的下降沿触发AD
** input parameters: n: 产生的方波的周期
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Test_ADC (uint32 n)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); /* 使能GPIO PC口 */
GPIODirModeSet(GPIO_PORTC_BASE, PC5, GPIO_DIR_MODE_OUT); /* 设置 PC5 为输出 */
GPIOPadConfigSet(GPIO_PORTC_BASE, PC5,
GPIO_STRENGTH_4MA,
GPIO_PIN_TYPE_STD);
GPIOPinWrite(GPIO_PORTC_BASE, PC5, ~ PC5);
delay(n);
GPIOPinWrite(GPIO_PORTC_BASE, PC5, PC5);
delay(n);
}
/*********************************************************************************************************
** Function name: delay
** Descriptions: 延时一段时间
** input parameters: n: 延时参数
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay (uint32 n)
{
uint32 i;
for (i = 0; i < n; i++);
}
/*********************************************************************************************************
** Function name: Led_init
** Descriptions: LED初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Led_init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); /* 使能GPIOA口 */
GPIODirModeSet(GPIO_PORTA_BASE, PA4 | PA5, GPIO_DIR_MODE_OUT); /* 设置PA4|PA5为输出 */
GPIOPadConfigSet(GPIO_PORTA_BASE, PA4 | PA5, /* 配置输出模式 */
GPIO_STRENGTH_4MA,
GPIO_PIN_TYPE_STD);
GPIOPinWrite(GPIO_PORTA_BASE, PA4, ~PA4); /* 点亮LED */
GPIOPinWrite(GPIO_PORTA_BASE, PA5, ~PA5);
}
/*********************************************************************************************************
** Function name: mux_n
** Descriptions: 计算10的n次幂,n要大于等于0
** input parameters: n: 10的n次幂
** output parameters: sum: 返回运算后的结果
** Returned value: 无
*********************************************************************************************************/
uint32 mux_n (uint8 n)
{
uint8 i;
uint32 sum = 10;
for (i = 1; i < n; i++) {
sum = sum * 10;
}
if (n == 0) {
sum = 1;
}
return sum;
}
/*********************************************************************************************************
** Function name: Data_ASICC
** Descriptions: 将一个最大值四位的数转换位ASICC码通过串口打印出来
** input parameters: charge_data: 要转换的3位整数
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Data_ASICC (uint16 charge_data)
{
uint8 i;
uint16 ulchar, temp;
for (i = 0; i < 4; i++) {
ulchar = charge_data / (mux_n(3 - i)) % 10 + '0'; /* 取出最高位 */
UARTCharPut(UART0_BASE, ulchar);
if (i == 0) {
UARTCharPut(UART0_BASE, '.'); /* 打印小数点 */
}
ulchar = (ulchar - '0'); /* 下面四条语句是将最高位消除,
为下次再取一个最高位做准备 */
temp = (mux_n(3 - i));
ulchar = ulchar * temp;
charge_data = charge_data - ulchar;
}
UARTCharPut(UART0_BASE, 'V'); /* 打印电压单位V */
UARTCharPut(UART0_BASE, '\r'); /* 换行 */
UARTCharPut(UART0_BASE, '\n'); /* 光标回到起始位置 */
}
/*********************************************************************************************************
** Function name: Get_temp
** Descriptions: 取出采样温度值并输出到串口
** input parameters: charge_data: 内部温度传感器的采样电压值
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Get_temp (uint16 charge_data)
{
uint8 i;
uint16 ulchar, temp1, temp2, sbuf1, sbuf2;
charge_data = (2700 - charge_data) * 75 - 55000;
sbuf1 = charge_data / 1000;
sbuf2 = charge_data % 1000;
for (i = 0; i < 2; i++) {
ulchar = sbuf1 / (mux_n(1 - i)) % 10 + '0'; /* 取出最高位 */
UARTCharPut(UART0_BASE, ulchar);
/* 下面四条语句是将最高位消除,
为下次再取一个最高位做准备 */
ulchar = (ulchar - '0');
temp1 = (mux_n(1 - i));
ulchar = ulchar * temp1;
sbuf1 = sbuf1 - ulchar;
}
UARTCharPut(UART0_BASE, '.'); /* 打印小数点 */
for (i = 0; i < 3; i++) {
ulchar = sbuf2 / (mux_n(2 - i)) % 10 + '0'; /* 取出最高位 */
UARTCharPut(UART0_BASE, ulchar);
/* 下面四条语句是将最高位消除,
为下次再取一个最高位做准备 */
ulchar = (ulchar - '0');
temp2 = (mux_n(2 - i));
ulchar = ulchar * temp2;
sbuf2 = sbuf2 - ulchar;
}
UARTSend(tempunint, sizeof(tempunint)); /* 发送温度单位文字 */
UARTCharPut(UART0_BASE, '\r'); /* 换行 */
UARTCharPut(UART0_BASE, '\n'); /* 光标回到起始位置 */
}
/*********************************************************************************************************
** Function name: Send_ADC_Data
** Descriptions: 通过超级终端发送采样数据
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Send_ADC_Data(void)
{
uint16 temp;
UARTSend(g_channel0, sizeof(g_channel0)); /* 发送通道0采样提示 */
Data_ASICC(Charge_Val[0]); /* 发送通道0采样电压 */
UARTSend(g_channel1, sizeof(g_channel1)); /* 发送通道1采样提示 */
Data_ASICC(Charge_Val[1]); /* 发送通道1采样电压 */
UARTSend(g_channel2, sizeof(g_channel2)); /* 发送内部温度采样提示 */
Data_ASICC(Charge_Val[2]); /* 发送内部温度测量到的电压 */
temp=Charge_Val[2];
UARTSend(g_channel3, sizeof(g_channel3));
Get_temp(temp); /* 把电压转换成温度发送 */
flag_ADC_finish = 0; /* 清采样完成标志位 */
UARTCharPut(UART0_BASE, '\r'); /* 换行 */
UARTCharPut(UART0_BASE, '\n'); /* 光标回到起始位置 */
delay(500000);
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 通过串口USRT0对A/D的采样电压进行测试,串口调试软件建议使用Windows自带的超级终端。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main(void)
{
ADC_Init(); /* 初始化ADC,对ADC0和ADC1进行
采样 */
usart_init(); /* 初始化串口,使用COM1,配置UART
为 9600波特率, 8-N-1模式发
送数据 */
Led_init();
delay(3000); /* 延时一段时间 */
while(1) {
Test_ADC(300000);
if (flag_ADC_finish) {
GPIOPinWrite(GPIO_PORTA_BASE, PA4, ~PA4); /* 点亮LED */
GPIOPinWrite(GPIO_PORTA_BASE, PA5, ~PA5);
Send_ADC_Data();
}
GPIOPinWrite(GPIO_PORTA_BASE, PA4, PA4); /* 熄灭LED */
GPIOPinWrite(GPIO_PORTA_BASE, PA5, PA5);
delay(100000);
}
/* return 0; */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -