单片机课程设计--时钟.docx

上传人:scccc 文档编号:11178957 上传时间:2021-07-10 格式:DOCX 页数:27 大小:829.64KB
返回 下载 相关 举报
单片机课程设计--时钟.docx_第1页
第1页 / 共27页
单片机课程设计--时钟.docx_第2页
第2页 / 共27页
单片机课程设计--时钟.docx_第3页
第3页 / 共27页
单片机课程设计--时钟.docx_第4页
第4页 / 共27页
单片机课程设计--时钟.docx_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《单片机课程设计--时钟.docx》由会员分享,可在线阅读,更多相关《单片机课程设计--时钟.docx(27页珍藏版)》请在三一文库上搜索。

1、 课 程 设 计 报 告课程设计名称: 时钟 学 院 : 学生姓名: 班 级: 学 号: 成 绩: 指导教师: 开课时间: 学年 学期目录第一章 引言11.1系统背景1 1.2系统功能1第二章 系统总体方案22.1 KL25微控制器介绍22.2 系统硬件框图22.3 SD-FSL-KL25-EVB硬件系统简介32.4系统设计流程图4第三章 硬件设计53.1单片机(MCU)模块53.1.1 KL25单片机性能概述53.1.2 模块图63.2串行通信模块63.2.1 MAX232芯片简介63.2.2 串行通信的电路原理73.2.3 串行通信编程模型73.4 液晶显示模块8第四章 软件流程设计94.

2、1 MCU(C)程序94.1.1主程序(main.c)94.1.2 中断子程序(Isr.c)114.1.3 LCD子程序(LCD.c)124.1.4定时器(Timer.c)134.1.5串行通信子程序(uart.c)144.1.6通用I/O端口(GPIO.c)20第五章 系统测试225.1运行界面调试225.2运行结果图235.3出现问题以及解决方案23第六章 总结展望24参考文献25第一章 引言1.1系统背景时间对人们来说是那么的宝贵,工作的忙碌性和繁杂容易使人们忘记当前的时间。然而遇到重大事情的时候,一旦忘记时间,就会给自己或者是他人造成很大的麻烦。计时器最好能够用有一个定时系统,随时提醒

3、容易忘记时间的人。最早能够定时、宝石的时钟属于机械式钟表,但这种时钟受到机械结构、动力合体技的限制,在功能性能以及在造价上都没有办法与电子时钟相比。由于数字集成电路的发展和石英晶体振荡器的广泛使用,是的数字时钟的精度远远查过老师钟表,钟表的数字化跟人们生产生活带来了极大的方便,而且大大的扩展了钟表原先的时钟功能。当今市场上的电子时钟品类繁多,外形小巧别致。也有体型较大的,诸如公共场所的大型电子宝石器等。电子时钟首相是数字化了的时间显示或报时,在此基础上,人们可根据不同场合的要求,在时钟上加置其他功能,比如定时闹铃,万年历等功能。电子时钟是采用电子电路实现对时、分、秒进行数字显示的即使装置,广泛

4、应用月个人家庭、车站、码头办公室等公共场所,成为人们日常生活活动中不可少的必须品。由于数字集成电路的发展和石英晶体振荡器的广泛使用,是的数字时钟的精度远远查过老师钟表,钟表的数字化跟人们生产生活带来了极大的方便,而且大大的扩展了钟表原先的时钟功能。诸如整点提示、定时报警、定时广播、自动启闭路灯,定时开关烘箱、同多动力设备、甚至各种定时电气的自动启动等,所有这些,都是以钟表数字化为基础的。因此研究数字钟及扩大其应用,有着非常现实的意义。1.2系统功能本次课程设计的主要任务是设计一个时钟计数器,也就是要做一个秒表,能够计数,并且按照我们平时的时间计数格式显示,当我们按下某个计数按键时候,这个计数系

