第一篇:0837嵌入式體系結(jié)構(gòu)綜合實驗報告
重慶理工大學(xué)
嵌入式體系結(jié)構(gòu)綜合實驗報告
題目:基于LPC2114的定時數(shù)據(jù)采集與通訊程序設(shè)計
二級學(xué)院 計算機科學(xué)與工程學(xué)院 專 業(yè) 計算機科學(xué)與技術(shù)
班 級 0837-1 學(xué)生姓名 冉晨 學(xué)號 10803070119 教 師 劉政 時 間 2010/11/14 成 績
目錄
一、實驗名稱-------------3
二、實驗?zāi)康?------------3
三、實驗設(shè)備與環(huán)境----3
四、實驗基本原理-------3
五、實驗內(nèi)容(包括主要算法分析與流程圖)--4
六、實驗源程序及分析-5
七、實驗運行結(jié)果及分析-----------------------------7
八、實驗心得體會-------8
一、實驗名稱
基于LPC2114的定時數(shù)據(jù)采集與通訊程序設(shè)計
二、實驗?zāi)康?/p>
使用EasyARM2114板上AIN0和AIN1輸入模擬量, 定時1mS中斷采樣,然后采樣的電壓每秒通過UART串口傳送到PC機串口助手顯示.三、實驗設(shè)備與環(huán)境
EasyARM2114實驗板,PC機,Windows XP操作系統(tǒng), H-JTAG串口,實驗相關(guān)數(shù)據(jù)線, ARM Developer Suite相關(guān)軟件,串口調(diào)試助手.四、實驗基本原理
本設(shè)計任務(wù)選用了Philips的LPC2114微處理器作為現(xiàn)場控制的核心。設(shè)計采用定時中斷方式,要求每1ms采集一點,LPC2114將采集所轉(zhuǎn)換的數(shù)據(jù)存儲在ADDR(A/D數(shù)據(jù)存儲器)中, A/D采樣結(jié)果也采用中斷讀取.然后程序通過SPI實現(xiàn)UART通訊, 傳送到PC機串口助手顯示, 其中的電壓值為實際采樣值,每秒顯示完后換行,同時要求串口發(fā)送采用中斷.五、實驗內(nèi)容(包括主要算法分析與流程圖)
設(shè)置P0,P1,P0.27,P0.28連接定時器初始化初始化串口模式A/D初始化數(shù)據(jù)采集并傳送顯示(每秒換行)中斷 該實驗最主要的算法實現(xiàn)在于中斷的實現(xiàn)(包括實現(xiàn)UART的中斷和數(shù)據(jù)采集后的A/D采樣結(jié)果),結(jié)合代碼分析: void __irq IRQ_ADC(){
count++;
if(count%2==1)
{
ADC_Data=ADDR;//存入寄存器數(shù)據(jù)
ADC_Data=(ADC_Data>>6)&0x3FF;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;//換算
sum1+=ADC_Data;//存入電壓AIN0總值
}
else
{
ADC_Data=ADDR;
ADC_Data=(ADC_Data>>6)&0x3FF;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;//換算
sum2+=ADC_Data;// 存入電壓AIN1總值
}
VICVectAddr=0x00;//通知VIC中斷處理結(jié)束 } 關(guān)于ADC的初始化: void ADC_Init(){
ADCR=
(3)
//選擇通道
((Fpclk/1000000-1)<<8)
(0<<16)
(0<<17)
(1<<21)
//PDN=1模式為正常工作
(0<<22)
(1<<26)
(1<<27)
//EDGE=1
VICVectCntl2=0x32;
VICVectAddr=(uint32)IRQ_ADC;
VICVIntEnable |=0x00040000;
}
六、實驗源程序及分析
#include“config.h” #include“stdio.h” #define UART_BPS 115200 uint8 comERR;int count=0;uint32 ADC_Data;long sun1=0,sum2=0;int v1=0,v2=0;int pSd=0,pRd=0;char SdBuff[100],RdBuff[20];void Time0Init()//定時器初始化 {
T0PR=9;
T0MCR=0x03;
T0MR1=1106/2;
T0TCR=0x03;
T0TCR=0x01;
T0EMR=0xC0;
} void __irq IRQ_UART_Exception()//通訊發(fā)送中斷 {
switch(U0IIR&0x0f)
{
case 0x06:
comERR=U0LSR;
break;
case 0x04:
while((U0LSR & 0x01)==1)
{
RdBuff[pRd++]=U0RBR;
if(pRd>=100)pRd=0;
}
break;
case 0x0c:
while((U0LSR&0x01)==1)
{
RdBuff[pRd++]=U0RBR;
if(pRd>=100)pRd=0;
}
break;
case 0x02:
if(SdBuff[pSd]!='