龙 岩 学 院
实 验 报 告
实验日期 2010/6/3 室温 大气压 成 绩
班级07电本(2)班 学号2007050409姓 名 惠华鹏 同组人
实验题目:SPI主机实验——7段数码管显示-数码管倒计时 一、实验目的 1,复习GPIO的管脚功能,学会应用SPI程序、编写程序及导入; 2,设计并实现交通灯的功能; 3,锻炼自己的设计、创造和综合性; 4,了解并掌握实时时钟的增量中断用法以及SPI用法; 5,熟练掌握SPI的管脚功能及在实际电路中的应用方法。 二、实验仪器 微型电子计算机(含软件H-JTAG V0.3.1和ADSv1_2) Easy ARM2138开发板 UART0接口线 USB接口电源线和JTAG接口线以及部分跳线。 三、实验原理 特性: 数码管倒计时流程图为: 实验说明: 本次实验用实时时钟的秒增量中断结合SPI的7段数码管显示,再加上GPIO口的LED显示程序,编程实现数码管从9到1的倒计时显示,其间隔以实时时钟的秒增量中断来实现,在第一次的9到1倒计时过程中,东西方向的红灯亮,南北方向的绿灯亮,且南北方向的黄灯在倒计时5后会闪烁。当第二次的9到1倒计时过程中,东西方向的绿灯亮,南北方向的红灯亮,且东西方向的黄灯在倒计时5秒时会闪烁,并伴有蜂鸣器嘀嘀的声音。如此不断的循环下去,实现了交通灯的效果。 在本次实验中,东西方向的红,黄,绿灯分别用LED1, LED2, LED3表示。南北方向的红,黄,绿灯分别用LED6, LED7, LED8表示。 四、 实验内容 程序: #include \"config.h\" #define HC595_CS (1 << 29) // P0.29口为74HC595的片选 #define BEEP 1<<11 const uint32 LEDS8 = (0xFF << 18); const uint32 LED1 = (1 << 18); const uint32 LED2 = (1 << 19); const uint32 LED3 = (1 << 20); const uint32 LED6 = (1 << 23); const uint32 LED7 = (1 << 24); const uint32 LED8 = (1 << 25); uint8 rcv_data; uint8 i=9; uint32 flag=0; /******************************************************************************************************** ** 函数名称:DelayNS() ** 函数功能:长软件延时 ** 入口参数:dly ** 出口参数:无 ***********/ void DelayNS(uint32 dly) { uint32 k; for(; dly>0; dly--) for(k=0; k<50000;k++); } ********************************************************************************* 函数名称 : RTC_Int() ** 功能描述 : RTC中断服务函数。 ** 入口参数 :无 ** 出口参数 :无 ******************************************************************************* void MSPI_Init(void) { //PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI 延时参数,值越大,延时越久 ********************************************************************************************* PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ; SPCCR = 0x52; // 设置SPI时钟分频 } ************************** ** 函数名称:MSPI_SendData() ** 函数功能:向SPI总线发送数据。 ** 入口参数:data 待发送的数据 ** 出口参数:返回值为读取的数据 *******************************************************************************uint8 MSPI_SendData(uint8 data) { IOCLR = HC595_CS; // 片选74HC595 SPCR = (0 << 3) | (1 << 4) | (1 << 5) | (0 << 6) | (0 << 7); // CPHA = 0, 数据在SCK 的第一个时钟沿采样 // CPOL = 1, SCK 为低有效 // MSTR = 1, SPI 处于主模式 // LSBF = 0, SPI 数据传输MSB (位7)在先 // SPIE = 0, SPI 中断被禁止 SPI_SPDR = data; while( 0 == (SPI_SPSR & 0x80)); IOSET = HC595_CS; return(SPI_SPDR); } uint8 const DISP_TAB[10] = { // // 等待SPIF置位,即等待数据发送完毕 0 1 2 3 4 5 6 7 8 9 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void __irq RTC_Int(void) { PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO IO1DIR = LEDS8; // 设置LED1控制口为输出 IO1SET=LEDS8; if(flag==0) { IO1CLR=LED1; // 东西方向红灯亮 IO1CLR=LED8; // 南北方向绿灯亮 if(i==5|i==3|i==1) IO1CLR=LED7; // 当i<5以后,南北方向的黄灯闪烁 IOCLR=BEEP;DelayNS(50); else IO1SET=LED7; IOSET=BEEP; DelayNS(50); } if(flag==0xFFFFFFFF) { IO1CLR=LED3; // 东西方向绿灯亮 IO1CLR=LED6; // 南北方向红灯亮 if(i==5|i==3|i==1) IO1CLR=LED2; // 当i<5以后,东西方向的黄灯闪烁 DelayNS(50); else IO1SET=LED2; IOSET=BEEP; DelayNS(50); } rcv_data = MSPI_SendData(DISP_TAB[i]); // 发送显示数据 i--; if(i==0) { flag=~flag; i=9; } ILR = 0x01; // 清除RTC增量中断标志 VICVectAddr = 0; // 向量中断结束 } ************************* IOCLR=BEEP; ** 函数名称: main() ** 功能描述: RTC秒定时中断实验。 ******************************************************************************* int main (void) { PINSEL0 = 0x00005500; PINSEL0 = 0x00000000; PINSEL1 = 0x00000000; IODIR = HC595_CS|BEEP; MSPI_Init(); IRQEnable(); /* RTC初始化 */ PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器 PREFRAC = Fpclk - (Fpclk / 32768) * 32768; CIIR = 0x01; // 设置秒值的增量产生一次中断 ILR = 0x03; // 清除RTC增量和报警中断标志 CCR = 0x01; /* VIC初始化 */ // 设置所有中断连接IRQ中断 // 分配通道0 // 设置中断服务程序地址 // 使能RTC中断 // 等待中断 // 启动RTC // IRQ中断使能 // 设置SPI管脚连接 VICIntSelect = 0x00; VICVectCntl0 = 0x20 | 13; VICVectAddr0 = (int)RTC_Int; VICIntEnable = (1 << 13); while(1); return 0; } 五、 实验结果 本次实验的结果是在数码管上以实时时钟的秒间隔循环显示从9到1的倒计时,在第一次的9到0倒计时过程中,LED1(东西红), LED8(南北绿), LED7(南北黄)灯会亮,在倒计到5时,LED7(南北黄)灯开始闪烁,并伴有BEEP的滴答声。在第二次的9到0倒计时过程中,LED3(东西绿), LED6(南北红), LED2(东西黄)灯会亮,在倒计到5时,LED2(东西黄)灯开始闪烁,并伴有BEEP的滴答声。如此不断的循环。 六、 实验心得 通过本次的实验,使我进一步熟悉了ARM的硬件结构、程序的书写及其强大的功能。使自己了解并掌握实时时钟的增量中断用法和SPI 7段数码管显示用法,并且更熟练地应用GPIO口以及引脚的设置,通过设计生活中实用的交通灯,培养自己的思维和加强自己的系统设计能力,在以后的设计中应更多的设计与实际有关的东西。