1、嵌入式课程设计报告嵌入式课程设计报告跑马 灯 专 业: 计算机科学与技术 学 号: 1310311141 班 级: 13计算1班 姓 名: 文 雨 婷 指导教师: 李 浩 目录1、摘要32、课题要求3三、硬件设计33.1 总体电路介绍3四、软件设计44.1 总体设计思想44.2 程序流程图44.3 程序编写与简介6五、实验仿真14 5.1 LED灯的轮流显示145.2 KEY1的外部中断暂停系统155.3 KEY1的外部中断继续系统15六、 结论16 一、摘要在电子技术高度高发的今天,单片机迅猛发展,多功能按键已成为当代电子信息中不可或缺的重要部分,尤其是应用在当代的潮流物品上面,例如:MP3
2、,MP4,手机,数字电视等等高科技电子电器上面.正是由于它的出现和应用给人们的学习、工作、娱乐带来极大方便。另外,多功能按键中还采用了石英晶体振荡电路,从而使它具有响应快、灵敏度高、性能稳定诸多优点。它还可以利用一个按键实现单击、双击、连击的功能,真正做到了一键多功能,多效应,这也正是它的命名由来。二、课题要求LED1, LED2, LED3轮流点亮,时间由定时器控制,并将系统运行时间通过串口输出。三个灯点亮一次触发一次中断。KEY1控制系统的运行和暂停。三、硬件设计3.1 总体电路介绍该电路有主控芯片,其基本功能就是对每位按键进行单击、双击和三击后发光二极管会显示不同的发光个数及顺序。其电路
3、原理图如下图所示。电路主要由三部分组成,由三个SB按键分别并接在P1口的PA.0PA.2的三个引脚上,构成的输入部分;由晶体振荡电路构成的时钟电路。芯片右边则是由三个发光二极管和排阻构成的显示部分。 四、软件设计4.1总体设计思想在硬件设计完成后,下面面对的就是驱动程序,根据电路和控制要求的需要,该程序涉及主程序和延时程序。主程序用以识别是哪个按键按下及每个按键所按的次数,延时程序主要用于防止非人为按下按键或按键颤抖所出现的按键触动。程序原理框图以下将会介绍。4.2程序流程图 在进行编程之前要对需要解决的问题进行分析,明确任务后,有条理的画出流程图,就能充分表达程序的设计思路,可帮助设计程序,
4、阅读程序和查找程序中的错误。以下图示为该设计的流程图。外部中断0流程图外部中断1流程图4.3程序编写与简介/* Function Name : int main(void)* Description : 主函数* Input : None* Output : None* Return : None*/int main(void) /*-初始化-*/ RCC_Configuration(); GPIO_Configuration(); EXTI_Configuration(); USART_Configuration(); NVIC_Configuration(); TIM_Configurat
5、ion(); printf(This is produced by yuexiang.n); while(1) if(SystemShutDown) printf(press PB6 to continue.n); TIM_Cmd(TIM2, DISABLE);/失能TIM2 continue; else TIM_Cmd(TIM2, ENABLE);/使能TIM2 switch(CountValue%3) case 0: GPIO_SetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA, GPIO_Pin_1); GPIO_ResetBits(GPIO
6、A, GPIO_Pin_2); break; case 1: GPIO_ResetBits(GPIOA, GPIO_Pin_0); GPIO_SetBits(GPIOA, GPIO_Pin_1); GPIO_ResetBits(GPIOA, GPIO_Pin_2); break; case 2: GPIO_ResetBits(GPIOA, GPIO_Pin_0); GPIO_ResetBits(GPIOA, GPIO_Pin_1); GPIO_SetBits(GPIOA, GPIO_Pin_2); break; 中断模块设计定时器中断模块设计/* Function Name : TIM2_IR
7、QHandler* Description : This function handles TIM2 global interrupt request.* Input : None* Output : None* Return : None*/void TIM2_IRQHandler(void) TIM_ClearITPendingBit(TIM2, TIM_IT_Update); / 清除TIM2的中断源 ; printf(Now, the system running time is %dsn, CountValue); CountValue +;外部中断模块设计/* Function N
8、ame : EXTI9_5_IRQHandler* Description : This function handles External lines 9 to 5 interrupt request.* Input : None* Output : None* Return : None*/void EXTI9_5_IRQHandler(void) SystemShutDown = SystemShutDown; if(SystemShutDown) printf(PB6 external interrupt.n); printf(System is going to shut down.
9、n); else printf(PB6 external interrupt.n); printf(System is going to boot up.n); EXTI_ClearITPendingBit(EXTI_Line6);被调用功能模块设计和编码RCC模块/* Function Name : void RCC_Configuration(void)* Description : Configures the RCC* Input : None* Output : None* Return : None*/void RCC_Configuration(void) /*-使用外部RC晶振
10、-*/ RCC_DeInit(); /时钟默认初始化 RCC_HSEConfig(RCC_HSE_ON);/使能外部的高速时钟 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) = RESET);/等待外部的高速时钟就绪 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /使能指令预存取 FLASH_SetLatency(FLASH_Latency_2); /等待两个周期 RCC_HCLKConfig(RCC_SYSCLK_Div1); /设置AHB时钟为系统时钟 RCC_PCLK2Config(RCC_
11、HCLK_Div1); /设置APB2时钟为AHB时钟 RCC_PCLK1Config(RCC_HCLK_Div2); /设置APB1时钟为AHB/2时钟 RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); /设置PLL时钟为外部高速时钟的9倍频 RCC_PLLCmd(ENABLE); /使能PLL时钟 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET); /等待PLL时钟使能就绪 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /配置PLL时钟为系统时钟
12、while(RCC_GetSYSCLKSource()!=0x08); /等待PLL时钟作为系统时钟GPIO模块/* Function Name : void GPIO_Configuration()* Description : Configures the GPIO* Input : None* Output : None* Return : None*/void GPIO_Configuration() GPIO_InitTypeDef GPIO_InitStructure; / 声明一个IO口结构体变量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI
13、OA , ENABLE); / 使能APB2外设GPIOA时钟 /=PE口IO结构体初始化= GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; /设置引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /管脚频率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /模式为推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); /初始化GPIOA寄存器EXTI模块/*
14、 Function Name : void EXTI_Configuration(void)* Description : Configures the EXTI* Input : None* Output : None* Return : None*/void EXTI_Configuration(void) EXTI_InitTypeDef EXTI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* =开启时钟=*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); /
15、使能APB2外设GPIOC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /配置PB6为外部中断 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /上拉输入 GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGP
16、IOB,GPIO_PinSource6); /EXTI6 EXTI_DeInit(); /将EXIT寄存器重设置为缺省值 EXTI_InitStructure.EXTI_Line = EXTI_Line6 ; /中断线 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt ; /中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; /双边沿 EXTI_InitStructure.EXTI_LineCmd = ENABLE; /使能 EXTI_Init(&EXTI_I
17、nitStructure); /初始化 EXTI_ClearITPendingBit(EXTI_Line6);USART模块/* Function Name : void USART_Configuration(void)* Description : Configures the USART3* Input : None* Output : None* Return : None*/void USART_Configuration(void) /*-定义结构体变量-*/ USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_
18、InitStructure; /*-使能相应外设的时钟-*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); /*-USART3重新映射-*/ GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE); /*-配置USART3_TX(PC.10)-*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPI
19、O_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC,&GPIO_InitStructure); /*-配置USART3_RX(PC.11)-*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAT
20、ING; GPIO_Init(GPIOC,&GPIO_InitStructure); /*-USARTd的各个参数配置-*/ USART_InitStructure.USART_BaudRate = 9600; /设置USART传输的波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /8位数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; /在一帧数据传输完再传一位停止位 USART_InitStructure.USART_Parity = USART
21、_Parity_No; /无奇偶校验 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;/接受发送使能 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /硬件流控制失能(无硬件流控制) USART_Init(USART3,&USART_InitStructure); /初始化USART3的寄存器/ USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); USART_Cmd(U
22、SART3,ENABLE); /使能USART3外设; NVIC模块/* Function Name : void NVIC_Configuration(void)* Description : Configures the NVIC* Input : None* Output : None* Return : None*/void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0); /向量表存放在R
23、AM中#else NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); /向量表存放在FLASH中#endif NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /选择向量优先级组 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; /选择中断向量通道为定时器2的通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /先优先级为0 NVIC_InitStructure.NVIC_IRQCha
24、nnelSubPriority = 0; /亚优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /使能中断向量 NVIC_Init(&NVIC_InitStructure); /完成初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; /KEY1外部中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);TIM模块/* Function Name : vo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1