5、系统软件设计
5.1系统主程序
在本设计系统中,从系统主程序开始,进入各模块的系统初始化,该初始化包括:串口初始化设置串口频率和波特率、定时器的初值设置、中断函数的进入条件、和端口的初始化点评状态;初始化完成后进入主函数的循环部分,读取时钟芯片的时间信息,并处理;将处理好的时间信息传递给显示模块进行显示;最后进行循环扫描显示时间信息。
系统程序结构属中断方式,在进行时间信息的读取中,就是采用的终端服务函数子函数的程序中完成,将读取的信息存到一个全局变量的数组中,当显示服务子函数需要时,进行直接调用显示,显示函数为定时器服务子函数的程序中完成。经过多次调试,模块化编程。一步步的实现本设计系统的功能,在克服了定时器中断和外部中断的冲突后,本设计系统趋于完成。
5.2按键控制
本次课程设计要求外接3个按键,按键2WK_UP是选择需要设置的项目,按键KEY1增加、按键KEY0减少,用按键来控制日期的增减。按键控制使用外部中断来实现,将PA0、PA15和PC5设置为三个按键的输入通道,响应优先级:KEY0》KEY1》WK_UP。按键初始化函数中定义WK_UP为下拉输入即按键按下为高电平,KEY1和KEY0为上拉输入即按键按下为低电平。
外部中断处理函数中设置变量flage来判断按键2WK_UP选择的是日期结构体中的成员变量,if判断语句实现对年、月、日、时、分、秒的单独设置。其流程图如图6所示:
图6按键执行流程图
5.3定时器中断控制计时
该实验用到了TIM3定时器,通过设置时钟预分频值psc,自动重装载值arr,arr设值为9999,psc设值为7199,时钟频率为72M。
初始化定时器,初始化时基单元(TIM_TimeBaseStructure)和定时器嵌套向量中断控制器(NVIC_InitStructure)。每溢出一次代表1s发生一次定时器中断,再在中断函数 TIM3_IRQHandler()中编写实现的中断。
在.h文件里预定义一个日期结构体来存放一些关于时间的成员变量结构体
void TIM3_Int_Init(u16 arr,u16 psc);
typedef struct
{
vu16 year;
vu8 month;
vu8 day;
vu8 hour;
vu8 minute;
vu8 second;
}_calendar_obj;
extern _calendar_obj calendar;
在该结构体定义了六个成员变量,分别为year、month、day、hour、minute、second
在定时器中断处理函数中判断定时器中断触发请求发生与否。发生请求,秒数增加,当秒钟计时到60,分钟+1,秒钟返回0。分钟同上,以此类推,时针计时到24,日期+1。
当显示的年份为闰年时:若当前月份为二月,日期计时到29,月份+1,日期更新为1。
当前年份为非闰年时:若当前月份为二月,日期计时到30,月份+1,而日期更新为1。4、6、9、11月这四个月的日期增加到31时月份+1,日期更新为1。其它月份日期增加到32时+1,日期变为1。当月份计时到13,年份+1。相关流程图如图所示:
N
Y
N
Y
N
Y
N
Y
N
Y N
N
Y Y
N N
Y Y N
5.4 LCD相关函数分析
5.4.1 画圆函数
使用用画圆函数LCD_Draw_Circle()画表盘,在圆上画刻度,将3、6、9、12对应的刻度加粗。画圆函数有三个参数,分别为(u16 x0,u16 y0,u8 r),对应圆心坐标(x0,y0)和半径r。Bresenham算法通过圆心判断下一个点位置坐标,定义画点颜色为灰棕蓝色,调用LCD_DrawPoint(uRow,uCol)画点函数找到八个点位置,从3、6、9、12的位置开始循环画点,每一次循环计算都会在原来八个点附近再出现八个点,所有点连接起来画出圆。
Bresenham算法的主要思想是:以坐标原点(0,0)为圆心的圆可以通过0度到45°的弧计算得到,即x从0增加到半径,然后利用对称性计算余下的七段圆弧。当x从0增加到时,y从R递减。
主函数中显示圆圈的代码:
LCD_Draw_Circle(120,120,98); //显示表盘最大的圈
LCD_Draw_Circle(120,120,95); //显示表盘第二大的圈
LCD_Draw_Circle(120,120,2) ; //显示表盘中间外面的圈
LCD_Draw_Circle(120,120,4); //显示表盘中间里面的圈
画圆部分相关的代码为:
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
{
int a,b;
int di;
a=0;b=r;
di=3-(r《《1); //判断下个点的位置
while(a《=b)
{
POINT_COLOR=LBBLUE;//表盘圆颜色为灰棕蓝色
LCD_DrawPoint(x0-b,y0-a); //从刻度为9的位置开始
LCD_DrawPoint(x0+b,y0-a); //从刻度为3的位置开始
LCD_DrawPoint(x0-a,y0+b);//从刻度为12的位置开始
LCD_DrawPoint(x0-a,y0-b);//从刻度为6的位置开始
LCD_DrawPoint(x0+b,y0+a); //3
LCD_DrawPoint(x0+a,y0-b); //6
LCD_DrawPoint(x0+a,y0+b); //12
LCD_DrawPoint(x0-b,y0+a); //9
a++;
// 利用Bresenham算法来画圆
if(di《0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
}
}
5.4.2 画线函数
调用void DrawLine()画线函数来画时、分、秒指针,此函数有五个参数,分别是(u16 x1, u16 y1, u16 x2, u16 y2,u16 COLOR),对应的是起始坐标(x1,y1),终止坐标(x2,y2)。首先计算坐标增量并且设置单步方向,通过设定起点坐标(x1,y1)和终点坐标(x2,y2)计算斜率,根据斜率在该条线上的每个点坐标,使用LCD_Fast_DrawPoint()函数把每个点都画出来,从而画出指针。
画指针部分的相关代码为:
void DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 COLOR)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x》0)incx=1; //设置单步方向
else if(delta_x0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y》0)incy=1;
else if(delta_y0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x》delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t《=distance+1;t++ )//画线输出
{
LCD_Fast_DrawPoint(uRow,uCol,COLOR);
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr》distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr》distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
通过调用画线函数在圆上画刻度,将3、6、9、12对应的刻度加粗,函数中有POINT_COLOR,在主函数中定义为灰蓝色。
画刻度部分的相关代码为
LCD_DrawLine(120,25,120,35);
LCD_DrawLine(119,25,119,35);
LCD_DrawLine(121,25,121,35);//12
LCD_DrawLine(25,120,35,120); LCD_DrawLine(25,119,35,119); LCD_DrawLine(25,121,35,121);//9 LCD_DrawLine(120,205,120,215); LCD_DrawLine(119,205,119,215); LCD_DrawLine(121,205,121,215);//6 LCD_DrawLine(205,120,215,120); LCD_DrawLine(205,119,215,119); LCD_DrawLine(205,121,215,121);//3 LCD_DrawLine(168,38,164,45);//1 LCD_DrawLine(202,72,195,76);//2 LCD_DrawLine(202,168,195,164);//4 LCD_DrawLine(168,202,164,195);//5 LCD_DrawLine(72,202,76,195);//7 LCD_DrawLine(38,168,45,164);//8 LCD_DrawLine(38,72,45,76);//10 LCD_DrawLine(72,38,76,45);// 5.4.3 显示数字函数
此函数有五个参数,分别是(u16 x,u16 y,u32 num,u8 len,u8 size),x、y对应的是起始坐标,显示数值num,数字的位数len,字体大小size,颜色可通过POINT_COLOR设定。
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
for(t=0;t《len;t++)
{
POINT_COLOR=GRAYBLUE;
temp=(num/LCD_Pow(10,len-t-1))%10; //求余来提取每一位数字
LCD_ShowChar(x+(size/2)*t,y,temp+‘0’,size,0); //显示这一位的数字
}
}
5.4.4 显示字符函数
在 LCD_ShowChar 函数里面采用快速画点函数 LCD_Fast_DrawPoint 来画点显示字符,该函数同 LCD_DrawPoint 一样,只是带了颜色参数,且减少了函数调用的时间。x、y是起始坐标,width、 height是字符显示区域的宽和高,*str是指向字符串的指针,size是字体大小, mode是模式(0为非叠加方式,1为叠加方式)。显示数字和字符,判断位置和是否换行(实现自动换行)。
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{
u16 x0=x;
u16 y0=y;
u8 bHz=0; // 字符或中文
5.4.5 画点函数
//x,y:坐标
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
LCD_WR_DATA(POINT_COLOR); //POINT_COLOR:此点的颜色
}
此函数实现比较简单,先设置坐标,再往坐标写颜色。其中 POINT_COLOR 定义的一个全局变量,存放画笔颜色,BACK_COLOR代表 LCD 的背景色。
6、软件调试与测试结果
6.1编程工具
本设计的软件都是在Keil μVision 4上进行编写、编译、调试以及运行操作并生成Hex文件。
软件编程步骤:
(1)打开Keil μ Vision 4软件;
(2)新建工程,并把工程存放在自己方便的地方;
(3)新建C文件,并C 文件添加到新建的工程中;
(4)设置选项,勾选生成HEX文件选项;
(5)编写代码,实现功能,语法正确,并编译通过,生成HEX文件。
6.2 PROTEUS的应用
Proteus软件的使用步骤如下:
(1)打开Proteus软件。
(2)选择菜单栏的元器件选项,点击P标识,找到所需的元器件,根据自己的需要,选择菜单栏下方的旋转按钮,将元器件旋转到方便的角度,然乎在一定区域内部上对其进行放置,放置完成后,进行设置元器件的值和标号。全部器件摆放设置完成后,鼠标移动到元器件的引脚端,进行点击开始引线到需要连接的地方,然后双击确定,以此类推,将全部器件之间进行连接,并保存。
保存后点击PLAY 按钮,是左下方的三角符号,确认无误后解除仿真,即左下角的正方块图形。
(4)下载hex文件到单片机中:双击51单片机,在对话框中找到保存好的程序生成文件hex文件打开,再单击确定,再次保存。
(5)点击左下角的三角符合按钮,进行电路运行仿真与调试,观察仿真结果进行相应的改动,直到出现正确的结果。
6.3 软件调试过程
经过系统的了解程序编写软件和实物仿真软件这两部分,两者相互结合进行本课题系统功能的仿真与调试,确定其方案的是否可行?了解系统方案的工程量和主要原理应用。
在通过编写程序,解决语法错误之后,生成一个hex文件,放在仿真文件夹中,以方便仿真文件的调用;进行软件系统搭建硬件平台,采用PROTUSE软件把,系统方案中选择的各部分,找到对应的元器件,进行硬件电路的模拟搭建,检查电气连接的准确性,确保完成后,双击进入主控芯片的配置中,找到软件程序生成的HEX文件,选择,进行硬件型软件模拟调试,出现的问题,及时找到问题根源,并改正后再次进行软件仿真,直到正确的结果和功能的完全实现。
6.4测试结果
初始默认时间是2019年6月13日21时07分10秒
显示结果:表盘显示清晰,指针位置与时间相吻合,能观察到秒针在转动。
按键后的显示结果:选择按键按下,相应被选择项会闪烁,按下加减键能正确改变时间,表盘随时间的设置正确变化。
7、结论
此次课程设计完成了STM32F103单片机和2.8寸液晶屏显示,显示当前的年、月、日、时、分、秒。其中遇到了许多知识面的困难,如画圆函数、画线函数,将数学知识转化为计算机语言,最后得以解决。这次综合设计使我受益匪浅,所涉及的东西都是我们专业相关的。起初学习单片机和嵌入式全部是理论知识,没有过多的实践。导致在课程设计开始的时候无从下手。为了完成设计,我们小组成员去图书馆、网上查找相关资料,学习了嵌入式和C语言,虽然以前学过嵌入式,但是感觉自己都不太懂这方面的知识,纯粹是为了应付考试,所以导致这回编写代码实现过程比较懵懂,需要花费的时间也比较长,但最后也完成了课程设计。
5、系统软件设计
5.1系统主程序
在本设计系统中,从系统主程序开始,进入各模块的系统初始化,该初始化包括:串口初始化设置串口频率和波特率、定时器的初值设置、中断函数的进入条件、和端口的初始化点评状态;初始化完成后进入主函数的循环部分,读取时钟芯片的时间信息,并处理;将处理好的时间信息传递给显示模块进行显示;最后进行循环扫描显示时间信息。
系统程序结构属中断方式,在进行时间信息的读取中,就是采用的终端服务函数子函数的程序中完成,将读取的信息存到一个全局变量的数组中,当显示服务子函数需要时,进行直接调用显示,显示函数为定时器服务子函数的程序中完成。经过多次调试,模块化编程。一步步的实现本设计系统的功能,在克服了定时器中断和外部中断的冲突后,本设计系统趋于完成。
5.2按键控制
本次课程设计要求外接3个按键,按键2WK_UP是选择需要设置的项目,按键KEY1增加、按键KEY0减少,用按键来控制日期的增减。按键控制使用外部中断来实现,将PA0、PA15和PC5设置为三个按键的输入通道,响应优先级:KEY0》KEY1》WK_UP。按键初始化函数中定义WK_UP为下拉输入即按键按下为高电平,KEY1和KEY0为上拉输入即按键按下为低电平。
外部中断处理函数中设置变量flage来判断按键2WK_UP选择的是日期结构体中的成员变量,if判断语句实现对年、月、日、时、分、秒的单独设置。其流程图如图6所示:
图6按键执行流程图
5.3定时器中断控制计时
该实验用到了TIM3定时器,通过设置时钟预分频值psc,自动重装载值arr,arr设值为9999,psc设值为7199,时钟频率为72M。
初始化定时器,初始化时基单元(TIM_TimeBaseStructure)和定时器嵌套向量中断控制器(NVIC_InitStructure)。每溢出一次代表1s发生一次定时器中断,再在中断函数 TIM3_IRQHandler()中编写实现的中断。
在.h文件里预定义一个日期结构体来存放一些关于时间的成员变量结构体
void TIM3_Int_Init(u16 arr,u16 psc);
typedef struct
{
vu16 year;
vu8 month;
vu8 day;
vu8 hour;
vu8 minute;
vu8 second;
}_calendar_obj;
extern _calendar_obj calendar;
在该结构体定义了六个成员变量,分别为year、month、day、hour、minute、second
在定时器中断处理函数中判断定时器中断触发请求发生与否。发生请求,秒数增加,当秒钟计时到60,分钟+1,秒钟返回0。分钟同上,以此类推,时针计时到24,日期+1。
当显示的年份为闰年时:若当前月份为二月,日期计时到29,月份+1,日期更新为1。
当前年份为非闰年时:若当前月份为二月,日期计时到30,月份+1,而日期更新为1。4、6、9、11月这四个月的日期增加到31时月份+1,日期更新为1。其它月份日期增加到32时+1,日期变为1。当月份计时到13,年份+1。相关流程图如图所示:
N
Y
N
Y
N
Y
N
Y
N
Y N
N
Y Y
N N
Y Y N
5.4 LCD相关函数分析
5.4.1 画圆函数
使用用画圆函数LCD_Draw_Circle()画表盘,在圆上画刻度,将3、6、9、12对应的刻度加粗。画圆函数有三个参数,分别为(u16 x0,u16 y0,u8 r),对应圆心坐标(x0,y0)和半径r。Bresenham算法通过圆心判断下一个点位置坐标,定义画点颜色为灰棕蓝色,调用LCD_DrawPoint(uRow,uCol)画点函数找到八个点位置,从3、6、9、12的位置开始循环画点,每一次循环计算都会在原来八个点附近再出现八个点,所有点连接起来画出圆。
Bresenham算法的主要思想是:以坐标原点(0,0)为圆心的圆可以通过0度到45°的弧计算得到,即x从0增加到半径,然后利用对称性计算余下的七段圆弧。当x从0增加到时,y从R递减。
主函数中显示圆圈的代码:
LCD_Draw_Circle(120,120,98); //显示表盘最大的圈
LCD_Draw_Circle(120,120,95); //显示表盘第二大的圈
LCD_Draw_Circle(120,120,2) ; //显示表盘中间外面的圈
LCD_Draw_Circle(120,120,4); //显示表盘中间里面的圈
画圆部分相关的代码为:
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
{
int a,b;
int di;
a=0;b=r;
di=3-(r《《1); //判断下个点的位置
while(a《=b)
{
POINT_COLOR=LBBLUE;//表盘圆颜色为灰棕蓝色
LCD_DrawPoint(x0-b,y0-a); //从刻度为9的位置开始
LCD_DrawPoint(x0+b,y0-a); //从刻度为3的位置开始
LCD_DrawPoint(x0-a,y0+b);//从刻度为12的位置开始
LCD_DrawPoint(x0-a,y0-b);//从刻度为6的位置开始
LCD_DrawPoint(x0+b,y0+a); //3
LCD_DrawPoint(x0+a,y0-b); //6
LCD_DrawPoint(x0+a,y0+b); //12
LCD_DrawPoint(x0-b,y0+a); //9
a++;
// 利用Bresenham算法来画圆
if(di《0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
}
}
5.4.2 画线函数
调用void DrawLine()画线函数来画时、分、秒指针,此函数有五个参数,分别是(u16 x1, u16 y1, u16 x2, u16 y2,u16 COLOR),对应的是起始坐标(x1,y1),终止坐标(x2,y2)。首先计算坐标增量并且设置单步方向,通过设定起点坐标(x1,y1)和终点坐标(x2,y2)计算斜率,根据斜率在该条线上的每个点坐标,使用LCD_Fast_DrawPoint()函数把每个点都画出来,从而画出指针。
画指针部分的相关代码为:
void DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 COLOR)
{
u16 t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy,uRow,uCol;
delta_x=x2-x1; //计算坐标增量
delta_y=y2-y1;
uRow=x1;
uCol=y1;
if(delta_x》0)incx=1; //设置单步方向
else if(delta_x0)incx=0;//垂直线
else {incx=-1;delta_x=-delta_x;}
if(delta_y》0)incy=1;
else if(delta_y0)incy=0;//水平线
else{incy=-1;delta_y=-delta_y;}
if( delta_x》delta_y)distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for(t=0;t《=distance+1;t++ )//画线输出
{
LCD_Fast_DrawPoint(uRow,uCol,COLOR);
xerr+=delta_x ;
yerr+=delta_y ;
if(xerr》distance)
{
xerr-=distance;
uRow+=incx;
}
if(yerr》distance)
{
yerr-=distance;
uCol+=incy;
}
}
}
通过调用画线函数在圆上画刻度,将3、6、9、12对应的刻度加粗,函数中有POINT_COLOR,在主函数中定义为灰蓝色。
画刻度部分的相关代码为
LCD_DrawLine(120,25,120,35);
LCD_DrawLine(119,25,119,35);
LCD_DrawLine(121,25,121,35);//12
LCD_DrawLine(25,120,35,120); LCD_DrawLine(25,119,35,119); LCD_DrawLine(25,121,35,121);//9 LCD_DrawLine(120,205,120,215); LCD_DrawLine(119,205,119,215); LCD_DrawLine(121,205,121,215);//6 LCD_DrawLine(205,120,215,120); LCD_DrawLine(205,119,215,119); LCD_DrawLine(205,121,215,121);//3 LCD_DrawLine(168,38,164,45);//1 LCD_DrawLine(202,72,195,76);//2 LCD_DrawLine(202,168,195,164);//4 LCD_DrawLine(168,202,164,195);//5 LCD_DrawLine(72,202,76,195);//7 LCD_DrawLine(38,168,45,164);//8 LCD_DrawLine(38,72,45,76);//10 LCD_DrawLine(72,38,76,45);// 5.4.3 显示数字函数
此函数有五个参数,分别是(u16 x,u16 y,u32 num,u8 len,u8 size),x、y对应的是起始坐标,显示数值num,数字的位数len,字体大小size,颜色可通过POINT_COLOR设定。
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
{
u8 t,temp;
for(t=0;t《len;t++)
{
POINT_COLOR=GRAYBLUE;
temp=(num/LCD_Pow(10,len-t-1))%10; //求余来提取每一位数字
LCD_ShowChar(x+(size/2)*t,y,temp+‘0’,size,0); //显示这一位的数字
}
}
5.4.4 显示字符函数
在 LCD_ShowChar 函数里面采用快速画点函数 LCD_Fast_DrawPoint 来画点显示字符,该函数同 LCD_DrawPoint 一样,只是带了颜色参数,且减少了函数调用的时间。x、y是起始坐标,width、 height是字符显示区域的宽和高,*str是指向字符串的指针,size是字体大小, mode是模式(0为非叠加方式,1为叠加方式)。显示数字和字符,判断位置和是否换行(实现自动换行)。
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{
u16 x0=x;
u16 y0=y;
u8 bHz=0; // 字符或中文
5.4.5 画点函数
//x,y:坐标
void LCD_DrawPoint(u16 x,u16 y)
{
LCD_SetCursor(x,y); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
LCD_WR_DATA(POINT_COLOR); //POINT_COLOR:此点的颜色
}
此函数实现比较简单,先设置坐标,再往坐标写颜色。其中 POINT_COLOR 定义的一个全局变量,存放画笔颜色,BACK_COLOR代表 LCD 的背景色。
6、软件调试与测试结果
6.1编程工具
本设计的软件都是在Keil μVision 4上进行编写、编译、调试以及运行操作并生成Hex文件。
软件编程步骤:
(1)打开Keil μ Vision 4软件;
(2)新建工程,并把工程存放在自己方便的地方;
(3)新建C文件,并C 文件添加到新建的工程中;
(4)设置选项,勾选生成HEX文件选项;
(5)编写代码,实现功能,语法正确,并编译通过,生成HEX文件。
6.2 PROTEUS的应用
Proteus软件的使用步骤如下:
(1)打开Proteus软件。
(2)选择菜单栏的元器件选项,点击P标识,找到所需的元器件,根据自己的需要,选择菜单栏下方的旋转按钮,将元器件旋转到方便的角度,然乎在一定区域内部上对其进行放置,放置完成后,进行设置元器件的值和标号。全部器件摆放设置完成后,鼠标移动到元器件的引脚端,进行点击开始引线到需要连接的地方,然后双击确定,以此类推,将全部器件之间进行连接,并保存。
保存后点击PLAY 按钮,是左下方的三角符号,确认无误后解除仿真,即左下角的正方块图形。
(4)下载hex文件到单片机中:双击51单片机,在对话框中找到保存好的程序生成文件hex文件打开,再单击确定,再次保存。
(5)点击左下角的三角符合按钮,进行电路运行仿真与调试,观察仿真结果进行相应的改动,直到出现正确的结果。
6.3 软件调试过程
经过系统的了解程序编写软件和实物仿真软件这两部分,两者相互结合进行本课题系统功能的仿真与调试,确定其方案的是否可行?了解系统方案的工程量和主要原理应用。
在通过编写程序,解决语法错误之后,生成一个hex文件,放在仿真文件夹中,以方便仿真文件的调用;进行软件系统搭建硬件平台,采用PROTUSE软件把,系统方案中选择的各部分,找到对应的元器件,进行硬件电路的模拟搭建,检查电气连接的准确性,确保完成后,双击进入主控芯片的配置中,找到软件程序生成的HEX文件,选择,进行硬件型软件模拟调试,出现的问题,及时找到问题根源,并改正后再次进行软件仿真,直到正确的结果和功能的完全实现。
6.4测试结果
初始默认时间是2019年6月13日21时07分10秒
显示结果:表盘显示清晰,指针位置与时间相吻合,能观察到秒针在转动。
按键后的显示结果:选择按键按下,相应被选择项会闪烁,按下加减键能正确改变时间,表盘随时间的设置正确变化。
7、结论
此次课程设计完成了STM32F103单片机和2.8寸液晶屏显示,显示当前的年、月、日、时、分、秒。其中遇到了许多知识面的困难,如画圆函数、画线函数,将数学知识转化为计算机语言,最后得以解决。这次综合设计使我受益匪浅,所涉及的东西都是我们专业相关的。起初学习单片机和嵌入式全部是理论知识,没有过多的实践。导致在课程设计开始的时候无从下手。为了完成设计,我们小组成员去图书馆、网上查找相关资料,学习了嵌入式和C语言,虽然以前学过嵌入式,但是感觉自己都不太懂这方面的知识,纯粹是为了应付考试,所以导致这回编写代码实现过程比较懵懂,需要花费的时间也比较长,但最后也完成了课程设计。
举报