单片机课程设计之360度全方位无差别无死角立体式最终版.docx
《单片机课程设计之360度全方位无差别无死角立体式最终版.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之360度全方位无差别无死角立体式最终版.docx(23页珍藏版)》请在冰豆网上搜索。
单片机课程设计之360度全方位无差别无死角立体式最终版
单片机课程设计报告
——带蜂鸣器闹钟的七段数码时间显示表
专业:
通信工程
指导老师:
陈麟
小组成员:
任浩然季平
王慧丽马元
索引
一.前言…………………………………………….3
二.设计功能……………………………………….3
三.电路原理图的组成部分…………………….....3
四.设计过程(附图片)………………………….4
五.程序代码………………………………………..6
六.问题及解决……………………………………15
七.设计分工………………………………………16
八.总结与感想……………………………………16
前言:
这个学期我们学习了《单片机原理及接口技术》这门课,由于这门课对实践操作能力有更高的要求,所以陈老师在开课的时候就告诉我们考察的方式将以小组完成设计来呈现。
这次小组设计的过程,不仅仅是对我们所学习单片机的知识的检验,教会我们如何从理论到实践,更培养了我们如何计划一件事情,如何合作完成一件事情的能力。
在整个设计过程中,大家分工设计,相互探讨,相互监督,学会了互相合作,互相宽容,学会了互相理解,在经历了几个晚上的努力,我们终于完成了我们最后的设计。
设计功能:
一个带有蜂鸣器闹钟的七段数码时间显示表
电路原理图的组成部分:
(从左往右,从上往下)
USB:
供电
1117-3.3:
变压器(把5V电压转化为3.3V)
LED灯:
检测是否通电(没有用)(两个)
蜂鸣器:
闹钟提醒(一个)
Header10X2:
程序输入端口
NRST:
电路板复位(恢复出厂设置)
LED灯:
装饰(闹钟响的时候亮)(四个)
开关:
S1:
切换闹钟,时间,星期
S2:
设置时切换前两位和后两位
S3;改变数值
S4:
关屏&显屏
PCF8563:
时钟芯片
STM32F103:
单片机
七段数码管(四位)
程序实现软件:
Keil:
编写程序
Alitum:
电路板的实现
设计过程:
电路原理图
电路板软件图正面
完成后的实体电路板正面
电路板软件图背面
完成后的实体电路板背面
焊好CPU后的板
程序实现(部分主程序)
#include"stm32f10x.h"
#include"PCF8563.h"
#include"Basic_configuration.h"
#include"Digital_tube.h"
#definetime1
#definealarm2
voidnormal_show(void);
voidmin_flicker(inttime_alarm);
voidhur_flicker(inttime_alarm);
voidtime_menu(void);
voidalarm_show(void);
voidalarm_open(void);
voidalarm_menu(void);
staticu32RTC_VAR_Hour=12,RTC_VAR_Minute=0;//实时时钟小时和分钟静态变量
staticu32Alarm_VAR_Hour=12,Alarm_VAR_Minute=1;//闹铃小时和分钟静态变量
intfunction_var=1;//按键功能变量1代表function2代表minute_hour_select3代表screen_off4代表alarm
u8bit_sel=0,temporary_min,temporary_hou,menu=1,temporary_min_1,temporary_hou_1;
staticu16RTC_VAR_SEC=0;
intflag=0,flag_1=0,distance_hou=0,distance_min=0,alarm_flag=0;
intmain()
{
gpio_configuration();
RTC_configuration();
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);
//EXTI_GenerateSWInterrupt(EXTI_Line8);
while
(1)
{
time_menu();
}
}
voidRTC_IRQHandler()
{
RTC_VAR_SEC++;
if(RTC_VAR_SEC>59)
{
RTC_VAR_Minute++;
if((RTC_VAR_Minute==Alarm_VAR_Minute)&&(RTC_VAR_Hour==Alarm_VAR_Hour))
alarm_flag=1;
if(RTC_VAR_Minute>59)
{
RTC_VAR_Hour++;
if(RTC_VAR_Hour>23)
RTC_VAR_Hour=0;
RTC_VAR_Minute=0;
}
RTC_VAR_SEC=0;
}
RTC_ClearFlag(RTC_FLAG_SEC);
}
voidnormal_show(void)
{
u16i=0;
for(i=550;i>0;i--)
{
DT_bitclose();
DT_segdisplay(RTC_VAR_Hour/10);
DT_bitdisplay
(1);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(RTC_VAR_Hour%10);
DT_bitdisplay
(2);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(RTC_VAR_Minute/10);
DT_bitdisplay(3);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(RTC_VAR_Minute%10);
DT_bitdisplay(4);
systick_delay_ms
(1);
}
for(i=550;i>0;i--)
{
DT_bitclose();
DT_segdisplay(RTC_VAR_Hour/10);
DT_bitdisplay
(1);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(RTC_VAR_Hour%10);
dot_show();
DT_bitdisplay
(2);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(RTC_VAR_Minute/10);
dot_close();
DT_bitdisplay(3);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(RTC_VAR_Minute%10);
DT_bitdisplay(4);
systick_delay_ms
(1);
}
}
voidmin_flicker(inttime_alarm)
{
u16i=0,var_hou,var_min;
if(time_alarm==time)
{
var_hou=temporary_hou;
var_min=temporary_min;
}
else
{
var_hou=temporary_hou_1;
var_min=temporary_min_1;
}
for(i=100;i>0;i--)
{
DT_bitclose();
DT_segdisplay(var_hou/10);
DT_bitdisplay
(1);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_hou%10);
DT_bitdisplay
(2);
systick_delay_ms
(1);
//DT_bitclose();
//DT_segdisplay(temporary_min/10);
//DT_bitdisplay(3);
//systick_delay_ms
(1);
//DT_bitclose();
//DT_segdisplay(temporary_min%10);
//DT_bitdisplay(4);
//systick_delay_ms
(1);
}
for(i=100;i>0;i--)
{
DT_bitclose();
DT_segdisplay(var_hou/10);
DT_bitdisplay
(1);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_hou%10);
dot_show();
DT_bitdisplay
(2);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_min/10);
dot_close();
DT_bitdisplay(3);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_min%10);
DT_bitdisplay(4);
systick_delay_ms
(1);
}
}
voidhur_flicker(inttime_alarm)
{
u16i=0,var_hou,var_min;
if(time_alarm==time)
{
var_hou=temporary_hou;
var_min=temporary_min;
}
else
{
var_hou=temporary_hou_1;
var_min=temporary_min_1;
}
for(i=100;i>0;i--)
{
//DT_bitclose();
//DT_segdisplay(temporary_hou/10);
//DT_bitdisplay
(1);
//systick_delay_ms
(1);
//DT_bitclose();
//DT_segdisplay(temporary_hou%10);
//DT_bitdisplay
(2);
//systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_min/10);
DT_bitdisplay(3);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_min%10);
DT_bitdisplay(4);
systick_delay_ms
(1);
}
for(i=100;i>0;i--)
{
DT_bitclose();
DT_segdisplay(var_hou/10);
DT_bitdisplay
(1);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_hou%10);
dot_show();
DT_bitdisplay
(2);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_min/10);
dot_close();
DT_bitdisplay(3);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(var_min%10);
DT_bitdisplay(4);
systick_delay_ms
(1);
}
}
voidEXTI9_5_IRQHandler(void)
{
if(EXTI_GetFlagStatus(EXTI_Line8)==1)
{
function_var=4;
temporary_min_1=Alarm_VAR_Minute;
temporary_hou_1=Alarm_VAR_Hour;
EXTI_ClearFlag(EXTI_Line8);
}
else
{
temporary_min=RTC_VAR_Minute;
temporary_hou=RTC_VAR_Hour;
function_var=2;
EXTI_ClearFlag(EXTI_Line9);
}
}
voidEXTI15_10_IRQHandler(void)
{
if(EXTI_GetFlagStatus(EXTI_Line11)==1)
{
function_var=3;
EXTI_ClearFlag(EXTI_Line11);
}
}
voidtime_menu(void)
{
while
(1)
{
switch(function_var)
{
case4:
NVIC_DisableIRQ(EXTI9_5_IRQn);
NVIC_DisableIRQ(EXTI15_10_IRQn);
while
(1)
{
//do
alarm_show();
//while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)!
=0);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)
{
while
(1)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)!
=1)
{
min_flicker(alarm);
temporary_min_1++;
if(temporary_min_1>59)temporary_min_1=0;
}
min_flicker(alarm);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)
{
while
(1)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)!
=1)
{
hur_flicker(alarm);
temporary_hou_1++;
if(temporary_hou_1>23)temporary_hou_1=0;
}
hur_flicker(alarm);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)break;
}
Alarm_VAR_Minute=temporary_min_1;
Alarm_VAR_Hour=temporary_hou_1;
function_var=1;
flag_1=1;
}
if(flag_1==1)break;
}
}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0)break;
}
flag_1=0;
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);
function_var=1;
break;
case2:
{
NVIC_DisableIRQ(EXTI9_5_IRQn);
NVIC_DisableIRQ(EXTI15_10_IRQn);
while
(1)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)!
=1)
{
min_flicker(time);
temporary_min++;
if(temporary_min>59)temporary_min=0;
}
min_flicker(time);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)
{
while
(1)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)!
=1)
{
hur_flicker(time);
temporary_hou++;
if(temporary_hou>23)temporary_hou=0;
}
hur_flicker(time);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)break;
}
RTC_VAR_Minute=temporary_min;
RTC_VAR_Hour=temporary_hou;
function_var=1;
flag=1;
}
if(flag==1)break;
}
flag=0;
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);
}
break;
case3:
{
DT_bitclose();
NVIC_DisableIRQ(EXTI9_5_IRQn);
NVIC_DisableIRQ(EXTI15_10_IRQn);
function_var=1;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)!
=0);
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);
}
break;
case1:
normal_show();break;
}
if(alarm_flag==1)
{
alarm_open();
alarm_flag=0;
}
}
}
voidalarm_show(void)
{
DT_bitclose();
DT_segdisplay(Alarm_VAR_Hour/10);
DT_bitdisplay
(1);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(Alarm_VAR_Hour%10);
dot_show();
DT_bitdisplay
(2);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(Alarm_VAR_Minute/10);
dot_close();
DT_bitdisplay(3);
systick_delay_ms
(1);
DT_bitclose();
DT_segdisplay(Alarm_VAR_Minute%10);
DT_bitdisplay(4);
systick_delay_ms
(1);
}
voidalarm_open(void)
{
intj=20;
NVIC_DisableIRQ(EXTI9_5_IRQn);
NVIC_DisableIRQ(EXTI15_10_IRQn);
do
{
GPIO_SetBits(GPIOA,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
systick_delay_ms(500);
//alarm_show();
GPIO_ResetBits(GPIOA,GPIO_Pin_12);
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
systick_delay_ms(500);
j--;
}
while(j!
=0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)!
=0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)!
=0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)!
=0&&GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)!
=0);
NVIC_EnableIRQ(EXTI9_5_IRQn);
NVIC_EnableIRQ(EXTI15_10_IRQn);
}
调试中的电路板
最终成品
问题及解决:
问题1:
在调试过程中,七段数码管亮度不够
解决办法:
短接三极管和分压电阻
问题2:
单片机无法响应中断
解决办法:
让单片机主动扫描端口,看是否有中断
问题3:
采购时没有与商家沟通好,导致有两个元器件无法配置
解决办法:
修改电路及电容电阻的配置
问题4:
有两个LED灯因为焊接顺序的原因没有顺利焊接上去
解决办法:
先用另外四个LED灯去测试PCB板,找出问题所在
问题5:
对7段数码管的了解少且网上资料参差不齐,导致设计引脚时出现错位
解决办法:
利用软件办法改变端口位置,并请教模电老师,帮助我们设置数码管的三极管和电阻的配置
设计分工:
程序编写:
任浩然季平
硬件调试:
任浩然季平王慧丽马元
电路焊接:
任浩然季平马元
图片提