飞思卡尔单片机电子钟课程设计_第1页
飞思卡尔单片机电子钟课程设计_第2页
飞思卡尔单片机电子钟课程设计_第3页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、飞思卡尔单片机电子钟课程设 计第一章系统概要 31.1系统背景 31.2系统功能 3第二章系统硬件设计 32.1系统原理图 32.2单片机(MCU模块 4221 MC9S08AW60单片机性能概述.42.2.2 内部结构简图 52.3串行通信模块 62.3.1 MAX232 引脚图 62.3.2 串行通信的电路原理.72.4液晶显示模块 9第三章系统软件设计 103.1 MCU方(C)程序.错误!未定义书签。串行通信子程序 错误!未定义书 签。3.1.2 LCD子程序 错误!未定义书签。第四章系统测试 10第五章总结展望 255.1总结 255.2展望 25第一章系统概要1.1系统背景数字时钟

2、,当我们听到这几个字时,第一反应就是我们所说的数字,不错 数字钟就是以数字显示取代模拟表盘的钟表,在显示上它用数字反应出此时的 时间,相比模拟钟能给人一种一目了然的感觉,不仅如此它还能同时显示时、 分、秒。而且能对时、分、秒准确校时,这是普通钟所不及的。由于单片机集 成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列 优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不 为”单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展 到家用消费产品、办公自动化、汽车电子、pc机外围以及网络通讯等广大领域。1.2系统功能在实验箱上有一个启动键,当按下启动键

3、给以一个低电平,电子时钟从当 前设定值开始走时。按秒刷新,要求在 LCD屏上显示。若按启动键给以高电平, 则时间暂停,再按,时间继续按秒刷新。第二章系统硬件设计2.1系统原理图该系统由AW6C最小系统电路为主要结构,利用串口进行数据的控制与采集。 首先将开关接在 AW6C上的PORT_D口上,用于控制数字时钟系统的开关。然后将LCD的数据线7-14引脚(D0-D7)分别与MCUl勺PTA0-PTA7连接,LCD的控希9 线RS R/W E(4、5、6弓I脚)分别于MCU勺PTC4 PTC6 PTF6连接,用于输出 时间。数字时钟必须要有晶振电路,所以将该晶振电路与AW60的PTG5和PTG6相

4、连,用于时间的自加。由于在运行系统时,设置一个下拉电阻,稳定电流。以防电流不稳定,所以在PTB0端IIlli|HPttx-1PF1.ivij©via诸pyldFPX7*11.1-II iOU LUJ :Jld didJ=SH is2.2单片机(MCU )模块2.2.1 MC9S08AW60单片机性能概述(1)最高达40MHz的CPU工作频率和20Hz的内部总线工作频率表;时钟源选 项包括晶振、谐振器、外部时钟或内部产生的时钟。(2)相比HC08 CPU旨令集,S08 CPU增加了 BGN指令。( 3)单线后台调试模式接口;增强的断点能力,允许单一的断点设置在线调试 (在片内调试的模块

5、增加了多于两个的断点) 。(4)内含32个中断/复位源;内含2KB的片内RAM内含60KB的片内在线可编 程 Flash 存储器,带有块保护和安全选项。(5)可选的计算机正常操作(COP复位;低电压检测和复位或中断;非法操 作码检测与复位;非法地址检测与复位。(6)ADC多达16个通道,10位A/D转换器与自动比较功能;两个串行通信接 口 SCI模块与可选的13位中断;一个串行外设接口 SPI模块;集成电路互连总 线l2C模块运作高达100kbps的最高总线负载;8引脚键盘中断KBI模块。(7)Timers:1 个 2通道和 1 个6通道 1 6位定时器/脉冲宽度调制器模板。 具有 输入、捕捉

6、、输出比较、脉宽调制功能 。2.2.2 内部结构简图1. 内部结构简图如图所示,给出了 AW60的内部结构图,它对于我们理解和应用 AW60 MCU 有重要作用,在学习了基本有法后,应在反过来熟悉这个内部结构图,以便更 好地理解AW60MCU勺基本原理。从内部结构图可以看出, AW6C主要有以下几个 部分:S08 CPU存储器、定时器接口模块、定时器模块、看门狗模块、通用10模块、串口通信模块(SCI)、串行外设接口( SPI)模块、l2C(IIC )模块、A/D 转换模块、键盘中断模块、时钟发生模块、复位与中断模块等。PLLGPIOJTAGBDM心 XAX1!2.3串行通信模块2.3.1 M

7、AX232 引脚图在MCI中,若用RS-232总线进行串行通信,则需外接电路实现电平转换。 在发送端,需要用驱动电路将 TTL电平转换成RS-232电平;在接受端,需要用 接收电路将RS-232电平。转化为TTL电平。电平转换器不仅可以由晶振管分立 元件构成,也可以直接使用集成电路。目前使用MAX232芯片较多,该芯片使用单一 +5V电源供电实现电平转换。如图所示,给出了MAX232的引脚说明。各引脚含义简要说明如下:C1 +r1°诒1 vccVS +215| GNDC1 -H3T1OUTC2 +413RUN02->-1512R1OLJT|611T1INT2OUT71UT2IN

8、R2IN&Q| R2OUTVcc( 16脚):正电源端,一般接+5V。GND( 15 脚):地。Vs+( 2 脚):Vs+=2Vcc-1.5V=8.5V。VS-( 6 脚):V&=-2VCC-1.5V=-11.5V。C2+、C2- (4、5脚):一般接1卩F的电解电容C1 +、C1- (1、3脚):一般接1卩F的电解电容表WAX232芯片输入输出引脚分类与基本接法组别,TTL电平引脚方向典型接口232电平引脚"方向"典型接口'111 (T1IN )12 ( R1OUT )输入 输出接MCU的TxD 接MCU的RxD1314输入 输出连接到接口,与其它

9、设备通过232相接210 (T2IN )9 (R20UT )输入 输出接MCU的TxD 接MCU的RxD87输入 输出连接到接口,与其它设备通过232相接在正常情况下,(1) T1IN=5V,则 T1OUT=-9VT1IN=0V,则 T10UT=9V(2)将 R1IN 与 T10UT相连,令 T1IN=5V,则 R10UT=5;令 T1IN=0V,则 R10UT=0VMAX232芯片进行电平转换的基本原理:(1)发送过程:MCU勺TxD (TTL 电平)经过MAX232勺11脚(T1IN)送到MAX232内部,在内部TTL电平被“提 升”为232电平,通过14脚(T10UT发送出去。接受过程:

10、外部 232电平经 过MAX232的13脚(R1IN)进入到MAX232的内部,在内部232电平被“降低” 为TTL电平,经过12脚(R10UT送到MCU勺RxD进入MCI内部。TIC UT722U7i SCTJZs I'aF15TKDO RZDD 二:D】C)ILnn5TCCC.-V*C34C2 -T1 IHT DOTP OUTRL WT2 1HT2 DtTTOUTR2DTGHDJ6Jut串行通信的电路原理从基本原理的角度看,串行通信接口SCI的主要功能是:接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;发送时,把需要发送的一个字节的并行数据转换为单线输入。 为了

11、设置波特率, SCI 应具有波特率 寄存器。为了能够设置通信格式、是否校验、是否允许中断等,SCI 应具有控制寄存器。而要知道串口是否有数据可收、数据是否发送出去等,需要有 SCI 状 态寄存器。当然,若一个寄存器不够用,控制与状态寄存器可能有多个。而 SCI 数据寄存器存放要发送的数据,也存放接受的数据,这并不冲突,因为发送与 接收的实际工作是通过“发送移位寄存器”和“接收以为寄存器”完成的。编 程时,程序员并不直接与“发送移位寄存器”和“接收移位寄存器”打交道, 只与数据寄存器打交道,所以 MCU中并没有设置“发送移位寄存器和“接收移 位寄存器”的映像地址。发送时,程序员通过判定状态寄存器

12、的相应位,了解 是否可以发送一个新的数据。若可以发送,则将待发送的数据放入“ SCI 数据寄 存器”中就可以了,剩下的工作由 MCUI动完成:将数据从“ SCI数据寄存器” 送到“发送移位寄存器” ,硬件驱动将“发送移位寄存器”的数据一位一位地按 照规定的波特率移到发送引脚 TxD,供对方接收。接收时,数据一位一位地从接 收引脚RxD进入“接收移位寄存器”,当收到一个完成字节时,MCU会自动将数 据送入“ SCI 数据寄存器”,并将状态寄存器的相应位改变,供程序员判定并取 出数据。2.4液晶显示模块LCD(YM1602C)三LCD_D7LCD_D6LCD_D5LCD_D4LCD_D3LCD_D

13、2LCD_D1 LCD_D0 LCD_E LCD_R WAW60PTA7PTA6PTA5PTA4PTA3PTA2PTA1PTA0PTF6PTC6PTC4MCU控制液晶显示接口接线图点阵字符型LCD是专门用于显示数字、字母、图形符号及少量自定义符 号的液晶显示器。这类显示器把 LCD控制器、点阵驱动器、字符存储器、显 示体及少量的阻容元件等集成一个液晶显示模块。 鉴于字符型液晶显示模块目 前在国际上已经规范化,其电特性及接口特性是统一的,因此,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示模 块。点阵字符型液晶显示模块的控制器大多数为日立公司生产的HD44780及

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

15、5*7 点阵字符 和 32 个 5*10 点阵字符)。4. 具有64字节的字符发生器 RAM ,可以定义8个5*8点阵字符或 4个5*11 点阵字符。5. 具有 64 字节的数据显示 RAM ,供显示编程时使用6. 标准接口特性,与 MC9S08 系列 MCU 容易接口。7. 模块结构紧凑、轻巧、装配容易。8. 单 +5V 电源供电(宽温型需要加 -7V 驱动电源)。9. 低功耗、高可靠性。第三章 系统软件设计3.1 MCU 方( C)程序main.c#include "Includes.h"#include "LCD.h"#include "

16、SCI.h"#include "timer.h"#include "GPIO.h"/ 在此添加全局变量定义uint8 g_time8;void main(void)uint8 g_DispalyInit="00:00:00"uint8 remember;uint32 mRuncount=0;uint8 i;uint8 m;int n=1;/1 关总中断DisableInterrupt(); / 禁止总中断/2 芯片初始化MCUInit();/3 模块初始化Light_Init(Light_Run_PORT,Light_Run

17、,Light_OFF);LCDinit();TPMinit(TPM_NUM_1);SCIInit(SCI_NUM_1,SYSTEM_CLOCK,9600);/ 定时器/ 内存初始化g_time0=0;g_time1=0;g_time2=':'g_time3=0;g_time4=0;g_time5=':'g_time6=0;g_time7=0;remember=g_time7;/ 开放中断/LCDLCDshow(g_DispalyInit);while(n)if(GPIO_Get(LCD_Run_PORT,0)=LCD_Run)remember = g_time7

18、;n = 0;EnableSCIReInt();EnableInterrupt();EnabletimerInt(TPM_NUM_1);/4 主循环while (!n)if(g_time7!=remember)for(i=0;i<8;i+) if(i=2 | i =5)g_DispalyIniti =g_timei;elsem=g_timei;g_DispalyIniti=m+'0'LCDshow(g_DispalyInit);SCISendN(SCI_NUM_1,3,g_time);remember=g_time7;if(GPIO_Get(LCD_Run_PORT,0)

19、!=LCD_Run)LCDshow(g_DispalyInit);n = 1;DisableInterrupt();DisableSCIReInt();DisabletimerInt(TPM_NUM_1);isr.c#include "Includes.h"/ 此处为用户新定义中断处理函数的存放处#include "timer.h"/ 此处为用户新定义中断处理函数的存放处interrupt void isrT1Out(void)DisableInterrupt();SecAdd1(g_time);TPM_CSTR(1) &=(TPM1SC_TOF

20、_MASK);EnableInterrupt();/ 未定义的中断处理函数 , 本函数不能删除interrupt void isrDummy(void)/ 中断处理子程序类型定义typedef void( *ISR_func_t)(void);/ 中断矢量表 ,如果需要定义其它中断函数 , 请修改下表中的相应项目const ISR_func_t ISR_vectors 0xFFCC = isrDummy,/0xFFCC/时基中断isrDummy,/0xFFCE/IIC中断isrDummy,/0xFFD0/ADC转换中断isrDummy,/0xFFD2/键盘中断isrDummy,/0xFFD4/

21、SCI2发送中断isrDummy,/0xFFD6/SCI2接收中断isrDummy,/0xFFD8/SCI2错误中断isrDummy,/ 0xFFDA/SCI1发送中断isrDummy,/0xFFDC/SCI1接收中断isrDummy,/0xFFDE/SCI1错误中断isrDummy,/0xFFE0/SPI中断isrDummy,/0xFFE2/TPM2溢出中断isrDummy,/0xFFE4/TPM2通道1输入捕捉/ 输出比较中断isrDummy,/0xFFE6/TPM2通道0输入捕捉/ 输出比较中断isrT1Out,/0xFFE8/TPM1溢出中断isrDummy,/0xFFEA/TPM1通

22、道5输入捕捉/ 输出比较中断isrDummy,/0xFFEC/TPM1通道4输入捕捉/ 输出比较中断isrDummy,/0xFFEE/TPM1通道3输入捕捉/ 输出比较中断isrDummy,/0xFFF0/TPM1通道2输入捕捉/ 输出比较中断isrDummy,/0xFFF2/TPM1通道1输入捕捉/ 输出比较中断isrDummy,/0xFFF4/TPM1通道0输入捕捉/ 输出比较中断isrDummy,/0xFFF6/ICG的 PLL 锁相状态变化中断isrDummy,/0xFFF8/低电压检测中断isrDummy,/0xFFFA/IRQ引脚中断isrDummy/0xFFFC/SWI指令中断/

23、RESET 是特殊中断, 其向量由开发环境直接设置( 在本软件系统的 Start08.o 文件中 );timer.c#include "timer.h"void TPMinit(uint8 TPMNo)if(TPMNo > 2)TPMNo = 2;else if(TPMNo < 1)TPMNo=1;TPM_CSTR(TPMNo)=0b00010110;TPM_CNTH(TPMNo) = 0x00;TPM_CNTL(TPMNo) = 0x00;TPM_MODH(TPMNo) = 0x7A;TPM_MODL(TPMNo) = 0x12; void SecAdd1(u

24、int8 *p)*(p+7)+=1;if(*(p+7)>=10)*(p+7) = 0;*(p+6)+=1;if(*(p+6)>=6)*(p+6) = 0;*(p+4)+=1;if(*(p+4)>=10)*(p+4) = 0;*(p+3)+=1;if(*(p+3)>=6)*(p+3) = 0;*(p+1)+=1;if(*(p+1)>=9)*(p+1) = 0;*p+=1;if(*p*10+*(p+1)>=24)*p = 0;*(p+1) = 0;timer.h#ifndef timeR_H#define timeR_H#include "MC9S08

