嵌入式课程设计报告.docx
《嵌入式课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计报告
嵌入式课程设计报告
跑
马
灯
专业:
计算机科学与技术
学号:
1310311141
班级:
13计算1班
姓名:
文雨婷
指导教师:
李浩
目录
1、摘要…………………………………………………………………………3
2、课题要求……………………………………………………………………3
三、硬件设计……………………………………………………………………3
3.1总体电路介绍…………………………………………………………3
四、软件设计……………………………………………………………………4
4.1 总体设计思想…………………………………………………………4
4.2程序流程图……………………………………………………………4
4.3程序编写与简介………………………………………………………6
五、实验仿真……………………………………………………………………14
5.1 LED灯的轮流显示………………………………………………………14
5.2KEY1的外部中断暂停系统……………………………………………15
5.3KEY1的外部中断继续系统……………………………………………15
六、结论…………………………………………………………………………16
一、摘要
在电子技术高度高发的今天,单片机迅猛发展,多功能按键已成为当代电子信息中不可或缺的重要部分,尤其是应用在当代的潮流物品上面,例如:
MP3,MP4,手机,数字电视等等高科技电子电器上面.正是由于它的出现和应用给人们的学习、工作、娱乐带来极大方便。
另外,多功能按键中还采用了石英晶体振荡电路,从而使它具有响应快、灵敏度高、性能稳定诸多优点。
它还可以利用一个按键实现单击、双击、连击的功能,真正做到了一键多功能,多效应,这也正是它的命名由来。
二、课题要求
LED1,LED2,LED3轮流点亮,时间由定时器控制,并将系统运行时间通过串口输出。
三个灯点亮一次触发一次中断。
KEY1控制系统的运行和暂停。
三、硬件设计
3.1总体电路介绍
该电路有主控芯片,其基本功能就是对每位按键进行单击、双击和三击后发光二极管会显示不同的发光个数及顺序。
其电路原理图如下图所示。
电路主要由三部分组成,由三个SB按键分别并接在P1口的PA.0—PA.2的三个引脚上,构成的输入部分;由晶体振荡电路构成的时钟电路。
芯片右边则是由三个发光二极管和排阻构成的显示部分。
四、软件设计
4.1总体设计思想
在硬件设计完成后,下面面对的就是驱动程序,根据电路和控制要求的需要,该程序涉及主程序和延时程序。
主程序用以识别是哪个按键按下及每个按键所按的次数,延时程序主要用于防止非人为按下按键或按键颤抖所出现的按键触动。
程序原理框图以下将会介绍。
4.2程序流程图
在进行编程之前要对需要解决的问题进行分析,明确任务后,有条理的画出流程图,就能充分表达程序的设计思路,可帮助设计程序,阅读程序和查找程序中的错误。
以下图示为该设计的流程图。
外部中断0流程图
外部中断1流程图
4.3程序编写与简介
/*******************************************************************************
*FunctionName:
intmain(void)
*Description:
主函数
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
intmain(void)
{
/*----------初始化-------------*/
RCC_Configuration();
GPIO_Configuration();
EXTI_Configuration();
USART_Configuration();
NVIC_Configuration();
TIM_Configuration();
printf("Thisisproducedbyyuexiang.\n");
while
(1)
{
if(SystemShutDown)
{
printf("pressPB6tocontinue..\n");
TIM_Cmd(TIM2,DISABLE);//失能TIM2
continue;
}
else
{
TIM_Cmd(TIM2,ENABLE);//使能TIM2
}
switch(CountValue%3)
{
case0:
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
break;
case1:
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
break;
case2:
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
GPIO_SetBits(GPIOA,GPIO_Pin_2);
break;
}
}
}
中断模块设计
定时器中断模块设计
/*******************************************************************************
*FunctionName:
TIM2_IRQHandler
*Description:
ThisfunctionhandlesTIM2globalinterruptrequest.
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidTIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除TIM2的中断源;
printf("Now,thesystemrunningtimeis%ds\n",CountValue);
CountValue++;
}
外部中断模块设计
/*******************************************************************************
*FunctionName:
EXTI9_5_IRQHandler
*Description:
ThisfunctionhandlesExternallines9to5interruptrequest.
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidEXTI9_5_IRQHandler(void)
{
SystemShutDown=~SystemShutDown;
if(SystemShutDown)
{
printf("PB6externalinterrupt...\n");
printf("Systemisgoingtoshutdown...\n");
}
else
{
printf("PB6externalinterrupt...\n");
printf("Systemisgoingtobootup...\n");
}
EXTI_ClearITPendingBit(EXTI_Line6);
}
被调用功能模块设计和编码
RCC模块
/*******************************************************************************
*FunctionName:
voidRCC_Configuration(void)
*Description:
ConfigurestheRCC
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidRCC_Configuration(void)
{
/*------使用外部RC晶振----------*/
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_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时钟为系统时钟
while(RCC_GetSYSCLKSource()!
=0x08);//等待PLL时钟作为系统时钟
}
GPIO模块
/*******************************************************************************
*FunctionName:
voidGPIO_Configuration()
*Description:
ConfigurestheGPIO
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidGPIO_Configuration()
{
GPIO_InitTypeDefGPIO_InitStructure;//声明一个IO口结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,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模块
/*******************************************************************************
*FunctionName:
voidEXTI_Configuration(void)
*Description:
ConfigurestheEXTI
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidEXTI_Configuration(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
GPIO_InitTypeDefGPIO_InitStructure;
/*=======================开启时钟================*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能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_PortSourceGPIOB,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_InitStructure);//初始化
EXTI_ClearITPendingBit(EXTI_Line6);
}
USART模块
/*******************************************************************************
*FunctionName:
voidUSART_Configuration(void)
*Description:
ConfigurestheUSART3
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidUSART_Configuration(void)
{
/*-------------定义结构体变量----------*/
USART_InitTypeDefUSART_InitStructure;
GPIO_InitTypeDefGPIO_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;
GPIO_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_FLOATING;
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_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(USART3,ENABLE);//使能USART3外设;
}
NVIC模块
/*******************************************************************************
*FunctionName:
voidNVIC_Configuration(void)
*Description:
ConfigurestheNVIC
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
#ifdefVECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);//向量表存放在RAM中
#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_IRQChannelSubPriority=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模块
/*******************************************************************************
*FunctionName:
vo