单片机飞思卡尔课程设计Word格式.docx
- 文档编号:20887646
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:23
- 大小:770.82KB
单片机飞思卡尔课程设计Word格式.docx
《单片机飞思卡尔课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《单片机飞思卡尔课程设计Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
由于单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。
单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 卡尔 课程设计