#include<iostm8s103f3.h>
unsigned int ms_count;
unsigned char adcflag;
unsigned int ADCData;
unsigned char ADCBuff[4];
/*******************************************************************************
**函數名稱:void UART1_Init(unsigned int baudrate)
**功能描述:初始化USART模塊
**入口參數:unsigned int baudrate -> 設置串口波特率
**輸出:無
*******************************************************************************/
void UART1_Init(unsigned int baudrate)
{
unsigned int baud; //
baud = 16000000 / baudrate; //設定串口相應波特率與串口時鐘的分頻數
//先寫BRR2 , 再寫BRR1
UART1_BRR2 = ((unsigned char)((baud & 0xf000) >> 8 )) | ((unsigned char)(baud & 0x000f)); //先寫波特比率的高4位與低4位
UART1_BRR1 = ((unsigned char)((baud & 0x0ff0) >> 4)); //后寫波特比率的中間8位
UART1_CR1_bit.UART0 = 0; //使能UART0
UART1_CR2_bit.RIEN = 0; //不使能中斷接收
UART1_CR2_bit.TEN = 1; //使能發送
UART1_CR2_bit.REN = 0; //接收不使能
}
/*******************************************************************************
**函數名稱:void Uart_SendData(unsigned char data)
**功能描述:向串口發送寄存器寫入一個字節數據
**入口參數:unsigned char data
**輸出:無
*******************************************************************************/
void Uart_SendData(unsigned char data)
{
while(!(UART1_SR&0X80)); //判斷發送數據寄存器是否為空
UART1_DR = data; //向發送寄存器寫入數據
while(!(UART1_SR&0X40)); //等待發送完成
}
/*******************************************************************************
**函數名稱:void Uart_SendString(unsigned char *data , unsigned char strlen)
**功能描述:向串口連續發送多個字符
**入口參數:unsigned char *data , unsigned char strlen
**輸出:無
*******************************************************************************/
void Uart_SendString(unsigned char *data , unsigned char strlen)
{
unsigned char datalen;
for(datalen = 0 ; datalen < strlen ; datalen++)
{
Uart_SendData(data[datalen]);
}
}
/*******************************************************************************
**函數名稱:void ADC_Init()
**功能描述:初始化ADC
**入口參數:無
**輸出:無
*******************************************************************************/
void ADC_Init()
{
PC_DDR_bit.DDR4 = 0; //設置PC->4 為輸入
PC_CR1_bit.C14 = 0; //設置為懸空輸入
PC_CR2_bit.C24 = 0; //設置中斷禁止
ADC_CR1_bit.SPSEL = 3; //fmaster / 18 = 16MHZ / 18 = 888888HZ
ADC_CR2_bit.ALIGN = 1; //RIGHT ALIGN
ADC_CSR_bit.CH = 2; //SELECT AIN2
ADC_CR1_bit.ADON = 1; //啟動ADC
}
/*******************************************************************************
**函數名稱:void ADC_Data_Read(unsigned int *AD_Value)
**功能描述:讀取ADC完成一次模數轉換結果
**入口參數:unsigned int *AD_Value
*AD_Value ->讀取ADC采樣數據的指針
**輸出:無
*******************************************************************************/
void ADC_Data_Read(unsigned int *AD_Value)
{
ADC_CR1_bit.ADON = 1; //啟動ADC
while(ADC_CSR_bit.EOC == 0); //等待轉換結束
*AD_Value = ADC_DRH; //先讀取高8位
*AD_Value = (unsigned int)((*AD_Value << 8) + ADC_DRL); //高8位與低8位相加,湊成16位數據
}
/*******************************************************************************
**函數名稱:void Timer4Init()
**功能描述:定時器4參數初始化
**入口參數:無
**輸出:無
*******************************************************************************/
void Timer4Init()
{
TIM4_IER_bit.UIE = 0; //禁止中斷
TIM4_EGR_bit.UG = 0;
TIM4_PSCR_bit.PSC = 7; // 設置TIM4的時鐘分頻系數為 128 即定時器時鐘 = 16000000 /128 = 125KHZ
TIM4_ARR = 125; // 設定TIM4產生1毫秒的計數值
TIM4_CNTR = 0x00; // 清除TIM4計數寄存器數值
TIM4_SR_bit.UIF = 0; //清除中斷標志
TIM4_SR_bit.TIF = 0;
TIM4_CR1_bit.CEN = 1; //使能定時器4計數
TIM4_CR1_bit.ARPE = 1; //使能預裝載
TIM4_IER_bit.UIE = 1; // 使能更新中斷
}
/* 主函數 */
int main(void)
{
asm("sim"); //關閉系統總中斷
CLK_CKDIVR = 0x00; //CPUDIV = 1 HSIDIV = 1 內部時鐘 = 16Mhz
UART1_Init(9600); //調用串口初始化函數,并設置波特率為9600 bps
ADC_Init(); //調用ADC初始化函數
Timer4Init(); //初始化定時器4
asm("rim"); //打開系統總中斷
while(1)
{
if(adcflag == 1) //1秒定時時間到對使能ADC進行采樣
{
asm("sim"); //關系統總中斷
// ADC_Data_Read(&ADCData); //讀取ADC的采樣數值
// Uart_SendString("ADC_DATA = " , 11); //發送字符串"ADC_DATA = "
ADCBuff[1] = ADCData % 10 + '0'; //轉換成ASCII碼
ADCBuff[0] = ADCData % 100 / 10 + '0';
// ADCBuff[1] = ADCData / 100 % 10 + '0';
//ADCBuff[0] = ADCData / 1000 + '0';
ADCBuff[2] = 0x0d; //換行字符
ADCBuff[3] = 0x0a;
Uart_SendString(ADCBuff , 4); //向PC機發送ADC采樣數值
adcflag = 0; //ADC采樣標志清除
asm("rim"); //開系統總中斷,準備下次ADC采樣
}
}
}
/** 定時器4中斷服務函數 */
#pragma vector = 25
__interrupt void TIM4_UPDATE_IRQHandler(void)
{
TIM4_SR_bit.UIF = 0; //清除中斷標志
ms_count++;
if(ms_count >= 1000) //記錄1秒時間到
{
ms_count = 0;
adcflag = 1; //設置ADC采樣標志
}
}
|