资源描述
微机原理实验报告实验名称:控制SPI显示及LED闪烁实验 院 系:物理与机电工程学院 专业班级: 学 号: 学生姓名: 指导教师: 完成时间: 2011.04.20 报告成绩: 评阅意见: 评阅教师 日期 控制SPI显示与LED闪烁实验一、 实验目的:1、 掌握SPI主机实验7段数码管显示的使用和程序的应用;2、 将GPIO与SPI组合成倒计时显示,同时LED也在开始工作;3、 掌握相关程序的书写和更改;二、 实验器材:PC机,EasyARM2138开发板,AXD仿真软件。三、 实验原理:LPC2138具有一个SPI(SPI,Serial Periphl Interface)接口,它是一个同步、全双工串行接口,最大数据位速率为时钟速率的1/8,可以配置为主机或者从机。在同一总线上可以有多个主机或者从机,但同一时刻只能有一个主机和一个从机能够进行通信,在一次数据传输过程中,主机向从机发送一字节数据,从机也向主机返回一字节数据。SPI主机操作流程图1.SPI主机实验-7段数码管显示 实验使用LPC2138的SPI接口作为主机向74HC595发送数据,数据内容由7段数码显示,同时SPI主机接收74HC595的移位输出数据,即接收回前一个显示数据。实验硬件连接如图4.61所示 图4.61 SPI接口控制74HC595硬件连接图 图中已经将最高位输出(SQH)连接到LPC2131的SPI接口的MISO0,可用来读回74HC595移位输出的数据。 该实验演示在7段数码管上显示一些字符,字符的字模表存于一数组中,流程图如图4.62所示,程序代码如程序清单4.17所示。7段共阳数码管真值表LPC2138具有2个32位可编程定时/计数器,均具有4路捕获、4路比较匹配并输出电路。定时器对外时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低点平、翻转或者无动作)。它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。可用于对内部事件进行计数的实践间隔时器,或者通过捕获输入实现脉宽调制,亦可作为自由运行的定时器。定时器0和定时器1除了外设基地址以外,其他都相同。2.定时器0定时实验-中断方式 用定时器0实现0.5秒定时,使用中断方式实现定时控制,让蜂鸣器每秒钟响1次。程序需要在T0MCR中设置定时器0匹配复位TC并产生中断,还需设置向量中断控制器(VIC),使能并设置Timer0中断,最后等待中断。Timer0中断服务程序取反蜂鸣器控制口的电平,然后清除Timer0中断标志,最后通知VIC中断处理结束并返回。主程序和中断服务程序的流程图见图4.92,程序清单4.22所示。 图4.92 定时器0定时实验主程序和中断程序流程图四、实验程序: 实验说明:本次实验的目的是实现数码管现实倒计时9-0后LED1闪烁的效果,并且SPI的显示时间间隔、LED1闪烁间隔与定时器0设置的一致,不断循环。 注:修改过的程序均有下划线。#include config.h#define LEDS8 0xFF 18#define LEDS1 0x01 18#define HC595_CS (1 29) / P0.29口为74HC595的片选uint8 rcv_data; /观察读回的数据uint8 rcv_data; /观察读回的数据 /* 此表为LED09 */uint8 const DISP_TAB16 = / 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;/* 函数名称:MSPI_Init()* 函数功能:初始化SPI接口,设置为主机。* 入口参数:无* 出口参数:无*/void MSPI_Init(void) SPI_SPCCR = 0x52; / 设置SPI时钟分频 SPI_SPCR = (0 3) |/ CPHA = 0, 数据在SCK 的第一个时钟沿采样 (1 4) |/ CPOL = 1, SCK 为低有效 (1 5) |/ MSTR = 1, SPI 处于主模式 (0 6) |/ LSBF = 0, SPI 数据传输MSB (位7)在先 (0 7);/ SPIE = 0, SPI 中断被禁止/* 函数名称:MSPI_SendData()* 函数功能:向SPI总线发送数据。* 入口参数:data 待发送的数据* 出口参数:返回值为读取的数据*/uint8 MSPI_SendData(uint8 data) IOCLR = HC595_CS; / 片选74HC595 SPI_SPDR = data; while( 0 = (SPI_SPSR & 0x80);/ 等待SPIF置位,即等待数据发送完毕 IOSET = HC595_CS; return(SPI_SPDR);/* 函数名称 :main()* 函数功能 :使用定时器实现1秒钟定时。*/int main (void) uint8 tt=9;/*设置循环次数*/ PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;/ 设置管脚连接SPI PINSEL2 = PINSEL2&(0x08);/* 设置管脚连接GPIO*/IODIR = HC595_CS; MSPI_Init(); / 初始化SPI接口IO1DIR = LEDS8;/* 设置LED控制口输出*/IO1SET=0XFE 18;/* 定时器0初始化 */T0TC = 0;/* 定时器设置为0*/T0PR = 0;/* 时钟不分频*/T0MCR = 0x03;/* 设置T0MR0匹配后复位T0TC,并产生中断标志*/T0MR0 = Fpclk; /* 1秒钟定时*/T0TCR = 0x01;/* 启动定时器*/rcv_data = MSPI_SendData(DISP_TABtt);/ 发送显示数据while (1)while (T0IR & 0x01) = 0);/* 等待定时时间到*/tt-;rcv_data = MSPI_SendData(DISP_TABtt);/ 发送显示数据T0IR = 0x01;/* 清除中断标志*/while(tt=0)tt=9;T0IR = 0x01;/ 清除中断标志if (IO1SET & LEDS1) = 0)IO1SET = LEDS1;elseIO1CLR = LEDS1; return 0;五、实验心得体会: 通过本次实验让我我感触很深,对SPI、定时器和GPIO有了更深的了解,能够把他们组合在一起实现了更多的功能。这次实验中主要还是在同学的互帮互助下最终完成的,打到了互补的效果,在今后的学习过程中,我将继续努力,互相学习,发展团队合作的精神。7
展开阅读全文