单片机飞思卡尔课程设计Word格式.docx

上传人:b****6 文档编号:20887646 上传时间:2023-01-26 格式:DOCX 页数:23 大小:770.82KB
下载 相关 举报
单片机飞思卡尔课程设计Word格式.docx_第1页
第1页 / 共23页
单片机飞思卡尔课程设计Word格式.docx_第2页
第2页 / 共23页
单片机飞思卡尔课程设计Word格式.docx_第3页
第3页 / 共23页
单片机飞思卡尔课程设计Word格式.docx_第4页
第4页 / 共23页
单片机飞思卡尔课程设计Word格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

单片机飞思卡尔课程设计Word格式.docx

《单片机飞思卡尔课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机飞思卡尔课程设计Word格式.docx(23页珍藏版)》请在冰豆网上搜索。

单片机飞思卡尔课程设计Word格式.docx

由于单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。

单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。

Freescale的S08系列8位MCU由于稳定性高、开发周期短、成本低、型号多样、兼容性好被广泛应用。

HC08是Freescale的08系列之一S08表示增强型HC08,它是在HC08基础上发展起来的,兼容HC08系列。

S08是2004年左右推出8位MCU,资源丰富,功耗低,性价比很高,是08系列MCU发展趋势,其性能与许多16位MCU相当。

MC9S08AW60是低成本、高性能8位微处理器S08家族中的成员,本次课程设计就是以该芯片为基础,来进行嵌入式的设计。

1.2系统功能

当按下启动键,电子时钟从当前设定值开始走时。

按秒刷新,要求在LCD屏上显示。

若按启动键,则时间暂停,再按,时间继续按秒刷新。

时间格式是”时:

分:

秒”(00:

00:

00)。

通过向通用I/O端口的引脚输入高或低(1或0)电平,作为启动键,对电子钟进行控制——电子钟开始运行、暂停和继续运行。

显示数据时,先把要显示的数据送到数据寄存器中,再通过发送寄存器将数据输入要LCD中显示。

第二章系统硬件设计

2.1系统原理图

该系统由AW60最小系统电路为主要结构,利用串口进行数据的控制与采集。

首先将开关接在AW60上的PORT_D口上,用于控制数字时钟系统的开关。

然后将LCD的数据线7-14引脚(D0-D7)分别与MCU的PTA0-PTA7连接,LCD的控制线RS、R/W、E(4、5、6引脚)分别于MCU的PTC4、PTC6、PTF6连接,用于输出时间。

数字时钟必须要有晶振电路,所以将该晶振电路与AW60的PTG5和PTG6相连,用于时间的自加。

由于在运行系统时,以防电流不稳定,所以在PTB0端设置一个下拉电阻,稳定电流。

2.2单片机(MCU)模块

2.2.1MC9S08AW60单片机性能概述

(1)最高达40MHz的CPU工作频率和20Hz的内部总线工作频率表;

时钟源选项包括晶振、谐振器、外部时钟或内部产生的时钟。

(2)相比HC08CPU指令集,S08CPU增加了BGND指令。

(3)单线后台调试模式接口;

增强的断点能力,允许单一的断点设置在线调试(在片内调试的模块增加了多于两个的断点)。

(4)内含32个中断/复位源;

内含2KB的片内RAM;

内含60KB的片内在线可编程Flash存储器,带有块保护和安全选项。

(5)可选的计算机正常操作(COP)复位;

低电压检测和复位或中断;

非法操作码检测与复位;

非法地址检测与复位。

(6)ADC:

多达16个通道,10位A/D转换器与自动比较功能;

两个串行通信接口SCI模块与可选的13位中断;

一个串行外设接口SPI模块;

集成电路互连总线I2C模块运作高达100kbps的最高总线负载;

8引脚键盘中断KBI模块。

(7)Timers:

1个2通道和1个6通道16位定时器/脉冲宽度调制器模板。

具有输入、捕捉、输出比较、脉宽调制功能。

2.2.2内部结构简图

1.内部结构简图

如图所示,给出了AW60的内部结构图,它对于我们理解和应用AW60MCU有重要作用,在学习了基本有法后,应在反过来熟悉这个内部结构图,以便更好地理解AW60MCU的基本原理。

从内部结构图可以看出,AW60主要有以下几个部分:

