2013本一嵌入式实验报告模版 - 图文

更新时间:2024-05-25 21:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式系统及设计

综合实验报告

学 院:物理与信息工程学院 专 业:微电子 姓 名: 强书连 学 号: 111000628 指导老师:张志晓

实验一:GPIO、流水灯

1、实验目的

1. 熟悉Keil及protues的使用方法; 2. 熟悉keil和protues的联调方式;

3. 熟悉ARM7的GPIO功能特性及使用方法; 4. 掌握ARM7的中断控制过程及应用;

2、实验要求

应用GPIO设计流水灯,编写代码,与PROTUES联调仿真。

3、实验内容

(1、)通过I/O模拟同步串口与74HC595进行连接,控制74HC595驱动LED显示。

(2)、利用ARM开发工具,建立工程,并添加代码,编译并连接工程,生成HEX文件。

(3)、在PROTEUS软件中,连接电路原理图。右击LPC2124,弹出的Edit Component对话框中,为LPC2124添加HEX文件路径。启动仿真,观察结果。

4、设计流程图

5、实验总结

本次实验在既轻松又紧张的氛围中结束了,说起这次时长三节课的实验,满满的都是收获。

首先,对嵌入式的认识加深了一步。从大一到大二,直至大三,都感觉嵌入式是一个比较神圣庄严的学科,学好了就业就不愁的感觉。可是本门课一开课,就感觉,学的基本都是外部电路,对于一些指令并没有接触,或者说都是虚的东西,实验带我了解了嵌入式。

其次对上节课学的指令集有了一次切身的应用,更加印象深刻。虽说实验过程不算是很顺利,但总体来说是让我学到了东西的。

我会更加积极的进入接下来几次实验的学习。

6、附录 程序关键代码

#include \ uint32 i; #define uchar unsigned char for(;dly>0;dly--) #define uint32 unsigned int for(i=0;i<5000;i++); #define SPI_CS 0x00000100 /*P0.8*/ }

#define SPI_DATA 0x00000040 void HC595_SendDat(uint32 dat) /*P0.6*/ {

#define SPI_CLK 0x00000010 uint32 i; /*P0.4*/ IO0CLR=SPI_CS; #define PIN_P014 0x00004000 #define SPI_IOCON 0x00000150 for(i=0;i<8;i++) uint32 key_flag=1; { const uint32 IO0CLR=SPI_CLK; DISP_TAB[]={ 0x01,0x02,0x04,0x08,0x10 if((dat&0x80)!=0) ,0x20,0x40,0x80,0x00}; IO0SET=SPI_DATA; void delayns(uint32 dly) else { IO0CLR=SPI_DATA;

dat<<=1; IO0SET=SPI_CLK; } IO0SET=SPI_CS; }

int main(void) { uint32 i; PINSEL0=0x00000000; IO0DIR=SPI_IOCON; while(1) { for(i=0;i<8;i++)

{

HC595_SendDat(~DISP_TAB[i]); delayns(50);

while((IO0PIN&PIN_P014)==0 ) { delayns(10) ; } }} }

实验二:GPIO、中断应用

1、实验目的

5. 熟悉Keil及protues的使用方法; 6. 熟悉keil和protues的联调方式;

7. 熟悉ARM7的GPIO功能特性及使用方法; 8. 掌握ARM7的中断控制过程及应用;

2、实验要求

应用中断及GPIO设计一个按键控制秒表,编写代码,与PROTUES联调仿真。

3、实验内容

(1)、写出根据设计流程图,写出程序,并编译。

(2)、利用ARM开发工具,建立工程,并添加代码,编译并连接工程,生成HEX文件。

(3)、在PROTEUS软件中,连接电路原理图。右击LPC2124,弹出的Edit Component对话框中,为LPC2124添加HEX文件路径。启动仿真,观察结果。

4、设计流程图

5、实验总结

本次实验比上次的实验难了不少,不是纯粹的书上程序照抄下来。所以对我这种对指令集不是很熟悉的人来说,实验的困难程度还是有的,但在同学的帮助下,在自己的积极学习下,本次的实验顺利的结束了。

