单片机课程设计时钟.docx
《单片机课程设计时钟.docx》由会员分享,可在线阅读,更多相关《单片机课程设计时钟.docx(38页珍藏版)》请在冰点文库上搜索。
单片机课程设计时钟
课程设计报告
课程设计名称:
时钟
学院:
学生姓名:
班级:
学号:
成绩:
指导教师:
开课时间:
学年学期
目录
第一章引言1
1.1系统背景1
1.2系统功能1
第二章系统总体方案 2
2.1KL25微控制器介绍 2
2.2系统硬件框图2
2.3SD-FSL-KL25-EVB硬件系统简介3
2.4系统设计流程图4
第三章硬件设计 5
3.1单片机(MCU)模块5
3.1.1KL25单片机性能概述5
3.1.2模块图6
3.2串行通信模块6
3.2.1MAX232芯片简介6
3.2.2串行通信的电路原理7
3.2.3串行通信编程模型7
3.4液晶显示模块8
第四章 软件流程设计 9
4.1MCU(C)程序9
4.1.1主程序(main.c)9
4.1.2中断子程序(Isr.c)11
4.1.3LCD子程序(LCD.c)12
4.1.4定时器(Timer.c)13
4.1.5串行通信子程序(uart.c)14
4.1.6通用I/O端口(GPIO.c)20
第五章系统测试22
5.1运行界面调试22
5.2运行结果图23
5.3出现问题以及解决方案23
第六章总结展望24
参考文献25
第一章引言
1.1系统背景
时间对人们来说是那么的宝贵,工作的忙碌性和繁杂容易使人们忘记当前的时间。
然而遇到重大事情的时候,一旦忘记时间,就会给自己或者是他人造成很大的麻烦。
计时器最好能够用有一个定时系统,随时提醒容易忘记时间的人。
最早能够定时、宝石的时钟属于机械式钟表,但这种时钟受到机械结构、动力合体技的限制,在功能性能以及在造价上都没有办法与电子时钟相比。
由于数字集成电路的发展和石英晶体振荡器的广泛使用,是的数字时钟的精度远远查过老师钟表,钟表的数字化跟人们生产生活带来了极大的方便,而且大大的扩展了钟表原先的时钟功能。
当今市场上的电子时钟品类繁多,外形小巧别致。
也有体型较大的,诸如公共场所的大型电子宝石器等。
电子时钟首相是数字化了的时间显示或报时,在此基础上,人们可根据不同场合的要求,在时钟上加置其他功能,比如定时闹铃,万年历等功能。
电子时钟是采用电子电路实现对时、分、秒进行数字显示的即使装置,广泛应用月个人家庭、车站、码头办公室等公共场所,成为人们日常生活活动中不可少的必须品。
由于数字集成电路的发展和石英晶体振荡器的广泛使用,是的数字时钟的精度远远查过老师钟表,钟表的数字化跟人们生产生活带来了极大的方便,而且大大的扩展了钟表原先的时钟功能。
诸如整点提示、定时报警、定时广播、自动启闭路灯,定时开关烘箱、同多动力设备、甚至各种定时电气的自动启动等,所有这些,都是以钟表数字化为基础的。
因此研究数字钟及扩大其应用,有着非常现实的意义。
1.2系统功能
本次课程设计的主要任务是设计一个时钟计数器,也就是要做一个秒表,能够计数,并且按照我们平时的时间计数格式显示,当我们按下某个计数按键时候,这个计数系统就一秒一秒的计数,当计数到59秒就进位,显示分钟的部分加1,当计数分钟的数字显示到59,同样要进位,这时候时钟部分加1,如此循环下去。
当我们再次按下此按键时候,计数器暂停计数,此时显示器也就暂停在那个时候不再计数了,并且显示当前计数时间。
LCD显示器要求每显示一次就刷新一次,或者刷新频率更高些。
第2章系统总体方案
2.1KL25微控制器介绍
飞思卡尔的KinetisK系列产品组合有超过200种基于ARMCortex-M4结构的低功耗,高性能、可兼容的微控制器。
目标应用领域是便携式医疗设备、仪器仪表、工业控制及测量设备等。
MCU的硬件最小系统是指可以使内部程序运行所必须的最低规模的外围电路,也可以包括写入器接口电路。
一般情况下,CPU工作频率为48MHz;工作电压为1.71V~3.6V;运行温度范围为-40℃~105℃;具有64B的Cache;具有USBOTG、定时器、DMA、UART、SPI、IIC、TSI、16位ADC、12位DAC等模块。
MCU的硬件最小系统由电源、晶振及复位等电路组成。
随着Flash存储器制造技术的发展,硬件最小系统应该把写入器的接口电路也包含在其中。
KL25芯片的硬件最小系统包括电源电路、复位电路、晶振电路及与写入器相连的SWD接口电路。
2.2系统硬件框图
KL25硬件最小系统引脚包括电源类引脚、复位脚晶振引脚等,如表所示。
表2.1KL25硬件最小系统引脚表
2.3SD-FSL-KL25-EVB硬件系统简介
表2.2D-FSL-KL25-EVB资源简表
图2.1SD-FSL-KL25-EVB实物图
2.4系统设计流程图
图2.2设计流程图
单片机模块中最常见的是电子时钟,电子时钟是一种用单片机原理实现时、分、秒计时的装置。
首先利用程序目录中的timer.c,通过”串口”发送表示时间的字节数据,然后再利用定时器溢出中断修改时间,并发送新时间。
在程序目录中tpm.c实现TPM定时功能,在程序目录中lcd.show才在仪器的LCD显示屏上显示输出。
上图2.2是系统设计流程图。
第三章硬件设计
3.1单片机(MCU)模块
3.1.1KL25单片机性能概述
KL系列MCU是以AMBA总线规范为架构SOC(Systemonchip)。
一般来说,AMBA架构包含高性能系统总线(AHB,AdvancedHighPerformaceBus)和低速、低功耗的外设总线(APB,AdvancedPeriPheralBus)。
MCU的硬件最小系统是指可以使内部程序运行所必须的最低规模的外围电路,也可以包括写入器接口电路。
一般情况下,MCU的硬件最小系统由电源、晶振及复位等电路组成。
随着Flash存储器制造技术的发展,硬件最小系统应该把写入器的接口电路也包含在其中。
KL25芯片的硬件最小系统包括电源电路、复位电路、晶振电路及与写入器相连的SWD接口电路。
1.电源及其滤波电路
电路中需要大量的电源类引脚用来提供足够的电流容量同时保持芯片电流平衡,所有的电源引脚必须外接适当的滤波电容抑制高频噪音。
去耦是指对电源采取进一步的滤波措施,去除两级间信号通过电源互相干扰的影响。
2.复位电路及复位功能
复位,意味着MCU一切重新开始。
复位引脚为T_RST。
若T_RST信号有效(低电平)则会引起MCU复位。
3.晶振电路
晶振电路为芯片提供准确的工作时钟。
作为振荡源的晶体振荡器分为无源晶振(Crystal)和有源晶振(Oscillator)两种类型。
4.SWD接口电路
通过SWD接口可以实现程序下载和调试功能。
SWD接口只需两根线,数据输入/输出线SWD_DIO和时钟线SWD_CLK。
3.1.2模块图
图3.132位微控制器系统、外围总线模块图
图3.1给出了32位微控制器系统、外围总线模块图,KL系列MCU是以AMBA总线规范为架构SOC(Systemonchip)。
一般来说,AMBA架构包含高性能系统总线(AHB,AdvancedHighPerformaceBus)和低速、低功耗的外设总线(APB,AdvancedPeriPheralBus)。
系统总线AHB是负责连接ARM内核、DMA控制器、片内存储器或其他需要高带宽的模块。
外设总线APB则是用来连接系统的外围慢速模块,其协议规则相对系统总线AHB来说较为简单,它与系统总线AHB之间则通过总线桥(Busbridge)相连,期望能減少系统总线的负载。
3.2串行通信模块
3.2.1MAX232芯片简介
在MCU中,若用RS-232总线进行串行通信,则需外界电路实现电平转换,在发送端需要用驱动电平将TTL电平转换成RS-232电平;在接收端,需要用接收电路将RS-232电平转换为TTL电平。
电平转换器不仅可以由晶振管分立元件构成,也可以直接使用集成电路。
目前使用MAX232芯片比较多,该芯片使用单一+5V电源供电实现电平转换。
图3.2MAX232引脚图图3.3串行通信接口电平转换电路示意图
3.2.2串行通信的电路原理
发送过程:
MCU的TxD(TTL电平)经过MAX232的11脚(T1IN)送到MAX232内部,在内部TTL电平被“提升”为232电平,通过14脚(T1OUT)发送出去。
接收过程:
外部232电平经过MAX232的13脚(R1IN)送入到MAX232的内部,在内部的电平被“降低”为TTL电平,经过12脚(R1OUT)送到MCU的RxD,进入MCU内部。
进行MCU的串行通信接口编程时,只针对MCU的发送与接收引脚,与MAX232无关,MAX232只是起到电平转换作用。
输入输出引脚分两组,基本含义如表2.2所示。
在实际使用时,若只需要一路串行通信接口,可以使用其中任何一组。
表3.1MAX232芯片输入输出引脚分类与基本接法
组别
TTL电平引脚
方向
典型接口
232电平引脚
方向
典型接口
1
11
12
输入
输出
接MCU的TxD
接MCU的RxD
13
14
输入
输出
连接到接口,与其它设备通过232相接
2
10
9
输入
输出
接MCU的TxD
接MCU的RxD
8
7
输入
输出
连接到接口,与其它设备通过232相接
3.2.3串行通信编程模型
从基本原理角度看,串行通信接口UART的主要功能是:
接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输出。
图3.4UART编程模型
3.4液晶显示模块
1.点阵字符型LCD基本特点:
LCD作为电子信息产品的主要显示器件,相对于其他类型的显示器件来说有其自身的特点,
主要包括:
(1)低电压,低功耗;
(2)平板型结构;
(3)使用寿命长;
(4)被动显示;
(5)显示信息量大且易于彩色化;
(6)无电磁辐射。
点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义符号的液晶显示器。
这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的阻容元件等集成一个液晶显示模板。
鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示器模块。
点阵字符型液晶显示器模块的控制器大多数为日立公司生产的HD44780及其兼容的控制电路,如:
SED1278(SEIKOEPSON),KS0066(SAMSUNG),NJU6408(NERJAPANRADIO)等。
2.字符型液晶显示器模块的特点如下:
(1)液晶显示屏是以若干5*8或5*11点阵块等组成的显示字符群。
每个点阵块块为一个字符位,字符间距和行间距都是一个点的宽度。
(2)主控制电路为HD44780(HITACHI)及其他公司的兼容电路。
从程序员的角度来看LCD显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。
(3)内部具有字符发生器ROM,可显示192种字符。
(4)具有64字节的字符发生器RAM,可以定义8个5*8点阵字符或4个5*11的点阵字符。
(5)具有64字节的数据显示RAM,供显示器编程使用。
(6)标准接口特性,与MC9S08系列的MCU容易接口。
(7)模块结构紧凑,轻巧,装配容易。
(8)单+5V电源供电(宽温型需要加-7V驱动电源)。
(9)低功耗,高可靠性。
第四章 软件流程设计
4.1MCU(C)程序
4.1.1主程序(main.c)
//=========================================================================
#include"includes.h"//包含总头文件
intmain(void)
{uint_8LCDBuffer[18];
//uint_8*g_DispalyInit;
//1.声明主函数使用的局部变量
uint_32remember;
//2.关总中断
enter_critical();//进入临界区,关中断
//3.初始化底层模块
light_init(LIGHT_PORT,LIGHT_PIN_BLUE,LIGHT_OFF);//蓝灯初始化
uart_init(UART_1,BUSCLK,9600);//初始化,总线时钟24000Khz,波特率9600
tpm_init(TPM0,TPM_CLKSRC_PLL,1000000);//1s
LCDInit();//LCD初始化
//4.变量赋初值
g_time[0]=00;//
(1)"时分秒"缓存初始化(00:
00:
00)
g_time[1]=00;
g_time[2]=00;
//g_time[3]=11;
//g_time[4]=51;
g_time[3]='d';
g_time[4]='a';
g_time[5]='i';
g_time[6]='s';
g_time[7]='h';
g_time[8]='u';
g_time[9]='y';
g_time[10]='a';
g_time[11]=45;
//g_DispalyInit=(uint_8*)"";
remember=g_time[2];//
(2)临时变量remember初始化
//5.开中断
uart_enable_re_int(UART_1);//启动串口1接收中断
tpm_enable_int(TPM0);//启动模块中断
init_critical();//开总中断
//LCDShow(g_DispalyInit);
//进入主循环
//主循环开始=============================================================
for(;;)
{if(g_time[2]!
=remember)//判断秒钟是否发生变化
{LCDBuffer[0]=g_time[0]/10+'0';
LCDBuffer[1]=g_time[0]%10+'0';
LCDBuffer[2]=':
';
LCDBuffer[3]=g_time[1]/10+'0';
LCDBuffer[4]=g_time[1]%10+'0';
LCDBuffer[5]=':
';
LCDBuffer[6]=g_time[2]/10+'0';
LCDBuffer[7]=g_time[2]%10+'0';
LCDBuffer[8]=g_time[3];
LCDBuffer[9]=g_time[4];
LCDBuffer[10]=g_time[5];
LCDBuffer[11]=g_time[6];
LCDBuffer[12]=g_time[7];
LCDBuffer[13]=g_time[8];
LCDBuffer[14]=g_time[9];
LCDBuffer[15]=g_time[10];
LCDBuffer[16]=g_time[11]/10+'0';
LCDBuffer[17]=g_time[11]%10+'0';
uart_sendN(UART_1,12,g_time);
remember=g_time[2];
LCDShow(LCDBuffer);}}//end_while
//主循环结束=========================================================
return0;}
4.1.2中断子程序(Isr.c)
//========================================================================
//文件名称:
isr.c
//功能概要:
中断底层驱动构件源文件
//版权所有:
苏州大学飞思卡尔嵌入式中心()
//更新记录:
2012-11-12V1.0
//=========================================================================
#include"includes.h"
//========================中断函数服务例程===============================
//串口0接收中断服务例程
voidisr_uart0_re(void)
{uint_8ch;
uint_8flag=1;
enter_critical();
ch=uart_re1(UART_0,&flag);
if(0==flag)
{uart_send1(UART_0,ch);}
exit_critical();}
//串口1接收中断服务例程
voidisr_uart1_re(void)
{staticuint_8index=0;//收到的个数
uint_8flag=1;
enter_critical();
if(index>11)index=0;//三个字节一收,时分秒
g_time[index]=uart_re1(UART_1,&flag);
if(0==flag)index++;
exit_critical();}
//串口2接收中断服务例程
voidisr_uart2_re(void)
{uint_8ch;
uint_8flag=1;
enter_critical();
ch=uart_re1(UART_2,&flag);
if(0==flag)
{uart_send1(UART_2,ch);}
exit_critical();}
//tpm定时中断
voidtpm0_isr(void)
{staticuint_32TPMCounter=0;
//定时器溢出中断标志
if((TPM_SC_REG(TPM0_BASE_PTR)&TPM_SC_TOF_MASK)==TPM_SC_TOF_MASK)
{TPMCounter++;}
BSET(TPM_SC_TOF_SHIFT,TPM_SC_REG(TPM0_BASE_PTR));//清标志位
if(TPMCounter>100)//TPM每中断100次(即1s)闪烁一次。
{TPMCounter=0;
SecAdd1(g_time);}}
4.1.3LCD子程序(LCD.c)
//函数名称:
LCDShow
//函数返回:
无
//参数说明:
需要显示的数据
//功能概要:
液晶显示data中的数据。
//=========================================================================
voidLCDShow(uint_8data[18])
{uint_8i;
//LCD初始化
LCDInit();
//显示第1行16个字符
gpio_set(LCD[0].gpio_port,LCD[0].gpio_pin,0);
gpio_set(LCD[1].gpio_port,LCD[1].gpio_pin,0);
//后7位为DDRAM地址(0x00)
LCDCommand(0x80);
//写16个数据到DDRAM
gpio_set(LCD[0].gpio_port,LCD[0].gpio_pin,1);
gpio_set(LCD[1].gpio_port,LCD[1].gpio_pin,0);
//将要显示在第1行上的16个数据逐个写入DDRAM中
for(i=0;i<16;i++)
{LCDCommand(data[i]);}
//显示第2行16个字符
gpio_set(LCD[0].gpio_port,LCD[0].gpio_pin,0);
gpio_set(LCD[1].gpio_port,LCD[1].gpio_pin,0);
//后7位为DDRAM地址(0x40)
LCDCommand(0xC0);
gpio_set(LCD[0].gpio_port,LCD[0].gpio_pin,1);
gpio_set(LCD[1].gpio_port,LCD[1].gpio_pin,0);
//将要显示在第2行上的16个数据逐个写入DDRAM中
for(i=16;i<18;i++)
{LCDCommand(data[i]);}}
//=========================================================================
//函数名称:
LCDCommand
//函数返回:
无
//参数说明:
cmd:
待执行的命令
//功能概要:
执行给定的cmd命令,且延时。
//=========================================================================
voidLCDCommand(uint_8cmd)
{uint_8i;
uint_16j;
uint_8temp;
//等待延迟防止重复调用此函数而LCD卡死
for(j=0;j<1600;j++);asm("NOP");
//数据送到LCD的数据线上
for(i=3;i<11;i++)
{gpio_set(LCD[i].gpio_port,LCD[i].gpio_pin,0);}
for(i=3;i<11;i++)
{temp=0x01&(cmd>>(i-3));
gpio_set(LCD[i].gpio_port,LCD[i].gpio_pin,temp);}
//给出E信号的下降沿(先高后低),使数据写入LCD
gpio_set(LCD[2].gpio_port,LCD[2].gpio_pin,1);
for(j=0;j<25;j++)asm("NOP");
gpio_set(LCD[2].gpio_port,LCD[2].gpio_pin,0);}
4.1.4定时器(Timer.c)
//===========================================================================
//文件名称:
timer.c
//功能概要:
时间处理软件源文件
//版权所有:
苏州大学飞思卡尔嵌入式中心()
//更新记录:
2013-04-27V1.0
//================================================