25、AW60.h"#include "Type.h"#define TPM_CSTR(x)(*(vuint8 *)(0x00000020+(x-1)*64)#define TPM_CNTH(x)(*(vuint8 *)(0x00000021+(x-1)*64)#define TPM_CNTL(x)(*(vuint8 *)(0x00000022+(x-1)*64)#define TPM_MODH(x)(*(vuint8 *)(0x00000023+(x-1)*64)#define TPM_MODL(x)(*(vuint8 *)(0x00000024+(x-1)*64)#

26、define EnabletimerInt(x) TPM_CSTR(x) |= TPM1SC_TOIE_MASK#define DisabletimerInt(x) TPM_CSTR(x) &=TPM1SC_TOIE_MASK#define TPM_NUM_1 1#define TPM_NUM_2 2#define TPM1_CH_0 0#define TPM1_CH_1 1#define TPM1_CH_2 2#define TPM1_CH_3 3#define TPM1_CH_4 4#define TPM1_CH_5 5#define TPM2_CH_0 0#define TPM2

27、_CH_1 1void TPMinit(uint8 TPMNo);void SecAdd1(uint8 *p);#endif3.1.1 串行通信子程序SCI.c#include "SCI.h"void SCIInit(uint8 SCINo, uint8 sysclk, uint16 baud) uint16 ubgs;ubgs=0;if(SCINo>2)SCINo=2;ubgs=sysclk*(10000/(baud/100)/16;SCI_BDH(SCINo)=(uint8)(ubgs&0xFF00)>>8);SCI_BDL(SCINo)=(u