5、统就一秒一秒的计数,当计数到59秒就进位,显示分钟的部分加1,当计数分钟的数字显示到59,同样要进位,这时候时钟部分加1,如此循环下去。当我们再次按下此按键时候,计数器暂停计数,此时显示器也就暂停在那个时候不再计数了,并且显示当前计数时间。LCD 显示器要求每显示一次就刷新一次,或者刷新频率更高些。第2章 系统总体方案2.1 KL25微控制器介绍飞思卡尔的Kinetis K 系列产品组合有超过200种基于ARM Cortex-M4结构的低功耗,高性能、可兼容的微控制器。目标应用领域是便携式医疗设备、仪器仪表、工业控制及测量设备等。MCU的硬件最小系统是指可以使内部程序运行所必须的最低规模的外围

6、电路,也可以包括写入器接口电路。一般情况下,CPU工作频率为48MHz;工作电压为1.71V 3.6V;运行温度范围为-40 105;具有64B的Cache;具有USB OTG、定时器、DMA、UART、SPI、IIC、TSI、16位ADC、12位DAC等模块。MCU的硬件最小系统由电源、晶振及复位等电路组成。随着Flash存储器制造技术的发展,硬件最小系统应该把写入器的接口电路也包含在其中。KL25芯片的硬件最小系统包括电源电路、复位电路、晶振电路及与写入器相连的SWD接口电路。2.2 系统硬件框图KL25硬件最小系统引脚包括电源类引脚、复位脚晶振引脚等,如表所示。表2.1 KL25硬件最小

7、系统引脚表2.3 SD-FSL-KL25-EVB硬件系统简介表2.2 D-FSL-KL25-EVB资源简表图2.1 SD-FSL-KL25-EVB实物图2.4系统设计流程图 图2.2 设计流程图 单片机模块中最常见的是电子时钟,电子时钟是一种用单片机原理实现时、分、秒计时的装置。首先利用程序目录中的timer.c ,通过”串口”发送表示时间的字节数据,然后再利用定时器溢出中断修改时间,并发送新时间。在程序目录中tpm.c实现TPM定时功能,在程序目录中lcd.show才在仪器的LCD显示屏上显示输出。上图2.2是系统设计流程图。第三章 硬件设计3.1单片机(MCU)模块3.1.1 KL25单片

8、机性能概述KL系列MCU是以AMBA总线规范为架构SOC(System on chip)。一般来说,AMBA架构包含高性能系统总线 (AHB,Advanced High Performace Bus)和低速、低功耗的外设总线(APB ,Advanced PeriPheral Bus)。 MCU的硬件最小系统是指可以使内部程序运行所必须的最低规模的外围电路,也可以包括写入器接口电路。一般情况下,MCU的硬件最小系统由电源、晶振及复位等电路组成。随着Flash存储器制造技术的发展,硬件最小系统应该把写入器的接口电路也包含在其中。KL25芯片的硬件最小系统包括电源电路、复位电路、晶振电路及与写入器相

9、连的SWD接口电路。1. 电源及其滤波电路电路中需要大量的电源类引脚用来提供足够的电流容量同时保持芯片电流平衡,所有的电源引脚必须外接适当的滤波电容抑制高频噪音。去耦是指对电源采取进一步的滤波措施,去除两级间信号通过电源互相干扰的影响。2. 复位电路及复位功能复位,意味着MCU一切重新开始。复位引脚为T_RST。若T_RST信号有效(低电平)则会引起MCU复位。3.晶振电路晶振电路为芯片提供准确的工作时钟。作为振荡源的晶体振荡器分为无源晶振(Crystal)和有源晶振(Oscillator)两种类型。4. SWD 接口电路通过SWD接口可以实现程序下载和调试功能。SWD接口只需两根线,数据输入

10、/输出线SWD_DIO和时钟线SWD_CLK。3.1.2 模块图图3.1 32位微控制器系统、外围总线模块图图3.1给出了32位微控制器系统、外围总线模块图,KL系列MCU是以AMBA总线规范为架构SOC(System on chip)。一般来说,AMBA架构包含高性能系统总线 (AHB,Advanced High Performace Bus)和低速、低功耗的外设总线(APB ,Advanced PeriPheral Bus)。系统总线AHB是负责连接ARM内核、DMA 控制器、片内存储器或其他需要高带宽的模块。外设总线APB则是用来连接系统的外围慢速模块,其协议规则相对系统总线AHB来说较