纵观本次实验,充满了讨论声,各种离开座位。因为不熟悉,也因为自己的学习能力不够,所以实验做得很吃力。

本次实验让我对相关内容有了更深刻的了解,尤其是通过跟同学的交流。并且让我对团队的力量有了更加坚定的信仰,一个人的力量小,可是一群人的力量是巨大的。

我会继续在接下来的实验中发挥自己的学习主动性。

6、附录 程序关键代码

#include #define Fpclk 11059200 //系统时钟

#define LED 0x00010000 //led灯

#define LED8 0x000ffff //数码管 const unsigned int DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

//数码管显示段码

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

void Sec_Display(int second) { int sec_ge; int sec_shi; second = SEC; sec_ge = second; sec_shi = second/10; IO0CLR = LED8; IO0SET = DISP_TAB[sec_shi] | (DISP_TAB[sec_ge]<<8); }

void __irq IRQ_Rtc(void) { if( (IO0SET & LED) == 0 ) IO0SET = LED; //点亮LED else IO0CLR = LED; //熄

灭LED

Sec_Display(SEC); //显示秒值 ILR = 0x01; //清除中断标志位 VICVectAddr = 0x00; //清除中断地址 }

void RtcInit(void) { PREINT = Fpclk/32768-1; //设置预分频器 PREFRAC = Fpclk-(Fpclk/32768)*32768; YEAR = 2012; //时间初始化值 MONTH = 1; DOM = 10; HOUR = 8; MIN=30; SEC=0; CIIR = 0x01; //设置秒值的增量产生一次中断 CCR = 0X01; //启动RTC VICIntSelect = 0x00; //所有中断通道设置为IRQ中断 VICVectCntl0 = 0x2d; //RTC中断通道分配最高优先级 VICVectAddr0 = (unsigned long) IRQ_Rtc; //设置中断服务程序地址向量 VICIntEnable = 0x00002000; //使能RTC中断 }

void LedInit(void) { PINSEL0 = 0X00000000;

IO0DIR = LED | LED8; Sec_Display(0); }

int main() {

LedInit(); RtcInit();

while(1); }

实验三:UART、AD综合实验

1、 实验目的

1. 熟悉Keil及protues的使用方法; 2. 熟悉keil和protues的联调方式;

3. 熟悉ARM7的GPIO功能特性及使用方法; 4. 掌握ARM7的中断控制过程及应用;

2、实验要求

使用A/D转换器的AIN0和AIN1测量两路直流电压,然后将转换结果从串口输出。

3、 实验内容

(1)、LPC2124的P0.0和P0.1引脚连接到虚拟终端的RXD和TXD端口;AIN0和AIN1分别接到两个电阻器,当阻值变化时可引起转换结果变化。

(2)、利用ARM开发工具,建立工程,并添加代码,编译并连接工程,生成HEX文件。

(3)、在PROTEUS软件中,连接电路原理图。右击LPC2124,弹出的Edit Component对话框中,为LPC2124添加HEX文件路

径。启动仿真,观察结果。

4、 设计流程图

5、实验总结

本次实验室本学期最后一次实验,带着不舍离开实验室。虽说实验做完了,我对嵌入式的学习还是不会完的,况且这次的实验并不是那么的顺利。

本次实验让我对相关知识有了再深一步的了解,并且对嵌入式这门课有了更深一步的了解,嵌入式少了软件或硬件,你都不能学的很精。在未学之前,感觉嵌入式就是软件,学习刚开始,感觉学习是硬件,现在我的认识或许更加全面。

感谢老师的谆谆教诲,我会在以后的学习,工作道路上受益匪浅的。

6、附录

程序关键代码

/****************************************************************************

* 文 件 名:main.c

* 功 能:使用ADC模块的通道0、1进行电压的测量,然后将转换结果从串口输出,

****************************************************************************/

#include \#include uint8 send_buf[16];

/****************************************************************************

* 名 称:DelayNS() * 功 能:长软件延时 * 入口参数:dly 延时参数,值越大,延时越久

* 出口参数:无

****************************************************************************/

void DelayNS(uint32 dly) {

uint32 i;

for(; dly>0; dly--) {

for(i=0; i<5000; i++); } }

/****************************************************************************

* 名 称:UART0Init()

* 功 能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验 * 入口参数:bps 通讯波特率 * 出口参数:无

****************************************************************************/

void UART0Init(uint32 bps) {

uint16 Fdiv;

PINSEL0 = (PINSEL0 & (~0x0F)) | 0x05; // 不影响其它管脚连接,设置I/O连接到UART0

U0LCR = 0x83; // DLAB = 1,可设置波特率 Fdiv = (Fpclk / 16) / bps; // 设置波特率 U0DLM = Fdiv / 256;

U0DLL = Fdiv % 256;

U0LCR = 0x03; }

/****************************************************************************

* 名 称:UART0SendByte()

* 功 能:向串口发送字节数据,并等待发送完毕。

* 入口参数:data 要发送的数据 * 出口参数:无

****************************************************************************/

void UART0SendByte(uint8 data) {

U0THR = data;

// 发送数据

while( (U0LSR&0x20)==0 ); // 等待数据发送完毕 }

/****************************************************************************

* 名 称:UART0SendStr()

* 功 能:向串口发送一字符串 * 入口参数:srt 要发送的字符串的指针

* 出口参数:无

****************************************************************************/

void UART0SendStr(char *str) {

while(1) {

if( *str == '\\0' ) break; UART0SendByte(*str++); // 发送数据 } }

/****************************************************************************

* 名 称:main() * 功 能:进行通道0、1电压ADC转换,并把结果转换成电压值,然后发送到串口。* 说 明:在CONFIG.H文件中包含stdio.h。

****************************************************************************/

int main(void) {

uint32 ADC_Data; char str[20];

UART0Init(9600);

// 初始化UART0 PINSEL1 = 0x01400000; // 设置P0.27、P0.28连接到AIN0、AIN1

/* 进行ADC模块设置,其中x<

((Fpclk / 1000000 - 1) << 8) |

// CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz (0 << 16) | // BURST = 0 ,软件控制转换操作 (0 << 17) | // CLKS = 0 ,使用11clock转换 (1 << 21) | // PDN = 1 , 正常工作模式(非掉电转换模式) (0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式) (1 << 24) | // START = 1 ,直接启动ADC转换 (0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换) DelayNS(10);

ADC_Data = ADDR;

// 读取ADC结果,并清除DONE标志位

while(1) {

ADCR = (ADCR&0x00FFFF00)|0x01|(1 << 24); // 设置通道1,并进行第一次转换

while( (ADDR&0x80000000)==0 ); // 等待转换结束

ADCR = ADCR | (1 << 24); // 再次启运转换

while( (ADDR&0x80000000)==0 ); // 等待转换结束

ADC_Data = ADDR; // 读取ADC结果

ADC_Data = (ADC_Data>>6) &

0x3FF; // 提取AD转换值

ADC_Data = ADC_Data * 3300/1024; // 数值转换

sprintf(str, \\\r\ADC_Data); UART0SendStr(str); DelayNS(100); ADCR = (ADCR&0x00FFFF00)|0x02|(1 << 24); // 设置通道2,并进行第一次转换

while( (ADDR&0x80000000)==0 ); // 等待转换结束 ADCR = ADCR | (1 << 24); // 再次启运转换

while( (ADDR&0x80000000)==0 ); // 等待转换结束

ADC_Data = ADDR;

// 读取ADC结果

ADC_Data = (ADC_Data>>6) & 0x3FF; // 提取AD转换值

ADC_Data = ADC_Data * 3300/1024; // 数值转换

sprintf(str, \\\r\ADC_Data);

UART0SendStr(str); DelayNS(100); } }

本文来源:https://www.bwwdw.com/article/9k87.html

Top