28、int8)(ubgs&0x00FF);SCI_C1(SCINo)=0b00000000;SCI_C2(SCINo)=0b00001100;void SCISend1(uint8 SCINo, uint8 ch) if(SCINo>2)SCINo=2;while(!(SCI_S1(SCINo)&0b1000000);SCI_D(SCINo)=ch;uint8 SCIRe1(uint8 SCINo, uint8 *p) uint16 k;uint8 i;if(SCINo>2)SCINo=2;for(k=0;k<0xfbbb;k+)if(SCI_S1(SCINo)&

29、amp;0b00100000)!=0)i=SCI_D(SCINo);*p=0x00;break;if(k>=0xfbbb)i=0xff;*p=0x01;return i;void SCISendN(uint8 SCINo, uint16 n, uint8 ch) uint16 i;if(SCINo>2) SCINo=2;for(i=0;i<n;i+)SCISend1(SCINo,chi);uint8 SCIReN(uint8 SCINo, uint16 n, uint8 ch) uint16 m;uint8 fp;m=0;if(SCINo>2) SCINo=2;whil

30、e(m<n) chm=SCIRe1(SCINo,&fp);if(fp=1) return 1;m+;return 0;void SCISendString(uint8 SCINo, char *p)uint32 k;if(SCINo>2) SCINo=2;if(p=0) return;for(k=0;pk!='0'+k) SCISend1(SCINo,pk);SCI.h#ifndef SCI_H#define SCI_H#include "MC9S08AW60.h"#include "Type.h"#define SC

