Freescale单片机实验指导书
张相军 杨 华
电气工程及自动化学院
2006.08.28
Freescale单片机实验指导书
1.概述
Freescale公司目前正在陆续推出的新一代8位嵌入式单片微机M68HC08系列,其片内集成的Flash存储器具有单一电源电压供电、支持在线编程等特点。本系统利用MC68HC908GP32单片机内32KB的Flash存储器划出2KB空间,驻留监控程序,为用户提供一套界面友好、价格低廉、支持在线调试的MCU在线编程实验开发系统。
2.系统主要功能
1.100%的在线实时仿真。用户下载自己的程序进入芯片后,在监控程序的
控制下自动转入用户程序执行。
2.准Windows界面,帮助信息丰富,提供演示实例。直接支持Freescale的.S19文件格式,显示所打开文件的内容,提示写入进程,自动擦除写入区并自动校验。
3.系统组合方便,所有I/O口引脚直接引出到插孔,供外接使用,开发板上提供了并行I/O模拟区、A/D、LCD、键盘等模拟区,可直接使用。不要求用户改变中断向量,用户完全可以按照标准格式书写程序,PC机方的管理软件自动扫描用户程序,将中断向量改变后送给MCU中的监控程序,MCU中的监控程序将用户中断向量放入监控区,待相应中断发生时,由监控程序转入。
4.写入后自动转入用户程序执行,为用户调试程序带来了方便,加快了调试速度。
5.复位后,在没有用户程序的情况下,一直处于监控联机状态,若有用户程序,5秒内处于监控联机状态,若无用户联机信号,则转入用户程序执行。
3.硬件系统说明 3.1总体结构布局
实验板硬件部分主要由MC68HC908GP32芯片及外围电路、LCD、键盘、模块化电源、串行口驱动电路、IC插线及其它元件扩展槽、输出开关量接线排、输入开关量接线排等部分组成,其主要作用是通过MC68HC908GP32芯片的监控程序和PC机进行通信,完成芯片程序的写入、运行、断点调试。系统的硬件布局框图见图1。
连接方法:
1.将实验开发板的串行口通过串行通信线与PC机的串行口1或2连接。 2.接通实验开发板电源,电源指示灯亮。 3.连接实验所需线路 。 4.按实验板上的复位按钮。
- 2 -
Freescale单片机实验指导书
5.执行PC机的配套软件,硬件系统等待SD-1软件系统的握手信号。
串行口 发送指示灯电源 IC插线及其它元件扩展槽B 写入器引线 电源指示灯 MC68HC908GP32芯片 MAX232 键 盘 接线 区 键盘插孔 IC插线及其它元件扩展槽A LCD自行接线区 电位器1 电位器2 LCD插孔 键盘 PTAFUSE RST PTB PTC PTD 蜂鸣器 8位拨线开关 8个输出指示灯 图1 SD-HC08(GP32)实验板布局
3.2 开关量输入
实验开发板用拨线开关提供8位数字量的输入。拨线开关状态为OFF时是高电平,拨线开关状态为ON时是低电平。
3.3 开关量输出
1.实验开发板用LED提供8位开关量的输出。导线接插点为高电平时LED是暗的,低电平时LED是亮的。 2.实验开发板含有蜂鸣器输出。
3.4 液晶显示接口
实验开发板提供可显示
LCD(HD44780) 16个符号或字母的双排字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 符液晶,实验开发板提供两种接线方式。
1.当将液晶显示器接入上面的插线时为固定接线,原理图如图2。
+5V 2.当将液晶显示器接入下面的插线时为手动接图2 MCU与LCD的连接 线,连线的位置在液晶的下
方,可以将04—14管脚自定义连接,其管脚定义见下表。
VSS Vdd Vee RS R/W DB7 PTB7 DB6 PTB6 DB5 PTB5 DB4 PTB4 DB3 PTB3 DB2 PTB2 DB1 PTB1 DB0 PTB0 E PTC0 PTC1 PTC2
管脚号 1 2 符号 Vss Vdd 电平 方向 引脚含义说明 电源地 电源(+5V) - 3 -
Freescale单片机实验指导书
3 4 5 6 7~10 11~14 15~16 V0 RS R/W E DB0~DB3 DB4~DB7 E1~E2 H/L H/L 输入 输入 液晶驱动电源(0~5V) 寄存器选择;1-数据寄存器 0-数据寄存器 读写操作选择:1-读操作 0-写操作 H/L 使能信号:R/W=0,E下降沿有效 输入 H→L R/W=1,E=1有效 三态 三态 输入 8位数据总线的低4位,若与MCU进行4位传送时,此4位不用 8位数据总线的高4位,若与MCU进行4位传送时,只用此4位 上下两行使能信号,只用于一些特殊型号 3.5 键盘接口
实验开发板提供16键键盘,用于键盘中断信号的输入。实验开发板提供两种接线方式。
1.当将键盘接入上面的插线时为固定接线。
注:固定接线自左向右分别接PTA0∽PTA7.
2.当将键盘接入下面的插线时为手动接线,连线的位置在键盘的左边。
3.6 模拟量输入
开发板用电位器提供两路模拟量输入,供进行A/D转换实验使用。
3.7 串行口
实验开发板利用MAX232芯片提供标准的串行口的Txd、RxD、GND。
3.8 元件扩展口
实验开发板提供元件扩展口,使用者可以进行IC扩展。布线如图3。
GND Vcc 图3 IC插线及其它元件扩展槽
4.软件使用说明
4.1 软件系统基本功能
(1)工程管理。可以管理C语言和汇编语言源文件列表。
(2) 源文件编辑。在开发环境中可以方便的对源文件进行编辑。
- 4 -
Freescale单片机实验指导书
(3) 源文件编译。打开C工程或汇编主程序后,可以进行编译,并生成S19和lst文件。S19是编译生成的机器码,lst是机器码与源代码的对应文件。
(4)目标代码写入芯片。要将目标代码写入芯片,先要对目标代码S19文件进行分解,分离出程序数据区和复位矢量数据区,同时将程序数据区分割为128字节的页,并记录该页的首址。然后建立PC机和MCU的通信线路。PC机发送写入芯片的命令,MCU接收命令后,再等待接收写入的总页数,然后接收每一页的首址及要写入的数据,MCU先擦除再将数据写入,直到写完所有的页及最后的复位矢量数据区的数据页。
4.2 软件系统使用
SD-1V20型MC68HC908GP32 MCU在线实验开发系统,直接支持.S19文件格式,不改变用户中断向量,写入后直接转入用户程序执行。启动界面如图4。
下拉菜单 工具栏 工程管理窗口 代码编辑器 编译调试信息窗口 图4 SD-HC08启动界面
(1)新建工程。单击文件菜单中的新建,将出现如图5的对话框。
- 5 -
Freescale单片机实验指导书
选择好工程的路径,工程文件名,工程类型,然后选择器件的类型,工程向导为自动在工程属性中填入该器件的内存设置,如果选空工程,则要手动填写工程属性。工程属性可选择C工程或者汇编主程序,汇编主程序不需要填写工程属
图5新建工程
性。以上设置好以后点击确定,工程建立成功。
工程新建完毕以后,可从图5的新建对话框的新建文件页中新建C文件、头文件、和汇编子程序文件,新建的时候可以选择是否加入到当前工程中。汇编子程序有两种,一种是C工程中的*.s文件,另一种是汇编主程序中使用到的*.asm
图6加入文件
文件。后者需要用户手动在汇编主程序中用$include “文件名”加入。也可以在右侧工程目录树上点击右键菜单中的加入文件项(如图6),把已存在C、H、S
- 6 -
Freescale单片机实验指导书
文件及其它类型的文档加入到工程中,文件会被添加在目录树的相应类别中,这些文件必须已经拷贝至工程所在的路径。
点击文件菜单中的保存工程可对工程进行保存。
(2)源文件编辑。双击目录树上的源文件名,该文件就会被打开,可以进行修改编辑。编辑器具有语法高亮显示。
(3)编译设置。点击编译菜单的编译设置。在这里可以修改器件内存的设置,以及编译器所需头文件的路径。全局变量设置用来设置C程序中全局变量的地址使用单字节还是双字节。注:汇编主程序不可以进行编译设置。
(4)编译工程。点击编译菜单的编译源程序,将对工程进行编译。如果编译成功,在下方编译调试输出信息窗口输出编译成功字样。如果源程序中有错误,系统将给予提示。用户可以双击错误提示来跳转到错误的源程序行,编辑器中红色的一行即为错误行。编译过程会产生三种错误信息:警告、错误、连接错误,分别以蓝色、红色、橙色显示。
(5)下载程序。点击编译菜单的写入芯片。缺省的S19文件是本工程的,用户也可自行选择一个S19文件。点击写入按钮后,立即将实验板复位,将进行下载。下载信息和写入进度会提示下载的情况。
如果下载过程中出现错误,将有弹出对话框提示。可能会出现的错误有:与实验板握手失败、数据校验失败、串口初始化失败、通信超时、写入指令发送失败。如果出现上述错误,请检查串行线的连接和实验板工作是否正常。
5.实例演示
(1)08汇编主程序
一个08汇编源程序按书写顺序可由7个部分组成,分别描述如下。 ① 程序描述
给出程序名、硬件连接、基本功能等描述,还可以给出编制者、编制时间等信息,若调试过程有新的体会,也可以在此添加。目的是为将来自己使用,或同组开发提供必要的备忘信息。
② 头文件与有关常量命名
汇编语言也借用C语言中“头文件”的概念,将映像寄存器的地址放入“头文件”中,程序中直接使用寄存器地址所对应的“名称”,更加直观。本书所附实例程序提供的“GP32.H”文件为MC68HC908GP32的映像寄存器名与地址对应表,见附录B。这样,实际程序用$include \"GP32.H\"语句将\"GP32.H\"文件包含到源程序中即可。例如,有了“头文件”,对“D口数据寄存器”读出操作,可以用“LDA PTD”取代“LDA $0003”,更容易理解。此外,若实际应用中,D口是接一个液晶显示器LCD的数据端口,编程时希望使用LCDData代表LCD的数据端
- 7 -
Freescale单片机实验指导书
口,则可以使用常量命名:“LCDData EQU PTD”,之后LCDData与PTD完全等同。
③ 内存变量
如果程序中使用到内存变量,需在此定义。实际上,这里是对内存变量的声明,通常称为“开辟内存变量”,内存变量的初始化工作需在主程序开始部分进行。第一个内存变量需用“ORG”语句定位,随后,按地址从小到大顺序排列。每个内存变量都有固定的内存地址。借用C语言术语,这里所开辟的所有内存变量都是“全局变量”。对应C语言中的“局部变量”概念将在讲解子程序规范时说明。
④ 主程序
主程序一般包括初始化与主循环两大部分。初始化包括堆栈初始化、系统初始化、内存变量初始化、I/O端口初始化、中断初始化等。主循环是程序的工作循环,根据实际需要安排程序段,但一般不宜过长,建议不要超过200行,具体功能可以通过调用子程序实现,或由中断程序实现。不带操作系统的MCU程序总有一个主循环,表示程序周而复始地执行。
⑤ 内部直接调用子程序
若有不单独存盘的子程序,建议放在此处。这样在主程序总循环的最后一个语句就可以看到这些子程序。建议不要超过3个,每个子程序不要超过200行。若有更多的子程序请单独存盘,单独测试。
⑥ 外部子程序
若有程序使用的存盘的子程序,可在此处用“$include 子程序名”将其包含。注意,存盘的子程序必须与主程序在同一个目录中。
⑦ 中断向量
中断向量一般放在最后。复位向量的两个地址中为MCU上电后要开始执行的程序地址,即为主程序的第一个语句地址。实际程序中,为了稳定,不用的中断向量需要进行一定的处理。
(2)第一个可执行的08汇编程序
实例编号:A01 路径:\\ASM\\ A01_简单IO及程序框架 *文 件 名:PrgFrame.ASM * *硬件连接:PTA.1接指示灯 * *程序描述:指示灯PTA.1闪烁 * *目 的:第一个freescale(Motorola) HC08系列MCU程序框架 * *说 明:提供Motorola MCU的编程框架,供教学入门使用 * *注 意:如果延时不够长的话,会发觉灯不会闪烁,而是一直亮,这是* 由于人的视觉的引起的。 * *----------《嵌入式应用技术基础教程》教学实例--------------* *[头文件] $include \"GP32ASM.H\" ;包含GP32的头文件 *[两个起始地址名] RAMstartAddr equ $0040 ;RAM的起始地址(因芯片而不同) FlashStartAddr equ $8000 ;程序开始地址(因芯片而不同) *[指示灯所接引脚定义] Light_P equ PTA ;灯(Light)接在PTA口 Light_D equ DDRA ;相应的方向寄存器 Light_Pin equ 1 ;所在的引脚 - 8 -
Freescale单片机实验指导书
*[内存变量] ORG RAMstartAddr ;RAM的起始地址 I1 RMB 1 ;变量I1的声明(字节型变量) *======================================================= *[主程序] ORG FlashStartAddr ;程序起始地址 MainInit: ;复位后程序从此开始执行 ;[系统初始化] SEI ;禁止所有中断 LDHX #$023F ;堆栈初始化为RAM最高端 TXS JSR GP32Init ;系统初始化,初学时跳过此处 ;[I/O初始化] BSET Light_Pin,Light_D ;令指示灯引脚为输出 BSET Light_Pin,Light_P ;初始时,指示灯\"暗\" ;[程序总循环入口] MainLoop: BCLR Light_Pin,Light_P ;指示灯(Light)“亮” ;[延时] 若要改变闪烁的快慢,可以改变循环次数 MOV #!250,I1 ;循环次数 Main1: JSR Delay1000 ;调用延时子程序 DBNZ I1,Main1 ;[指示灯(Light)\"暗\"] BSET Light_Pin,Light_P ;[延时] MOV #!250,I1 ;循环次数 Main2: JSR Delay1000 ;调用延时子程序 DBNZ I1,Main2 ;[转总循环入口处] JMP MainLoop *[内部直接调用子程序存放处] *Delay1000:延时1000个时钟周期--------------------------* *功能:用程序方法延时,延时长度为200*5=1000个时钟周期 * *入口:无 * *出口: 无 * *------------------------------------------------------* Delay1000: PSHA ;A进栈(保护寄存器A) ;延时200*5=1000个时钟周期 LDA #!200 ;循环次数 Delay1000_1: NOP ;1个时钟周期 NOP ;1个时钟周期 DBNZA Delay1000_1 ;3个时钟周期 PULA ;A出栈(恢复A寄存器) RTS *[外部子程序存放处] $include \"GP32Init.ASM\" *[中断向量] ORG $FFFE ;复位向量 DW MainInit
特别说明:程序中包含了存盘的\"GP32Init.ASM\"文件,是GP32系统初始化程序,它将对CONFIG1、CONFIG2进行设置,并对PLL进行编程,由外部晶振f=32.768KHz,得到内部总线时钟fBUS=2.4576MHz。
- 9 -
Freescale单片机实验指导书
实验1 程序框架及I/O编程
实验目的:
1. 理解Freescale MCU的编程框架
2. 熟悉编程调试环境,编译、调试、下载运行第一个程序 3. 掌握I/O的基本编程方法 范例程序:
1. A01_简单IO及程序框架\\ FrmMain.ASM
2. C01_简单IO及程序框架\\纯C\\prgframe.prj
3. C01_简单IO及程序框架\\C&ASM混编\\prgframe.prj 实验要求:
参考范例程序,自行设计I/O功能程序,提供硬件接线、程序描述、子程序入口出口规范说明、主程序流程框图、主要程序代码、实验体会等内容。
一、理解I/O端口的方向和输出电平的设计。
1.换一个I/O口控制灯的闪烁。
2.Port B d 第二引脚和port A的第三引脚交替闪烁。 二、改变指示灯闪烁时间间隔的方法
1.延时循环参数的修改。 2.总线时钟频率的修改。
实验2 定时器输入捕捉
实验目的:
编制定时器输入捕捉中断处理程序
范例程序:
MCU程序:
C05_2定时器输入捕捉\im1ch0.prj A05_2定时器输入捕捉\\Tim1CH0.asm
实验要求:
利用定时器输入捕捉功能,将一开关信号的变化情况用指示灯指示。 建议根据学习进展,分2个以上课时完成。 给出以上程序的完整表述。
- 10 -
Freescale单片机实验指导书
实验3 定时器溢出中断
实验目的:
编制定时器溢出中断处理程序
范例程序:
MCU程序:
C05_1定时器溢出中断\imer1.prj A05_1定时器溢出中断\\T1Main.asm 实验要求:
1.设计一个定时器溢出中断方式程序,在服务程序中,计数中断次数,次数由指示灯根据8421码指示。
2.改变定时器的周期,实现每一秒8421指示灯加1。 根据学习进展,分2个以上课时完成。 给出以上程序的完整表述。
实验4 锁相环编程
实验目的:
掌握锁相环参数设置
范例程序:
MCU程序: A05_3PWM脉冲信号输出\\PWMmain.asm
实验要求:
1、学生应分别编写具有不同时钟总线频率,从而在同样的定时器设置下,具有不同的PWM频率。
2、通过对PWM占空比的调节实现现指示灯的渐亮的功能,当占空比为100%时再从0%逐渐增加。
3、学生应将PLL编程的参数、总线频率、PWM频率、脉宽以及指示灯变化的周期
4、给出以上程序的完整表述。
- 11 -
Freescale单片机实验指导书
实验5 采用中断方式键盘编程
实验目的:
1. 理解键盘扫描的基本原理,掌握键盘基本接法与键值计算方法 2. 编制键盘查询、键盘中断、键值识别程序 范例程序:
1.C03_键盘中断编程\\keyboard.asm 2.C03_键盘中断编程\\keyboard.prj 实验要求:
参考范例程序,设计2×3或者3*2键盘,定义为0-5、给出硬件接线、键值计算、键盘扫描、键盘定义等描述,对子程序要求有入口出口规范说明,自行设计主程序功能并给出流程框图、主要程序代码。
1. 要求用8421码显示按键的值。 2. 采用中断方式。
实验6 采用扫描方式键盘编程
实验目的:
1. 理解键盘扫描的基本原理,掌握键盘基本接法与键值计算方法 2. 编制键盘查询、键盘中断、键值识别程序 范例程序:
1.C03_键盘中断编程\\keyboard.asm 2.C03_键盘中断编程\\keyboard.prj 实验要求:
参考范例程序,设计2×3或者3*2键盘,定义为0-5、给出硬件接线、键值计算、键盘扫描、键盘定义等描述,对子程序要求有入口出口规范说明,自行设计主程序功能并给出流程框图、主要程序代码。
1.要求用8421码显示按键的值。 2.采用扫描方式。
- 12 -
Freescale单片机实验指导书
实验7 非缓冲方式定时器编程
实验目的:熟悉定时器的寄存器设置和PWM输出功能
范例程序:参照A05_3PWM脉冲信号输出\\PWMmain.asm 实验要求:
采用非缓冲模式下,PWM/PFM频率和脉宽设置。
蜂鸣器声调10秒内由强到弱,再经10秒由弱到强。与此同时,尽可能实现同步指示灯显示变化。
实验8 带缓冲的PWM/PFM信号输出
实验目的:熟悉较高频率下,PWM/PFM功能的实现。 范例程序: A05_3PWM脉冲信号输出\\PWMmain.asm 实验要求: 参照实验7,分别给出上述程序的描述。
- 13 -
Freescale单片机实验指导书
实验9 A/D转换编程
实验目的:
1. 掌握MC68HC908GP32的A/D转换编程方法 2. 学会基本的综合应用和A/D转换的综合应用。 范例程序:
1.A04_AD模数转换\\ AD_Main.asm 2.C04_AD模数转换\\ AD.prj
实验要求:
编写一程序,其功能是:以查询方式得到A/D转换的值,然后判断A/D转换结果的范围控制相应的指示灯亮灭。
参照前面的实验,分别给出上述程序的描述。
实验10 A/D转换编程及定时器溢出中断综合实验
实验目的:
1. 掌握MC68HC908GP32的A/D转换编程方法 2. 进一步掌握A/D转换的综合应用及软件滤波。 3.进一步熟悉定时器溢出中断。 范例程序:
1.A04_AD模数转换\\ AD_Main.asm
实验要求:
编写一程序,其功能是:以查询方式得到A/D转换的值,然后将转换结果赋值给周期寄存器,PWM脉宽始终保持50%。循环显示周期和脉宽。
参照前面的实验,分别给出上述程序的描述。
- 14 -
Freescale单片机实验指导书
程序框架及I/O编程
参考程序:
*------------------------------------------------------* *文 件 名:FrmMain.ASM * *硬件连接:PTA.1接指示灯 * *程序描述:指示灯PTA.1闪烁 * *目 的:第一个freescale(Motorola) HC08系列MCU程序框架* *说 明:提供Motorola MCU的编程框架,供教学入门使用 * *注 意:如果延时不够长的话,会发觉灯不会闪烁,而是一 * * 直亮,这是由于人的视觉引起的。 * *--------《嵌入式应用技术基础教程》教学实例------------* *[头文件]
$include \"GP32ASM.H\" ;包含GP32的头文件 *[两个起始地址名]
RAMstartAddr equ $0040 ;RAM的起始地址(因芯片而不同) FlashStartAddr equ $8000 ;程序开始地址(因芯片而不同) *[指示灯所接引脚定义]
Light_P equ PTA ;灯(Light)接在PTA口 Light_D equ DDRA ;相应的方向寄存器 Light_Pin equ 1 ;所在的引脚 *[内存变量]
ORG RAMstartAddr ;RAM的起始地址
I1 RMB 1 ;变量I1的声明(字节型变量) *======================================================= *[主程序]
ORG FlashStartAddr ;程序起始地址
MainInit: ;复位后程序从此开始执行 ;[系统初始化]
SEI ;禁止所有中断
LDHX #$023F ;堆栈初始化为RAM最高端 TXS
JSR GP32Init ;系统初始化,初学时跳过此处 ;[I/O初始化]
BSET Light_Pin,Light_D ;令指示灯引脚为输出 BSET Light_Pin,Light_P ;初始时,指示灯\"暗\" ;[程序总循环入口] MainLoop:
;[指示灯(Light)“亮”] BCLR Light_Pin,Light_P
;[延时] 若要改变闪烁的快慢,可以改变循环次数 MOV #!250,I1 ;循环次数 Main1:
JSR Delay1000 ;调用延时子程序 DBNZ I1,Main1
;[指示灯(Light)\"暗\"]
- 15 -
Freescale单片机实验指导书
BSET Light_Pin,Light_P ;[延时]
MOV #!250,I1 ;循环次数 Main2:
JSR Delay1000 ;调用延时子程序 DBNZ I1,Main2 ;[转总循环入口处]
JMP MainLoop *[内部直接调用的子程序存放处]
*Delay1000:延时1000个时钟周期--------------------------* *功能:用程序方法延时,延时长度为200*5=1000个时钟周期 * *入口:无 * *出口: 无 * *------------------------------------------------------* Delay1000:
PSHA ;A进栈(保护寄存器A) ;延时200*5=1000个时钟周期 LDA #!200 ;循环次数 Delay1000_1:
NOP ;1个时钟周期 NOP ;1个时钟周期 DBNZA Delay1000_1 ;3个时钟周期
PULA ;A出栈(恢复寄存器A) RTS
*[外部子程序存放处] $include \"GP32Init.ASM\" *[中断向量]
ORG $FFFE ;复位向量 DW MainInit
- 16 -
Freescale单片机实验指导书
键盘编程
范例程序:
①C03_键盘中断编程\\keyboard.asm 实验要求:
参考范例程序,设计2×3键盘,定义为0-5、给出硬件接线、键值计算、键盘扫描、键盘定义等描述,对子程序要求有入口出口规范说明,自行设计主程序功能并给出流程框图、主要程序代码。
参考程序:
*-------------------键盘实验---------------------------*
*文 件 名:KeyMain.asm * *硬件连接:PTA7-4接键盘4根列线,PTA3-0接键盘4根行线 * *程序描述:按下键盘按键,串口发送对应的键值 * *目 的:键盘扫描,键盘中断,键值识别,键盘编码 * *注 意:如果键盘插在实验板的上排插孔,无须连线,若插 * * 在下排插孔,需手工接线 * *---------《嵌入式应用技术基础教程》教学实例-----------* *[头文件]
$include \"GP32ASM.H\" *[两个起始地址]
RAMstartAddr equ $0040 ;RAM的起始地址 FlashStartAddr equ $8000 ;程序开始地址
*======================================================= *[主程序]
org FlashStartAddr ;程序起始地址
MainInit: ;复位后程序从此开始执行 ;[系统初始化]
SEI ;关中断
LDHX #$023F TXS
JSR GP32Init ;调系统初始化子程序GP32Init JSR SCIInit ;调串行口初始化子程序SCIInit JSR KB_Init ;调键盘初始化子程序 BCLR 1,INTKBSCR ;开放键盘中断(IMASK=0) CLI ;开中断 ;[程序总循环入口,无中断时空操作] MainLoop: NOP
NOP
BRA MainLoop
*=========以下为子程序存放处============================ *KB_Int:键盘中断处理程序-------------------------------* *功能:键盘中断程序,把键定义值从串口发送出去 * *调用子程序:(1)扫描法读取键值子程序(KB_Scan) *
- 17 -
Freescale单片机实验指导书
* (2)键值转为定义值子程序(KB_Def) * *------------------------------------------------------* KB_Int:
SEI ;关总中断 PSHH ;保护H
BSET 1,INTKBSCR ;禁止键盘中断
JSR KB_Scan ;扫描键盘,读取键值->A JSR SCISend1 ;发送键值
JSR KB_Def ;转成键定义值->A JSR SCISend1 ;发送键定义值 JSR KB_Init
BCLR 1,INTKBSCR ; PULH ; CLI ; RTI
*[外部子程序存放处] $include \"GP32init.asm\" $include \"SCIInit.asm\" $include \"H08SCI.asm\" $include \"KBsub.asm\" *[中断向量]
ORG $FFE0 ; DW KB_Int
ORG $FFFE ; DW MainInit
开放键盘中断(IMASKK=0) 恢复H 开总中断 键盘中断矢量 复位矢量 - 18 -
Freescale单片机实验指导书
A/D转换编程
范例程序:
① A04_AD模数转换\\ AD_Main.asm ② Visual Basic6.0程序: VB_Sci目录下SCI_AD工程 接收MCU数据并显示 实验要求:
① 编写一程序,其功能是:以查询方式得到A/D转换的值,然后通过串行发送给PC。
② 参考范例程序设计一数据采集系统:MCU方采集0、1通道数据向PC发送,PC机接收后显示。
参照前面的实验,分别给出上述程序的描述。
参考程序:
------------------------------------------------------*
*文 件 名:AD_Main.ASM * *硬件连接:PTB0/AD0 接模拟量输入端 * *程序描述:获取1路A/D转换结果,并滤波,通过串口发送出去 * *目 的:掌握AD转换的基本编程方法 * *注 意:用SD-1实验板测试时,把液晶拔出,否则可能影响结果* *----------《嵌入式应用技术基础教程》教学实例----------* *[头文件]
$include \"GP32ASM.H\"
*======================================================* *[主程序]
org $8000 ;程序起始地址
MainInit: ;复位后程序从此开始执行 ;[系统初始化]
SEI
LDHX #$023F ;堆栈初始化 TXS
JSR GP32Init ;调系统初始化子程序GP32Init JSR SCIInit ;调串行口初始化子程序SCIInit ;[A/D初始化,用内部总线时钟,2分频] LDA #%00110000 STA ADCLK MainLoop:
LDA #$00 ;采集通道0,并求20次的平均值 LDX #!20
JSR adave ;调A/D转换均值滤波子程序 JSR SCISend1 ;串口发送转换结果 BRA MainLoop
*[外部子程序存放处,这些子程序都在当前目录中] $INCLUDE \"ADsub.asm\"
- 19 -
Freescale单片机实验指导书
$INCLUDE \"H08SCI.asm\" $INCLUDE \"GP32init.asm\" $INCLUDE \"SCIInit.asm\" *[中断向量]
ORG $FFFE ;复位矢量 DW MainInit
- 20 -
Freescale单片机实验指导书
定时器实验
范例程序:
MCU程序:
A05_1定时器溢出中断\\T1Main.asm A05_2定时器输入捕捉\\Tim1CH0.asm A05_3PWM脉冲信号输出\\PWMmain.asm 实验要求:
① 设计一个定时器溢出中断方式程序,每过1秒向PC机发送一个信号,PC机以串行中断方式接收此信号后,显示MCU的已经工作的时间。
② 利用定时器输入捕捉功能,将一开关信号的变化情况用图形方式显示在PC机的屏幕上。
③ 将定时通过对PWM占空比的调节实现现指示灯的渐亮的功能 当占空比为100%时再从0%逐渐增加。 给出以上程序的完整表述。
参考程序:
*------------------------------------------------------* *文 件 名:T1main.asm * *硬件连接:无 * *程序描述:1.从串口接收表示时间的3字节数据 * * 2.利用定时器溢出中断修改时间,并发送新时间 * *目 的:学习定时器基本功能 * *---------《嵌入式应用技术基础教程》教学实例-----------*
*[头文件]
$include \"GP32ASM.H\" ;包含GP32的头文件 *[两个起始地址名]
RAMstartAddr equ $0040 ;RAM的起始地址 FlashStartAddr equ $8000 ;程序开始地址
*[相应标志位定义]
ORG RAMstartAddr ;RAM的起始地址 cycle_counter ds 1 cy ds 1
*======================================================*
*[主程序]
ORG FlashStartAddr ;程序起始地址
MainInit:
SEI ;关总中断
LDHX #$023F ;堆栈初始化为RAM最高端 TXS
- 21 -
Freescale单片机实验指导书
JSR GP32Init ;调系统初始化子程序GP32Init JSR Timer1init ;调定时器1初始化子程序 CLI ;开总中断 mov #$FF,ddrb
mov #$FF,ptb
mov #$00,cycle_counter mov #$00,cy
MainLoop: sta copctl
JMP MainLoop
*[内部直接调用子程序存放处]
*Timer1init:定时器1初始化子程序------------------------* *功能:对定时器1初始化 * *入口:无 * *出口:无 * *------------------------------------------------------*
Timer1init:
mov #$30,T1SC ;Timer 1 - Cleared + Stopped 0011,0000 count_freq=internal_bus_freq/1
mov #$A0,t1modh
mov #$00,t1modl ;设定PWM方波的周期 mov #$50,T1CH0H ;
mov #$00,T1CH0L ;脉冲宽度预置 mov #$50,T1CH1H ;
mov #$00,T1CH1L ;脉冲宽度预置
mov #$2A,T1SC0 ;Timer 0 Channel 0 0010 1010
;Set for PWM operation
mov #$50,T1SC ;Start the timer
0101,0000 允许溢出中断 rts
*Timer1Int:定时器1溢出中断子程序-----------------------* *功能:给内存单元Time[0-2](时分秒)赋值 * *------------------------------------------------------* Timer1Int:
pshh ;2 bclr 7,t1sc ;4
inc cy lda cy cmp #$A0 bhi ji8
bra tim_chanover
ji8:
mov #$00,cy
- 22 -
Freescale单片机实验指导书
lda cycle_counter add #$01
sta cycle_counter lda #$FF
sub cycle_counter sta ptb tim_chanover: pulh rti
*[外部子程序存放处] $include \"GP32Init.ASM\" $include \"H08SCI.ASM\" $include \"SCIInit.ASM\"
*[中断向量]
ORG $FFF2 ;定时器1溢出中断向量 DW Timer1Int
ORG $FFE4 ;SCI接收中断向量 DW SCIRecINT
ORG $FFFE ;复位向量 DW MainInit
- 23 -
Freescale单片机实验指导书
------------------------------------------------------*
*工 程 名:Tim1Ch0Main.ASM * *硬件接线:1:PTA.1接指示灯 * * 2:PTD.4,即定时器1通道0(21脚)接开关 * *程序描述:输入捕捉中断方式,使开关拨动时指示灯PTA.1闪烁 * *目 的:学习HC08系列定时器输入捕捉功能 * *说 明:本例是将定时器1通道0(21脚)设为\"跳变沿捕捉\" * *---------《嵌入式应用技术基础教程》教学实例-----------* *[头文件]
$include \"GP32ASM.H\" ;包含GP32的头文件 *[两个起始地址名]
RAMstartAddr equ $0040 ;RAM的起始地址 FlashStartAddr equ $8000 ;程序开始地址 *[指示灯定义]
Light_P equ PTA ;灯(Light)接在PTA口 Light_D equ DDRA ;相应的方向寄存器 Light_Pin equ 0 ;所在的引脚
CH0FBit equ 7 ;定时器1通道标志位 TIMES DS 1
*======================================================* *[主程序]
org FlashStartAddr ;程序起始地址
MainInit: ;复位后程序从此开始执行 ;[系统初始化]
SEI ;关总中断 LDHX #$023F ;堆栈初始化 TXS
JSR GP32Init ;调系统初始化子程序GP32Init ;[I/O初始化]
BSET Light_Pin,Light_D ;令指示灯引脚为输出 BSET Light_Pin,Light_P ;初始时,指示灯\"暗\" BSET 2,LIGHT_P MOV #$0F,DDRB MOV #$00,TIMES LDA #$0F SUB TIMES STA PTB
;[定时器1通道0初始化]
;[不允许溢出中断、不启动计数、分频因子=1] LDA #%00110000 STA T1SC
;[输入捕捉模式,允许输入捕捉中断,跳变沿捕捉] LDA #%01001000
- 24 -
Freescale单片机实验指导书
STA T1SC0
;[允许定时器1计数寄存器计数] BCLR 5,T1SC
CLI ;开总中断 ;[主循环开始]
MainLoop: NOP
STA COPCTL JMP MainLoop *[内部直接调用子程序存放处]
*Tim1CH0Int:定时器1通道0输入捕捉中断子程序-------------* *功能:定时器输入捕捉中断处理,开关拨动时指示灯PTA.1闪烁 * *------------------------------------------------------* Tim1CH0Int:
PSHH ;保护 H STA COPCTL INC TIMES LDA #$0F SUB TIMES STA PTB
;[至此,可读取计数器的值,可在此处添加用户的程序.本程 ;序仅为实验例程,用指示等状态改变,说明发生了中断 LDA #$01 SUB PTA STA PTA Tim1CH0Int_2:
;清除定时器1通道0输入捕捉中断标志位 LDA T1SC0
BCLR CH0FBit,T1SC0 PULH ;恢复H RTI
*[外部子程序存放处] $include \"GP32Init.ASM\" *[中断向量]
ORG $FFF6 ;定时器1通道0输入捕捉中断向量 DW Tim1CH0Int
ORG $FFFE ;复位向量
DW MainInit
- 25 -
Freescale单片机实验指导书
*------------------------------------------------------* *[系统初始化子程序(GP32Init)] * *功能:系统初始化设置:设置CONFIG1和CONFIG2寄存器 * * CGM的寄存器设置:由外部晶振f=32.768KHz,产生内部 * * 总线时钟2.4576MHz * *入口:无 * *出口:无 * *------------------------------------------------------* GP32Init: PSHA ;[A进栈](保护寄存器A) ;初始化CONFIG2
LDA #%00000001
; ||_SCIBDSRC=1内部总线时钟用作SCI时钟 ; |__OSCSTOPENB=0 在stop模式下禁止 ; 振荡器工作 STA CONFIG2 ;初始化CONFIG1 LDA #%00111101
;||||||||_COPD=1 禁止COP模块 ;|||||||__STOP=0 禁止STOP指令
;||||||___SSREC=1 32个CGMXCLK周期退出STOP模式 ;|||||____LVI5OR3=1 LVI工作在5V ;||||_____LVIPWRD=1 禁止LVI模块电源 ;|||______LVIRSTD=1 允许LVI复位信号
;||_______LVISTOP=0 在stop模式下禁止LVI ;|________COPRS=0 COP溢出范围使用长的时间 STA CONFIG1 ;[PLL编程]
CLR PCTL ;①禁止PLL:清零PLL控制寄存器PCTL MOV #$01,PCTL ;②将P、E写入PTCL MOV #$01,PMSH ;③将N写入PMSH、PMSL MOV #$2C,PMSL
MOV #$80,PMRS ;④将L写入PMRS MOV #$01,PRDS ;⑤将R写入PRDS
BSET 5,PCTL ;⑥置PTCL.PLLON=1,启动PLL电路 BSET 7,PBWC ;⑦PBWC自动带宽控制位=1 BSET 4,PCTL ;⑧PTCL.BCS=1
PULA ;[A出栈](恢复寄存器A) RTS
设置P、R、N、E、L参数,运行程序并记录实验结果。
- 26 -
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务