11、为简单,它与系统总线AHB之间则通过总线桥(Bus bridge)相连,期望能減少系统总线的负载。3.2串行通信模块3.2.1 MAX232芯片简介在MCU中,若用RS-232总线进行串行通信,则需外界电路实现电平转换,在发送端需要用驱动电平将TTL电平转换成RS-232电平;在接收端,需要用接收电路将RS-232电平转换为TTL电平。电平转换器不仅可以由晶振管分立元件构成,也可以直接使用集成电路。目前使用MAX232芯片比较多,该芯片使用单一+5V电源供电实现电平转换。图3.2 MAX232引脚图 图3.3串行通信接口电平转换电路示意图3.2.2 串行通信的电路原理 发送过程:MCU的TxD

12、(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.1 MAX232芯片输入输出引脚分类与基

13、本接法组别TTL电平引脚方向典型接口232电平引脚方向典型接口11112输入输出接MCU的TxD接MCU的RxD1314输入输出连接到接口,与其它设备通过232相接2109输入输出接MCU的TxD接MCU的RxD87输入输出连接到接口,与其它设备通过232相接 3.2.3 串行通信编程模型 从基本原理角度看,串行通信接口UART的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输出。图3.4 UART 编程模型3.4 液晶显示模块1.点阵字符型LCD基本特点: LCD作为电子信息产品的主要显示器件,相对于其他类型的

14、显示器件来说有其自身的特点,主要包括:(1)低电压,低功耗; (2)平板型结构;(3)使用寿命长;(4)被动显示;(5)显示信息量大且易于彩色化;(6)无电磁辐射。点阵字符型LCD是专门用于显示数字,字母,图形符号及少量自定义符号的液晶显示器。这类显示器把LCD控制器,点阵驱动器,字符存储器,显示体及少量的阻容元件等集成一个液晶显示模板。鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示器模块。点阵字符型液晶显示器模块的控制器大多数为日立公司生产的HD44780及其兼容的控制电路,如:SED1

15、278(SEIKO EPSON),KS0066(SAMSUNG),NJU6408(NER JAPANRADIO)等。2.字符型液晶显示器模块的特点如下:(1)液晶显示屏是以若干5*8或5*11点阵块等组成的显示字符群。每个点阵块块为一个字符位,字符间距和行间距都是一个点的宽度。(2)主控制电路为HD44780(HITACHI)及 其他公司的兼容电路。从程序员的角度来看LCD显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。(3)内部具有字符发生器ROM,可显示192种字符。(4)具有64字节的字符发生器RAM,可以定义8个5*8点阵字符或4个5*1

16、1的点阵字符。(5)具有64字节的数据显示RAM,供显示器编程使用。(6)标准接口特性,与MC9S08系列的MCU容易接口。(7)模块结构紧凑,轻巧,装配容易。(8)单+5V电源供电(宽温型需要加-7V驱动电源)。(9)低功耗,高可靠性。第四章 软件流程设计4.1 MCU(C)程序4.1.1主程序(main.c)/= #include includes.h /包含总头文件int main(void)uint_8 LCDBuffer18;/uint_8 * g_DispalyInit; /1.声明主函数使用的局部变量 uint_32 remember; /2.关总中断 enter_critica

17、l(); / 进入临界区,关中断/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_time0=00; /(1) 时分秒缓存初始化(00:00:00) g_time1=00; g_time2=00;/g_time3=11;/ g_time4=51; g

18、_time3=d; g_time4=a; g_time5=i; g_time6=s; g_time7=h; g_time8=u; g_time9=y; g_time10=a; g_time11=45;/g_DispalyInit = (uint_8 *) ; remember = g_time2; /(2) 临时变量remember初始化/5.开中断 uart_enable_re_int(UART_1); /启动串口1接收中断 tpm_enable_int(TPM0); /启动模块中断 init_critical(); /开总中断/ LCDShow(g_DispalyInit); /进入主循环

19、/主循环开始=for(;) if (g_time2 != remember) /判断秒钟是否发生变化 LCDBuffer0=g_time0/10+0; LCDBuffer1=g_time0%10+0; LCDBuffer2=:; LCDBuffer3=g_time1/10+0; LCDBuffer4=g_time1%10+0; LCDBuffer5=:; LCDBuffer6=g_time2/10+0; LCDBuffer7=g_time2%10+0; LCDBuffer8=g_time3; LCDBuffer9=g_time4; LCDBuffer10=g_time5; LCDBuffer1

20、1=g_time6; LCDBuffer12=g_time7; LCDBuffer13=g_time8; LCDBuffer14=g_time9; LCDBuffer15=g_time10; LCDBuffer16=g_time11/10+0; LCDBuffer17=g_time11%10+0; uart_sendN(UART_1,12,g_time); remember=g_time2; LCDShow(LCDBuffer); / end_while /主循环结束=return 0; 4.1.2 中断子程序(Isr.c)/=/文件名称:isr.c/功能概要: 中断底层驱动构件源文件/版权所

21、有:苏州大学飞思卡尔嵌入式中心()/更新记录:2012-11-12 V1.0/= #include includes.h/=中断函数服务例程=/串口0接收中断服务例程void isr_uart0_re(void) uint_8 ch; uint_8 flag = 1; enter_critical(); ch = uart_re1(UART_0, &flag); if (0 = flag) uart_send1(UART_0, ch); exit_critical();/串口1接收中断服务例程void isr_uart1_re(void) static uint_8 index=0; /收到的

22、个数 uint_8 flag = 1; enter_critical(); if(index11)index=0; /三个字节一收,时分秒 g_timeindex=uart_re1(UART_1,&flag); if(0=flag) index+; exit_critical();/串口2接收中断服务例程void isr_uart2_re(void) uint_8 ch; uint_8 flag = 1; enter_critical(); ch = uart_re1(UART_2, &flag); if (0 = flag) uart_send1(UART_2, ch); exit_crit

23、ical();/tpm定时中断void tpm0_isr(void) static uint_32 TPMCounter = 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.3 LCD子程序(LC

24、D.c)/函数名称:LCDShow/函数返回:无/参数说明:需要显示的数据 /功能概要:液晶显示data中的数据。/= void LCDShow(uint_8 data18) uint_8 i;/LCD初始化 LCDInit();/显示第1行16个字符 gpio_set (LCD0.gpio_port, LCD0.gpio_pin, 0); gpio_set (LCD1.gpio_port, LCD1.gpio_pin, 0); /后7位为DD RAM地址(0x00) LCDCommand(0x80); /写16个数据到DD RAM gpio_set (LCD0.gpio_port, LCD0

25、.gpio_pin, 1); gpio_set (LCD1.gpio_port, LCD1.gpio_pin, 0); /将要显示在第1行上的16个数据逐个写入DD RAM中 for (i = 0;i 16;i+) LCDCommand(datai); /显示第2行16个字符 gpio_set (LCD0.gpio_port, LCD0.gpio_pin, 0); gpio_set (LCD1.gpio_port, LCD1.gpio_pin, 0); /后7位为DD RAM地址(0x40) LCDCommand(0xC0); gpio_set (LCD0.gpio_port, LCD0.gp

26、io_pin, 1); gpio_set (LCD1.gpio_port, LCD1.gpio_pin, 0); /将要显示在第2行上的16个数据逐个写入DD RAM中 for (i = 16;i 18;i+) LCDCommand(datai); /=/函数名称:LCDCommand/函数返回:无/参数说明:cmd:待执行的命令 /功能概要:执行给定的cmd命令,且延时。/= void LCDCommand(uint_8 cmd)uint_8 i;uint_16 j;uint_8 temp;/等待延迟防止重复调用此函数而LCD卡死 for (j=0; j1600; j+);asm(NOP);

27、/数据送到LCD的数据线上 for(i = 3;i 11;i+) gpio_set (LCDi.gpio_port, LCDi.gpio_pin, 0); for(i = 3;i (i-3); gpio_set (LCDi.gpio_port, LCDi.gpio_pin, temp); /给出E信号的下降沿(先高后低),使数据写入LCD gpio_set (LCD2.gpio_port, LCD2.gpio_pin, 1); for (j=0;j=60) /秒溢出 *(p+2)=0; /清秒*(p+1)+=1; /分+1if( *(p+1)=60) /分溢出 *(p+1)=0; /清分 *p

28、+=1; /时+1 if( *p=24) /时溢出 *p=0; /清时 4.1.5串行通信子程序(uart.c)/=/文件名称:uart.c/功能概要:uart底层驱动构件源文件/版权所有:苏州大学飞思卡尔嵌入式中心()/更新记录:2012-11-12 V1.0/= #include uart.h/串口1、2号地址映射 const UART_MemMapPtr UART_ARR = UART1_BASE_PTR, UART2_BASE_PTR;/打开MCGIRCLK时钟 static void MCGIRCLK_OutEnable(void);/=/函数名称:uart_init/功能概要:初始

29、化uart模块 /参数说明:uartNo:串口号:UART_0、UART_1、UART_2 / sel_clk:选择串口0时钟源:MCGIRCLK (4000Khz)/ MCGPLL (48000Khz)/ BUSCLK (24000khz)/ baud:波特率:300、600、1200、2400、4800、9600、19200、115200./函数返回:无/说明: 当参数为UART_0时,sel_clk只能选择MCGIRCLK或MCGPLL,若选择内部时钟MCGIRCLK,/波特率需小于19200; 当参数为UART_1或是UART_2时,sel_clk只能选择BUSCLK/= void u

30、art_init (uint_8 uartNo,uint_32 sel_clk,uint_32 baud_rate) /局部变量声明register uint_16 sbr;uint_8 temp; uint_32 clk_Khz;UARTLP_MemMapPtr uartch1=UART0_BASE_PTR;/声明uartch1为UARTLP_MemMapPtr结构体类型指针 UART_MemMapPtr uartch2; /声明uartch2为UART_MemMapPtr结构体类型指针 uartch2 = UART_ARRuartNo-1;/获得UART1、2模块相应口基地址/根据带入参数

31、uartNo,给局部变量uartch1赋值if(uartNo=0)switch(sel_clk)case MCGIRCLK:/启用并选择UART0时钟源MCGIRCLKMCGIRCLK_OutEnable(); /启用内部快速时钟SIM_SOPT2 |= SIM_SOPT2_UART0SRC(0x3); /UART0选择MCGIRCLK=4000Khz时钟源break; case MCGPLL:SIM_SOPT2 |= SIM_SOPT2_UART0SRC(1); /UART0选择MCGFLLCLK_khz=48000Khz时钟源SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL

32、_MASK; break; default:break;/引脚复用为串口功能并启用串口模块时钟 PORTA_PCR14 = PORT_PCR_MUX(0x3); /使能UART0_TXDPORTA_PCR15 = PORT_PCR_MUX(0x3); /使能UART0_RXDSIM_SCGC4 |= SIM_SCGC4_UART0_MASK; /启动串口0时钟/暂时关闭串口0发送与接收功能 uartch1-C2 &= (UART_C2_TE_MASK | UART_C2_RE_MASK); /根据时钟源选择时钟频率if(MCGIRCLK = sel_clk)clk_Khz = MCGFLL_C

33、LK_KHZ;else if (MCGPLL = sel_clk)clk_Khz = MCGPLL_CLK_KHZ;/配置串口工作模式:8位无校验模式sbr = (uint_16)(clk_Khz*1000)/(baud_rate * 16);temp = UART_BDH_REG(uartch1) & (UART_BDH_SBR(0x1F);UART_BDH_REG(uartch1) = temp | UART_BDH_SBR(sbr & 0x1F00) 8);UART_BDL_REG(uartch1) = (uint_8)(sbr & UART_BDL_SBR_MASK);/初始化控制寄存

34、器、清标志位UART0_C4 = 0x0F;UART0_C1 = 0x00;UART0_C3 = 0x00;UART0_MA1 = 0x00;UART0_MA2 = 0x00;UART0_S1 |= 0x1F;UART0_S2 |= 0xC0; /启动发送接收uartch1-C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK); else switch (uartNo) case UART_1: PORTE_PCR0 = PORT_PCR_MUX(0x3); /使能UART1_TXD PORTE_PCR1 = PORT_PCR_MUX(0x3); /使能UART1_RXD SIM_SCGC4 |= SIM_SCGC4_UART1_MASK; /启动串口1时钟 break; case UART_2: PORTE_PCR22 = PORT_PCR_MUX(0x4); /使能U

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1