31、I_BDH(x) (*(vuint8 *)(0x00000038+(x-1)*8)#define SCI_BDL(x) (*(vuint8 *)(0x00000039+(x-1)*8)#define SCI_C1(x) (*(vuint8 *)(0x0000003A+(x-1)*8)#define SCI_C2(x) (*(vuint8 *)(0x0000003B+(x-1)*8)#define SCI_S1(x) (*(vuint8 *)(0x0000003C+(x-1)*8)#define SCI_S2(x) (*(vuint8 *)(0x0000003D+(x-1)*8)#define

32、SCI_C3(x) (*(vuint8 *)(0x0000003E+(x-1)*8) #define SCI_D(x) (*(vuint8 *)(0x0000003F+(x-1)*8)#define EnableSCIReInt() SCI1C2 |=(SCI1C2_RIE_MASK)#define DisableSCIReInt() SCI1C2 &=(SCI1C2_RIE_MASK)#define SCI_NUM_1 1#define SCI_NUM_2 2void SCIInit(uint8 SCINo,uint8 sysclk,uint16 baud);void SCISend

33、1(uint8 SCINo,uint8 ch);void SCISendN(uint8 SCINo,uint16 n,uint8 ch);uint8 SCIRe1(uint8 SCINo,uint8 *p);uint8 SCIReN(uint8 SCINo,uint16 n,uint8 ch);void SCISendString(uint8 SCINo,char *p);#endif3.1.2 LCD 子程序LCD.c#include "LCD.h"#include "GPIO.h"void LCDinit(void) uint16 i;LCDdata

34、D = 0b11111111;LCDctrlD1 |= (1 << LcdRS);LCDctrlD1 |= (1 << LcdRW);LCDctrl1 &=(1 << LcdRS);LCDctrl1 &=(1 << LcdRW);LCDctrlD2 |= (1 << LcdE);LCDctrl2 |= (1 << LcdE);LCDcommand (0b00111000);LCDcommand (0b00001000);LCDcommand (0b00000001);for(i=0;i<4000;i+

35、)asm("NOP");LCDcommand (0b00000110);LCDcommand (0b00010100);LCDcommand (0b00001100);GPIO_Init(LCD_Run_PORT,0,0,0);void LCDcommand(uint8 cmd)uint16 i;for(i=0;i<1000;i+)asm("NOP");LCDdata=cmd;LCDctrl2 |= (1<<LcdE);asm("NOP");asm("NOP");asm("NOP&quo

36、t;);LCDctrl2 &=(1<<LcdE);for(i=0;i<1000;i+)asm("NOP");void LCDshow(uint8 str) uint8 i;LCDinit();LCDctrl1 &=(1<<LcdRS);LCDctrl1 &=(1<<LcdRW);LCDcommand (0b10000000);LCDctrl1 |=1<<LcdRS;LCDctrl1 |=(1<<LcdRW); for(i=0;i<8;i+) LCDcommand(stri);LCD.h#ifndef LCD_H#define LCD_H#include "MC9S08AW60.h"#include "Type.h"#include "GeneralFun.h"#define LCDdata PTAD#define LCDdataD PTADD#define LCDctrl1 PTCD#define LCDctrlD1 PTCDD#define LCDctrl2 PTFD#define LCDctrlD2 PTFDD#define LcdRS 4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论