ARM课外实验报告书.docx
《ARM课外实验报告书.docx》由会员分享,可在线阅读,更多相关《ARM课外实验报告书.docx(20页珍藏版)》请在冰豆网上搜索。
ARM课外实验报告书
ARM课外实验报告书
系部名称
:
学生姓名
:
专业名称
:
班级
:
实验一UART通信的试验
一、实习内容:
通过Easy-ARM1138产生信号,向PC机发送信号,PC机通过超级终端接收信号。
二、实验板介绍:
通过232通信、485器件进行连接。
三、原理简述:
UART(UniversalAsynchronousReceiver/Transmitter)即通用异步收发传输器,工作于数据链路层。
包含了RS-232、RS-422、RS-485串口通信和红外(IrDA)等等。
UART协议作为一种低速通信协议,广泛应用于通信领域等各种场合。
UART基本可分为并口通信及串口通信两种。
异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。
图一给出了其工作模式:
其中各位的意义如下:
起始位:
先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:
紧接着起始位之后。
资料位的个数可以是4、5、6、7、8等,构成一个字符。
通常采用ASCII码。
从最低位开始传送,靠时钟定位。
奇偶校验位:
资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:
它是一个字符数据的结束标志。
可以是1位、1.5位、2位的高电平。
空闲位:
处于逻辑“1”状态,表示当前线路上没有资料传送。
四.实习步骤:
1.根据要求编写程序,接着连接电路,注意每个端口的对应正确,然后设置超级终端的参数,最后将程序下载到ARM板子中进行调试。
2.程序段的相关分析:
是控制LED闪烁发光的简单例程。
该程序实际上是实用工程模板Demo的一个应用,直接从main()函数开始编写。
在main()函数的前面,定义了LED所在的GPIO端口和管脚。
在main()里,首先定义了一个变量ulClock,在调用函数clockInit()时被初始化为当前的系统时钟频率,在后面对库函数SysCtlDelay()调用时会用到该变量。
控制LED分3步走:
调用函数SysCtlPeriEnable()使能LED所在的GPIO模块,调用函数GPIOPinTypeOut()配置LED所在的GPIO管脚为推挽输出,调用GPIOPinWrite()对LED所在的GPIO管脚写0和写1实现LED闪烁发光的效果。
部分程序分析如下:
主函数(程序入口)
intmain(void)
{
jtagWait();
clockInit();
SysCtlPeriEnable(LED_PERIPH);
GPIOPinTypeOut(LED_PORT,LED_PIN);
for(;;)
{
GPIOPinWrite(LED_PORT,LED_PIN,0x00);//点亮LED
SysCtlDelay(150*(TheSysClock/3000));
GPIOPinWrite(LED_PORT,LED_PIN,0xFF);//熄灭LED
SysCtlDelay(850*(TheSysClock/3000));
}
#include"systemInit.h"
#include"uartGetPut.h"
#include
分析:
在程序中设置自己的班级及序号
intmain(void)//主函数(程序入口)
{
chars[40];
jtagWait();
clockInit();//时钟初始化:
晶振,6MHz
uartInit();
sprintf(s,"\r\n");
uartPuts(s);
sprintf(s,"23456=0x%X\r\n",23456);
uartPuts(s);
for(;;)
{
}
}
五.实习小结:
这次试验我掌握了RS232的通信原理以及超级终端的使用方法,我们可一输入一个字符串,然后在超级终端接收相同的字符串,当然我们可以修改程序让输出汉字。
当我们把RS232的板子换成RS485的板子,我们就可以做RS485的串口通信试验了。
也就是说,我们可以通过板子不同可以实现不同的试验,我们可以让数码管根据要求显示数字,要求LED按不同的规律来闪烁。
也可以让LCD来显示字。
实验三温度传感器实验
一.实验内容:
首先我们应该了解相关的名词含义ADC:
Analog-to-DigitalConverter的缩写,指模/数转换器或者模拟/数字转换器。
真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。
在此实验中我们主要了解和搭建室内温度的采集及A/D转换。
二.实验板介绍:
在实验板的搭建过程中用到了Easyarm138和的A/D转换模块,其可以完成温度信号的采集及处理TMP123的功能主要是将被测温度
模拟量转换成数字量,
把数字化信号编码成时间比率(t1/t2)
形式。
T1和t2
时间上是连续
用同一个时钟即可获
二者
比率。
温度仅与时间比率有关,而与时钟频率无关,
时钟频率发生波动,也会
解码过程中被数字滤波器滤掉。
TMP123既可以检测温度,也可
单片机实现温度控制功能,适用于远程温度检测、微机或电子设备
温度监视器及工业过程控制等领域。
三.实验原理:
1.模数转换原理:
AD模数转换原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。
其优点是用简单电路就能获得高分辨率,但缺点是由于转换精度依赖于积分时间,因此转换速率极低。
2.通过TMP123将采集到的模拟温度连续信号进行模拟信号的采集并进行处理,通过与138板进行连接数据的传送通过USB与电脑进行连接,通过超级终端我们可以观测到室内温度的变换情况,与温度计算有关的计算公式实现如下:
10位的ADC模块集成有一个温度传感器,可以用来获取芯片的当前温度。
在温度传感器特性图里,给出了以下公式:
Vsenso=2.7-(T+55)/75,单位:
V
设Vsenso对应的ADC采样值为N,2.7V对应N1,(T+55)/75对应N2已知:
N1*(3/1024)=2.7N2*(3/1024)=(T+55)/75由此得到:
N=N1-N2=2.7/(3/1024)-((T+55)/75)/(3/1024)解得:
T=(151040-225*N)/1024结论:
ADC配置为温度传感器模式后,只要得到ADC采样值N,就能推算出当前的温度T。
温度及电压测试图:
3.实习步骤
熟悉实验过程中要用到的138有关模块及相关的拐角功能,其次按实际的电路的原理图进行电路的连接,将已经调试好的程序下载致IAR软件中同时并打开电脑的超级终端,然后运行此时我们可以在超级终端观测到实时的室内温度。
四.重要的ADC主函数如下:
tBooleanADC_EndFlag=false;
//定义ADC转换结束的标志
//系统节拍定时器初始化
voidSysTickInit(void)
{
SysTickPeriodSet(TheSysClock);
//设置SysTick计数器的周期值
SysTickIntEnable();
//使能SysTick中断
IntMasterEnable();
//使能处理器中断
SysTickEnable();
//使能SysTick计数器
}//ADC初始化
voidadcInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_ADC);
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);
//设置ADC采样速率
ADCSequDisable(ADC_BASE,
//采样序列配置:
ADC基址,采样序列编号,触发事件,采样优先级
ADCSequConfig(ADC_BASE,3,ADC_TRIGGER_PROCESSOR,0);
//采样步进设置:
ADC基址,采样序列编号,步值,通道设置
ADCSequStepConfig(ADC_BASE,3,0,ADC_CTL_TS|
ADC_CTL_END|
ADC_CTL_IE);
ADCIntEnable(ADC_BASE,3);
//使能ADC中断
IntEnable(INT_ADC3);
//使能ADC采样序列中断
IntMasterEnable();
//使能处理器中断
ADCSequEnable(ADC_BASE,3);
//使能采样序列
}
//ADC采样
unsignedlongadcSample(void)
{
unsignedlongulValue;
ADCProcessorTrigger(ADC_BASE,3);
//处理器触发采样序列
while(!
ADC_EndFlag);
//等待采样结束
ADC_EndFlag=false;
//清除ADC采样结束标志
ADCSequDataGet(ADC_BASE,3,&ulValue);
//读取ADC转换结果
return(ulValue);
}
//显示芯片温度值
voidtmpDisplay(unsignedlongulValue)
{
unsignedlongulTmp;
charcBuf[40];
ulTmp=151040UL-225*ulValue;
sprintf(cBuf,"%ld.",ulTmp/1024);
uartPuts(cBuf);
sprintf(cBuf,"%ld",(ulTmp%1024)/102);
uartPuts(cBuf);
uartPuts("℃\r\n");
}intmain(void)
{
unsignedlongulValue;
jtagWait();
clockInit();
//时钟初始化:
PLL,12.5MHz
uartInit();
//UART初始化
adcInit();
//ADC初始化
SysTickInit();
{
SysCtlSleep();
//睡眠,减少耗电以降低温度
ulValue=adcSample();
tmpDisplay(ulValue);
}}
//SysTick计数器的中断服务函数
voidSysTick_ISR(void)
{
//仅用于唤醒CPU,而不需要做其他事情
}
//ADC采样序列3的中断
voidADC_Sequence_3_ISR(void)
{unsignedlongulStatus;
ulStatus=ADCIntStatus(ADC_BASE,3,true);
//读取中断状态
ADCIntClear(ADC_BASE,3);
//清除中断状态,重要
if(ulStatus!
=0)
//如果中断状态有效
{
ADC_EndFlag=true;
//置位ADC采样结束标志
}
}
五.实习小结
1.实验的过程中熟悉了常见的模数转换器的原理及实际的工作参数,尤其是TMP123的集成电路设计的内部构造,这对数电知识和模电知识的运用有着密切的联系,并了解了其外围电路的连接的机理,尤其是在和单片机的连接上,TMP123既可以检测温度,也可
单片机实现温度控制功能,适用于远程温度检测、微机或电子设备
温度监视器及工业过程控制等领域。
2.A/D转换的技术在模拟到数字的领域开通了道路,因为在数字领域信息的传递可以离散化,这可以较方便的在计算机及通信中进行传输,同时由于现代的集成电路的不断的发展,在局部及较远的距离传输时数字信号有着较理想的作用,这也是数字信号的优势。
而与硬件的相关软件也能更好的处理数字领域的域值。
实验四液晶显示实验
1.实验内容:
通过实验了解和掌握和了解基本的黑白液晶显示器显示原理,并利用其显示所要得到实验目的,并掌握4*4键盘工作的简单原理。
2.实验板介绍(器件):
1.4*4的按键矩阵模块。
2.黑白液晶显示器模块
3.实验原理:
1.矩阵式键盘的结构与工作原理;在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
2.显示原理:
LCD液晶显示器的真实解析度定义为“定点形式”,所以我们在使用LCD显示器时,这样画面所呈现的影像将会越清晰,使用起来感觉也会越好。
3.
4.实验步骤:
1.搭建好电路之后,在IAR环境下进行程序的调试并在显示屏上点阵显示出目的的结果。
部分的程序段如下:
#defineSysCtlPeriEnableSysCtlPeripheralEnable
#defineSysCtlPeriDisableSysCtlPeripheralDisable
#defineGPIOPinTypeInGPIOPinTypeGPIOInput
#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput
//定义KEY
#defineKEY_PERIPHSYSCTL_PERIPH_GPIOG
#defineKEY_PORTGPIO_PORTG_BASE
#defineKEY_PINGPIO_PIN_5
//防止JTAG失效
voidJTAG_Wait(void)
{
SysCtlPeriEnable(KEY_PERIPH);//使能KEY所在的GPIO端口
GPIOPinTypeIn(KEY_PORT,KEY_PIN);
//设置KEY所在管脚为输入,PG5
if(GPIOPinRead(KEY_PORT,KEY_PIN)==0x00)
//如果复位时按下KEY,则进入
{
for(;;);
//死循环,以等待JTAG连接
}
SysCtlPeriDisable(KEY_PERIPH);
//禁止KEY所在的GPIO端口
}
//定义全局的系统时钟变量
unsignedlongTheSysClock=12000000UL;
//系统初始化
voidSystemInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V);
//设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC|
//系统时钟设置,采用主振荡器
SYSCTL_OSC_MAIN|
SYSCTL_XTAL_6MHZ|
SYSCTL_SYSDIV_1);
/*
SysCtlLDOSet(SYSCTL_LDO_2_75V);
//配置PLL前将LDO电压设置为2.75V
SysCtlClockSet(SYSCTL_USE_PLL|
//系统时钟设置,采用PLL
SYSCTL_OSC_MAIN|
//主振荡器
SYSCTL_XTAL_6MHZ|
//外接6MHz晶振
SYSCTL_SYSDIV_10);
//分频结果为20MHz
*/
TheSysClock=SysCtlClockGet();
//获取系统时钟,单位:
Hz
LCD_Init();
//初始化LED1和LED2
}
unsignedchars1[]={"张坤博西安邮电学院"};
unsignedchar*p1=s1;
unsignedchars2[]={"张坤博电子零六零七"};
unsignedchar*p2=s2;
unsignedchars3[]={"张坤博电子零六零七"};
unsignedchar*p3=s3;
unsignedchars4[]={"张坤博电子零六零七”};
unsignedchar*p4=s4;
unsignedchars5[]={"点阵式液晶屏"};
unsignedchar*p5=s5;
unsignedchar*p6=s6;
unsignedchars7[]={"省"};
unsignedchar*p7=s7;
unsignedchars8[]={"心"};
unsignedchar*p8=s8;
unsignedchars9[]={"波形:
方波"};
unsignedchar*p9=s9;
unsignedchars10[]={"频率:
1MHZ"};
unsignedchar*p10=s10;
unsignedchars11[]={":
正弦波"};
unsignedchar*p11=s11;
unsignedchars12[]={":
方波"};
unsignedchar*p12=s12;
unsignedchars13[]={":
三角波"};
unsignedchar*p13=s13;
unsignedchars14[]={":
锯齿波"};
unsignedchar*p14=s4;
//主函数(程序入口)
intmain(void)
{intap;
unsignedlongi;
JTAG_Wait();
//防止JTAG失效,重要!
while
(1)
{
SystemInit();
LCMDisplayPicture_4();Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_5();Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_6();
for(i=0;i<6;i+=6)
{
WRCM(0X91+i);
HANZI(s9);
}
for(i=0;i<6;i+=6)
{
WRCM(0X89+i);
HANZI(s10);
}
Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_7();
for(i=0;i<7;i+=7)
{
WRCM(0X81+i);
HANZI(s11);
}
//系统初始
for(i=0;i<7;i+=7)
{
WRCM(0X91+i);
HANZI(s12);
}
//系统初始化
for(i=0;i<7;i+=7)
{
WRCM(0X89+i);
HANZI(s13);
}
//系统初始化
for(i=0;i<7;i+=7)
{WRCM(0X99+i);
HANZI(s14);
}
Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_3();Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture();
Delay(2500*(TheSysClock/4000));SystemInit();
LCMDisplayPicture_1();
Delay(2500*(TheSysClock/4000));SystemInit();
LCMDisplayPicture_2();
Delay(2500*(TheSysClock/4000));
SystemInit();
for(i=0;i<8;i+=8)
{
WRCM(0X80+i);
HANZI(s1);
}
Delay(500*(TheSysClock/4000));
//系统初始
for(i=0;i<8;i+=8)
{
WRCM(0X90+i);
HANZI(s2);
}
Delay(500*(TheSysClock/4000));
//系统初始化
for(i=0;i<8;i+=8)
{
WRCM(0X88+i);
HANZI(s3);
}
Delay(500*(TheSysClock/4000));
//系统初始化
for(i=0;i<8;i+=8)
{
WRCM(0X98+i);
HANZI(s4);
}
Delay(2500*(TheSysClock/4000));
SystemInit();
for(ap=0;ap<5;ap++)
{Delay(200*(TheSysClock/4000));
LCMDisplayPicture();
for(i=0;i<8;i+=8)
{
WRCM(0X80+i);
HANZI(s6);
}
WRCM(0X90);
HANZI(s7);
WRCM(0X97);
HANZI(s7);
WRCM(0X88);
HANZI(s8);
WRCM(0X8F);
HANZI(s8);
for(i=0;i<8;i+=8)
{WRCM(0X98+i);
HANZI(s6);
}
Delay(200*(TheSysClock/4000));
//LCMDisplayPicture_1();
}
//系统初始化
SystemInit();
for(ap=0;ap<5;ap++)
{Delay(200*(TheSysClock/4000));
//LCMDisplayPicture_1();
for(i=0;i<16;i+=8)
{
WRCM(0X88+i);
HANZI(s5);
}
Delay(200*(TheSysClock/4000));
LCMDisplayPicture_2();
}
SystemInit();
for(ap=0;ap<5;ap++)
{