?? main.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: zhangmingjie
** Created date: 2007-3-26
** Version: 1.0
** Descriptions: ADC_Display P1.27
**
**------------------------------------------------------------------------------------------------------
** Modified by: yangshiping
** Modified date: 2007-08-25
** Descriptions: 對程序的風格和注釋作調整,并檢查程序代碼。
** Rechecked by: Litiantian
********************************************************************************************************/
/********************************************************************************************************
** 函數功能: P2.10觸發ADC模塊的通道5進行電壓的測量,ADC使用中斷方式,然后將轉換結果從串口送出。
** 上位機使用EasyARM軟件全仿真的DOS窗口觀察。
** 調試說明:1、使用杜邦線把開發板上JP3(JTAG口右下方)的P2.10和跳線組JP1上的KEY1相連;
** 2、注意要拔開JP5的ISP跳線;
** 3、由W1調節測量電壓值;
** 4、通訊波特率115200,8位數據位,1位停止位,無奇偶校驗。
********************************************************************************************************/
#include "config.h"
uint32 addr5_data; // 存放AD結果寄存器內容的全局變量
uint8 ADC_Send_Enable; // 發送AD轉換結果給上位機的標志
#define UART_BPS 115200 // 通訊波特率115200
/*********************************************************************************************************
** 函數名稱 :IRQ_AD
** 函數功能 :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
** 函數功能 :AD通道5ADC轉換,使用中斷方式,并把結果轉換成電壓值,發送到串口。
** 調試說明 :1、在config.h中包含stdio.h;
** 2、在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功能
/* 進行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,正常工作模式
(2 << 24) | // START=2,當EDGE選擇的邊沿出現在P2.10管腳時啟動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)
{
/* 等待P2.10下降沿啟動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 + -