S08CPU、存储器、定时器接口模块、定时器模块、看门狗模块、通用IO模块、串口通信模块(SCI)、串行外设接口(SPI)模块、I2C(IIC)模块、A/D转换模块、键盘中断模块、时钟发生模块、复位与中断模块等。

2.3串行通信模块

2.3.1MAX232引脚图

在MCU中,若用RS-232总线进行串行通信,则需外接电路实现电平转换。

在发送端,需要用驱动电路将TTL电平转换成RS-232电平;

在接受端,需要用接收电路将RS-232电平。

转化为TTL电平。

电平转换器不仅可以由晶振管分立元件构成,也可以直接使用集成电路。

目前使用MAX232芯片较多,该芯片使用单一+5V电源供电实现电平转换。

如图所示,给出了MAX232的引脚说明。

各引脚含义简要说明如下:

Vcc(16脚):

正电源端,一般接+5V。

GND(15脚):

地。

VS+(2脚):

VS+=2VCC-1.5V=8.5V。

VS-(6脚):

VS-=-2VCC-1.5V=-11.5V。

C2+、C2-(4、5脚):

一般接1μF的电解电容。

表6MAX232芯片输入输出引脚分类与基本接法

组别

TTL电平引脚

方向

典型接口

232电平引脚

1

11(T1IN)

12(R1OUT)

输入

输出

接MCU的TxD

接MCU的RxD

13

14

连接到接口,与其它设备通过232相接

2

10(T2IN)

9(R2OUT)

8

7

C1+、C1-(1、3脚):

在正常情况下,

(1)T1IN=5V,则T1OUT=-9V;

T1IN=0V,则T1OUT=9V。

(2)将R1IN与T1OUT相连,令T1IN=5V,则R1OUT=5V;

令T1IN=0V,则R1OUT=0V。

MAX232芯片进行电平转换的基本原理:

(1)发送过程:

MCU的TxD(TTL电平)经过MAX232的11脚(T1IN)送到MAX232内部,在内部TTL电平被“提升”为232电平,通过14脚(T1OUT)发送出去。

接受过程:

外部232电平经过MAX232的13脚(R1IN)进入到MAX232的内部,在内部232电平被“降低”为TTL电平,经过12脚(R1OUT送到MCU的RxD,进入MCU内部。

2.3.2串行通信的电路原理

从基本原理的角度看,串行通信接口SCI的主要功能是:

接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;

发送时,把需要发送的一个字节的并行数据转换为单线输入。

为了设置波特率,SCI应具有波特率寄存器。

为了能够设置通信格式、是否校验、是否允许中断等,SCI应具有控制寄存器。

而要知道串口是否有数据可收、数据是否发送出去等,需要有SCI状态寄存器。

当然,若一个寄存器不够用,控制与状态寄存器可能有多个。

而SCI数据寄存器存放要发送的数据,也存放接受的数据,这并不冲突,因为发送与接收的实际工作是通过“发送移位寄存器”和“接收以为寄存器”完成的。

编程时,程序员并不直接与“发送移位寄存器”和“接收移位寄存器”打交道,只与数据寄存器打交道,所以MCU中并没有设置“发送移位寄存器和“接收移位寄存器”的映像地址。

发送时,程序员通过判定状态寄存器的相应位,了解是否可以发送一个新的数据。

若可以发送,则将待发送的数据放入“SCI数据寄存器”中就可以了,剩下的工作由MCU自动完成:

将数据从“SCI数据寄存器”送到“发送移位寄存器”,硬件驱动将“发送移位寄存器”的数据一位一位地按照规定的波特率移到发送引脚TxD,供对方接收。

接收时,数据一位一位地从接收引脚RxD进入“接收移位寄存器”,当收到一个完成字节时,MCU会自动将数据送入“SCI数据寄存器”,并将状态寄存器的相应位改变,供程序员判定并取出数据。

2.4液晶显示模块

LCD(YM1602C)

MCU控制液晶显示接口接线图

点阵字符型LCD是专门用于显示数字、字母、图形符号及少量自定义符号的液晶显示器。

这类显示器把LCD控制器、点阵驱动器、字符存储器、显示体及少量的阻容元件等集成一个液晶显示模块。

鉴于字符型液晶显示模块目前在国际上已经规范化,其电特性及接口特性是统一的,因此,只要设计出一种型号的接口电路,在指令上稍加修改即可使用各种规格的字符型液晶显示模块。

点阵字符型液晶显示模块的控制器大多数为日立公司生产的HD44780及其兼容的控制电路,如SED1278(SEIKOEPSON)、KS0066(SAMSUNG)、NJU6408(NERJAPANRADIO)等。

字符型液晶显示模块的主要特点如下:

1.液晶显示屏是以若干5*8或5*11点阵块组成的显示字符群。

每个点阵块为一个字符位,字符间距和行距都为一个点的宽度。

2.主控制电路为HD44780(HITACHI)及其他公司的兼容电路。

从程序员的角度来说,LCD的显示接口与编程是面向HD44780的,只要了解HD44780的编程结构即可进行LCD的显示编程。

3.内部具有字符发生器ROM,可显示192种字符(160个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.1MCU方(C)程序

Main.c:

#include"

Includes.h"

timer.h"

SCI.h"

LCD.h"

GPIO.h"

//在此添加全局变量定义

uint8g_time[8];

uint8g_DisplayInit[8];

uint8i;

uint8m;

#defineGPIO_Run_PORTPORT_E

voidmain(void)

{

uint8remember;

uint32mRuncount=0;

m=1;

//1关总中断

DisableInterrupt();

//禁止总中断

//2芯片初始化

MCUInit();

//3指示灯初始化

Light_Init(Light_Run_PORT,Light_Run,Light_OFF);

TPMinit(TPM_NUM_1);

LCDinit();

SCIInit(SCI_NUM_1,SYSTEM_CLOCK,9600);

g_time[0]=0;

g_time[1]=0;

g_time[2]='

:

'

;

g_time[3]=0;

g_time[4]=0;

g_time[5]='

g_time[6]=0;

g_time[7]=0;

remember=g_time[7];

m=GPIO_Get(Light_Run_PORT,0);

EnableSCIReInt();

EnabletimerInt(TPM_NUM_1);

EnableInterrupt();

SCISendN(SCI_NUM_1,8,g_time);

//LCDshow(g_time);

//4主循环

while

(1)

{m=GPIO_Get(GPIO_Run_PORT,0);

mRuncount++;

if(mRuncount>

=40000){

mRuncount=0;

Light_Change(Light_Run_PORT,Light_Run);

}

/**/if(g_time[7]!

=remember){

//SecAdd1(g_time);

for(i=0;

i<

8;

i++){

if(i!

=2&

&

i!

=5)

g_DisplayInit[i]=g_time[i]+'

0'

else

g_DisplayInit[i]=g_time[i];

}

SCISendN(SCI_NUM_1,8,g_DisplayInit);

//SCISendN(SCI_NUM_1,8,g_SCIreceive_data);

LCDshow(g_DisplayInit);

//g_SCIFlag=0;

SCISendN(SCI_NUM_1,3,g_time);

remember=g_time[7];

};

}

Isr.c:

//头文件

//#include"

isr.h"

//此处为用户新定义中断处理函数的存放处

interruptvoidisrT1Out(void){

uint8temp;

if(m==0)SecAdd1(g_time);

TPM_CSTR

(1)&

=~(TPM1SC_TOF_MASK);

}

/*

interruptvoidisrSCIre(void){

uint8SerialBuff[1];

temp=SCIReN(1,1,SerialBuff);

if(temp==0)SCISendN(1,1,SerialBuff);

}*/

//未定义的中断处理函数,本函数不能删除

interruptvoidisrDummy(void)

//中断处理子程序类型定义

typedefvoid(*ISR_func_t)(void);

//中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目

constISR_func_tISR_vectors[]@0xFFCC=

isrDummy,//0xFFCC//时基中断

isrDummy,//0xFFCE//IIC中断

isrDummy,//0xFFD0//ADC转换中断

isrDummy,//0xFFD2//键盘中断

isrDummy,//0xFFD4//SCI2发送中断

isrDummy,//0xFFD6//SCI2接收中断

isrDummy,//0xFFD8//SCI2错误中断

isrDummy,//0xFFDA//SCI1发送中断

//isrSCIre,//0xFFDC//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,//0xFFE8//TPM1溢出中断

isrDummy,//0xFFEA//TPM1通道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指令中断

//RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o文件中)

};

Timer.h:

#ifndeftimeR_H

#definetimeR_H

MC9S08AW60.h"

Type.h"

#defineTPM_CSTR(x)(*(vuint8*)(0x00000020+(x-1)*64))

#defineTPM_CNTH(x)(*(vuint8*)(0x00000021+(x-1)*64))

#defineTPM_CNTL(x)(*(vuint8*)(0x00000022+(x-1)*64))

#defineTPM_MODH(x)(*(vuint8*)(0x00000023+(x-1)*64))

#defineTPM_MODL(x)(*(vuint8*)(0x00000024+(x-1)*64))

#defineEnabletimerInt(x)TPM_CSTR(x)|=TPM1SC_TOIE_MASK

#defineDisabletimerInt(x)TPM_CSTR(x)&

=~TPM1SC_TOIE_MASK

#defineTPM_NUM_11

#defineTPM_NUM_22

#defineTPM1_CH_00

#defineTPM1_CH_11

#defineTPM1_CH_22

#defineTPM1_CH_33

#defineTPM1_CH_44

#defineTPM1_CH_55

#defineTPM2_CH_00

#defineTPM2_CH_11

voidTPMinit(uint8TPMNo);

voidSecAdd1(uint8*p);

#endif

Timer.c:

voidTPMinit(uint8TPMNo){

if(TPMNo>

2)

TPMNo=2;

elseif(TPMNo<

1)

TPMNo=1;

TPM_CSTR(TPMNo)=0b00010110;

TPM_CNTH(TPMNo)=0x00;

TPM_CNTL(TPMNo)=0x00;

TPM_MODH(TPMNo)=0x7A;

TPM_MODL(TPMNo)=0x12;

voidSecAdd1(uint8*p){

*(p+7)+=1;

if(*(p+7)>

9){

*(p+7)=0;

*(p+6)+=1;

if(*(p+6)>

5){

*(p+6)=0;

*(p+4)+=1;

//if(*p>

=24)

//*p=0;

if(*(p+4)>

*(p+4)=0;

*(p+3)+=1;

if(*(p+3)>

*(p+3)=0;

*(p+1)+=1;

if(*(p+1)>

*(p+1)=0;

*p+=1;

if(*(p+1)==4&

*p==2){

*p=0;

3.1.1串行通信子程序

SCI.h:

#ifndefSCI_H

#defineSCI_H

#include"

#defineSCI_BDH(x)(*(vuint8*)(0x00000038+(x-1)*8))

#defineSCI_BDL(x)(*(vuint8*)(0x00000039+(x-1)*8))

#defineSCI_C1(x)(*(vuint8*)(0x0000003A+(x-1)*8))

#defineSCI_C2(x)(*(vuint8*)(0x0000003B+(x-1)*8))

#defineSCI_S1(x)(*(vuint8*)(0x0000003C+(x-1)*8))

#defineSCI_S2(x)(*(vuint8*)(0x0000003D+(x-1)*8))

#defineSCI_C3(x)(*(vuint8*)(0x0000003E+(x-1)*8))

#defineSCI_D(x)(*(vuint8*)(0x0000003F+(x-1)*8))

#defineEnableSCIReInt()SCI1C2|=(SCI1C2_RIE_MASK)

#defineDisableSCIReInt()SCI1C2&

=~(SCI1C2_RIE_MASK)

#defineSCI_NUM_11

#defineSCI_NUM_22

voidSCIInit(uint8SCINo,uint8sysclk,uint16baud);

voidSCISend1(uint8SCINo,uint8ch);

voidSCISendN(uint8SCINo,uint16n,uint8ch[]);

uint8SCIRe1(uint8SCINo,uint8*p);

uint8SCIReN(uint8SCINo,uint16n,uint8ch[]);

voidSCISendString(uint8SCINo,char*p);

SCI.c:

voidSCIInit(uint8SCINo,uint8sysclk,uint16baud)

uint16ubgs;

ubgs=0;

if(SCINo>

2){

SCINo=2;

ubgs=sysclk*(10000/(baud/100))/16;

SCI_BDH(SCINo)=(uint8)((ub

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1