单片机原理与应用技术实验指导书(V2.3).doc_第1页
单片机原理与应用技术实验指导书(V2.3).doc_第2页
单片机原理与应用技术实验指导书(V2.3).doc_第3页
单片机原理与应用技术实验指导书(V2.3).doc_第4页
单片机原理与应用技术实验指导书(V2.3).doc_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

单片机原理与应用技术实验指导书(Freescale)机械工程学院机械电子工程教研室 王晓峰实验一 飞思卡尔嵌入式实验系统入门GPIO控制实验一、实验目的:熟悉CodeWarrior集成开发环境及飞思卡尔嵌入式实验开发系统掌握AW60的GPIO结构及控制方法掌握CodeWarrior工程结构及创建汇编工程熟悉汇编指令及应用汇编语言编程方法二、实验内容1运用CodeWarrior新建工程,进行工程程序编辑、编译、下载、调试;2利用飞思卡尔嵌入式实验开发系统根据实验需要进行硬件连接;3. 观察示例工程项目,该工程功能为:根据连接在PTC0、PTC1口上的两个拨动开关的状态,控制接中PTB口上的八个LED处在以下二种不同状态:八个LED同时亮-灭循环;四个灯交替亮-灭;4.设计一个比示例工程简单的工程项目,内容为控制PTB口上连接的八个LED灯同时亮-灭循环一次再四个灯交替亮-灭一次。5设计一个比示例工程更复杂一些的工程项目,根据连接在PTC口上的两个拨动开关的状态,控制接中PTB口上的八个LED处在以下四种不同状态:八个LED亮灭循环;四个灯交替亮灭;一个LED左移流水灯;两个LED右移流水灯。三、实验步骤(注意:在调试过程中如需要进行连接线路时,要先将实验箱断电,待电路连接好后再接通电源!)1将飞思卡尔嵌入式实验开发系统实验箱接上电源,写入器BDM接头插接入核心卡BDM座,USB头接入PC机USB口。2PC机上启动CodeWarrior,新建工程LED.mcp(注意设置工程保存路径)3观察工程文件结构,查看相应文件。4在main.asm中编辑工程主文件5编辑相关子程序6编译,如果有错误修改,直至编译通过7链接、下载,调试观察LED灯现象GNDVcc拨码开关导线接插点图1-1 LED及拨动开关原理图四、参考程序1主汇编程序main.asm该程序为根据PTD口的PTD0上接的拨动开关的状态控制连接在PTB口上的八个LED灯在四亮四暗状态或八个灯同时亮同时暗的状态 XDEF asm_main XREF MCUInit XREF DelayHX INCLUDE derivative.inc INCLUDE light.inc INCLUDE switch.incMyCode: SECTION; this assembly routine is called the C/C+ applicationasm_main: JSR MCUInit JSR Switch_Init JSR Light_InitM_Scan: JSR Switch_Read LDA $70 CMP #$01 BNE M01 LDA #0 JSR Light_On_Off LDHX #$0fff JSR DelayHX LDA #1 JSR Light_On_Off LDHX #$0fff JSR DelayHX BRA M_ScanM01: CMP #$02 BNE M02 JSR Light_Half LDHX #$0fff JSR DelayHXM02: BRA M_Scan RTS ; return to caller2、LED灯构件程序light.asm;Light.asm小灯驱动-*;本文件包含: *; (1)Light_init:定义控制小灯的MCU的I/O引脚为输出 *; (2)Light_On_Off:驱动小灯亮,暗 *;-*;小灯驱动所需头文件 INCLUDE MC9S08AW60.inc ;MCU映像寄存器名 ;小灯控制引脚宏定义Light_P: equ PTBD ;灯(Light)接在PTB口Light_D: equ PTBDD ;相应的方向寄存器Lon: equ $00Loff: equ $ffLdiff: equ $0f;声明外部函数 XDEF Light_Init ;小灯初始化 XDEF Light_On_Off ;驱动小灯亮,暗 XDEF Light_Half ;驱动小灯四亮,四灭 ;Lightinit:定义控制小灯的MCU引脚为输出-*;功能:定义控制小灯的MCU引脚为输出,并使小灯初始为暗 *;-*Light_Init: LDA #$FFSTA Light_P ;设置初始时八个LED灯全灭LDA #$FF STA Light_D ;设置LED所接PTB口为输出 RTS;Light_On_Off:驱动小灯亮,灭-*;功能:根据A的值控制小灯的亮和暗 *;-*Light_On_Off: CMP #0 BNE Light_1 LDA #Lon STA Light_P BRA Light_ExitLight_1: CMP #1 BNE Light_Exit ;入口非L/A,程序无响应 LDA #Loff STA Light_PLight_Exit: RTS ;Light_Half:驱动小灯四亮,四灭-*;功能:根据A的值控制小灯的亮和暗 *;-* Light_Half: LDA Light_P CMP #Ldiff BNE Light_half1 LDA #Ldiff STA Light_P BRA L_exitLight_half1: LDA #Ldiff STA Light_PL_exit:RTS3、拨动开关控制程序Switch.asm;switch.asm开关状态输入-*;本文件包含: *; (1)Switch_init:定义连接开关的MCU的I/O引脚为输入 *; (2)Switch_read:读取开关状态 *; (3)RAM$70保存开关状态;-*;小灯驱动所需头文件 INCLUDE MC9S08AW60.inc ;MCU映像寄存器名 XDEF Switch_Init XDEF Switch_Read;开关连接引脚宏定义 Switch_P: equ PTCD Switch_D: equ PTCDD S_K1: equ 0 S_K2: equ 1 ;Switch_Init:定义连接开关的I/O为输入-* Switch_Init: BCLR S_K1,Switch_D BCLR S_K2,Switch_D RTS ;Switch_Read:读取连接开关的I/O口数据,取出开关状态-* ;RAM$70保存开关状态 * ;-* Switch_Read: PSHA LDA #0 STA $70 BSET S_K1,$70 BSET S_K2,$70 LDA Switch_P AND $70 STA $70 PULA RTS4、延时通用程序DelayHX.asm XDEF DelayHXDelayHX: PSHA ;A进栈(保护寄存器A) CPX #0 ;X变址寄存器中的值是否为0 BEQ DelayHX_ExitDelayHX_1: LDA #200 ;延时约200*5=1000(T)-DelayHX_2: NOP ;(1T) NOP ;(1T) DBNZA DelayHX_2 AIX #-1 ;(HX - 1) - HX CPHX #0 BNE DelayHX_1 DelayHX_Exit: PULA ;A出栈(恢复寄存器A) RTS;MCUInit.asmAW60芯片初始化子程序-*;功 能: *; 系统初始化设置,设置ICGC1和ICGC2寄存器,SOPT的寄存器*; 设置,由外部晶振f = 4MHz,产生内部总线时钟f = 20MHz * ;入 口:无 *;出 口:无 *;-* INCLUDE MC9S08AW60.inc ;MCU映像寄存器名 ;声明外部函数 XDEF MCUInit ;芯片初始化MCUInit: PSHA ;A进栈(保护寄存器A) LDA #%01100000 ; | ; | ; | ; |+-STOPE - 允许STOP ; |+-COPT - long timeout 218 ; +-COPE - 关看门狗 STA SOPT ;系统选项寄存器(只写一次) MOV #%00110000,ICGC2 ; | 应该在设置ICGC1之前写MFDx ; |+-RFD0 ; |+-RFD1 - 分频因子 R=1 ; |+-RFD2 / ; |+-LOCRE - 丢失时钟信号后产生一个中断信号 ; |+-MFD0 ; |+-MFD1 - 锁频环倍乘因子 N = 10 ; |+-MFD2 / ; +-LOLRE - 锁频环失锁后产生一个中断信号(不复位) MOV #%01111000,ICGC1 ; |x ; |+-LOCD - 允许检测时钟信号丢失 Lost of Clock ; |+-OSCSTEN - 在OFF模式下允许晶振电路 ; |+-CLKS0 - 选择 FLL engaged external reference(FEE) ; |+-CLKS1 / 使用锁频环的外时钟模式 ; |+-REFS - 使用晶振(0表示使用外时钟信号) ; |+-RANGE - 使用高频晶振(4MHz p=1) (1-1;0-64) ; +-HGO - 低功耗 ;等待FLL稳定 PULA ;A出栈(恢复寄存器A) RTS四、思考题1CodeWarrior建立工程有什么工程框架文件,这些文件的作用?2该实验采用模块化设计方法,工程框架包含哪些文件,画出其组织结构,画出主程序流程图。3进行调试时都有哪些方法?在调试过程中可以观察到什么与程序相关的要素?实验二 串口通信(SCI)实验一、实验目的:1进一步熟悉嵌入式开发系统环境、汇编、C语言、调试方式。2加强串口通信(SCI)基本原理及编程原理的理解。3理解C语言工程结构,掌握运用08C建立工程的方法。4分别运用查询方式、中断方式实现通信。二、实验要求:1仔细阅读本实验指导书。2复习有关的串行通信(SCI)的章节3熟悉AW60串行通信(SCI)的工作方法及编程。4根据实验内容要求编写好程序,为实验做充分地准备。412356789232电平OUT INMAX232CPE16 15 14 13 12 11 10 91 2 3 4 5 6 7 8+5V GND+5VTTL电平OUT INTTL电平转为232电C412356789412356789RxDTxD实验原理图如下:三实验设备及其连接1PC机一台2飞思卡尔嵌入式实验开发系统一台3串行通信线一根4万用表一只四实验内容1理解串行通信(SCI)原理。2理解及掌握本实验的样例工程:先通过串口向外发送一个字符串,等待从串口接收信息,以中断方式的接收信息,当接收到的信息为“A”、“B”、“C”、“D”时,分别使接在PTB中上的八个LED灯分别为“八个同时亮暗”、“四个亮四个暗”、“一个LED亮右移”、“一个LED亮左移”四种状态。3编制一个发送字符串通信程序:有需要发送字符串有8组分别为“A1111111111”,“B222222222”,“C333333333”,“D444444444”,“E555555555”,“F666666666”,“G777777777”,“H888888888”,每次将一组字符通过SCI1发送出去后,点亮在接在PTB口上的一个LED灯。4.完成样例工程的功能用轮询方式实现。五编程提示1按照结构要求写好编程代码和注释。2计算波特率,SCInInit(SCI初始化子程序)设置SCI比特率寄存器(SCInBDH,SCInBDL),设置允许SCI正常码输出、8位数据、无校验,即设置SCI控制寄存器1(SCIxC1)相应位,设置是否允许发送与接收、是中断接收还是查询接收,即设置SCI控制寄存器2(SCIxC2)相应位。3查询方式通信程序的主程序主体是一个永久循环,循环体中是不断检测SCI是否发送完毕,即检测SCI状态寄存器1(SCIxS1)第七位是否为1,为1则将控制接在PTB口的一个LED亮。4中断方式通信程序的主程序也主体是一个永久循环,在循环中根据中断程序中接收到的数据设置的变量值,调用相应的LED控制程序。中断程序根据接收到的数据设置一个全局变量值。六实验报告要求1小结AW60串行通信(SCI)的原理及编程,并画出其流程图和程序代码与硬件接线图。2小结中断方式和查询方式的编程方法,并画出其流程图和程序代码与硬件接线图。3回答下列问题(1)串行SCI通信有哪些中断?各在什么情况下发生,作用是什么?(2)用中断方式与查询方式有什么差别?七参考例程:1主程序main.c/=/函数名称: main.c 工程主函数/函数参数: 无/函数返回: 无/功能概要: 初始化发送字符串,Light构件,MCU,SCI1,开SCI1接收中断,从SCI1发送字符串/ 主循环中根据全局变量CF的值控制Light构件运行于四种状态中的一种或从/ SCI1发送一个Next!字符串/= #include /* for EnableInterrupts macro */ #include derivative.h /* include peripheral declarations */ #include SCI.h #include Light.h void MCUInit(void);/MCU构件文件声明 char CF; /CF全局变量,为Light构件控制变量 char P_Shift=0xfe; / P_Shift全局变量,Light构件左右移的控制变量 void main(void) char Sbuffer=Hello!I am 007. ; /初始化发送字符串 char Sbuffer1=Next!; DisableInterrupts; /关中断 MCUInit(); /MCU初始化 SCIInit(9600); /SCI1初始化 Light_Init(); /Light构件初始化 EnableInterrupts; /开中断 SCI1C2|= SCI2C2_RIE_MASK; /开串行口接收中断 SCISendS(Sbuffer); for(;) if(CF=1) Light_On_Off(); if(CF=2) Light_Half(); if(CF=3) Light_R(); if(CF=4) Light_L(); if(CF=5) SCISendS(Sbuffer1); 2MCU构件的初始化程序MCUInit.c/=/函数名称: MCUInit.c (AW60系统初始化子程序)/函数参数: 无/函数返回: 无/功能概要: 系统初始化设置,设置ICGC1和ICGC2寄存器,SOPT的寄存器设置,由外部晶振/ f = 4MHz,产生内部总线时钟f = 20MHz/=void MCUInit(void) SOPT = 0b01100000; /关闭看门狗 ICGC2 = 0b00110000; /ICG设置总线频率 ICGC1 = 0b01111000; while(!ICGS1_LOCK);/等待FLL稳定3.SCI构件相关程序SCI.c/=/文件名称: SCI.c/文件构成:SCIInit SCI1初始化/ SCISend1( ) SCI1发送一个字符程序 / SCISends( ) SCI1发送字符串程序/文件概要: SCI1构件初始化及发送函数/= #include MC9S08AW60.h #include SCI.h void SCIInit(word baud ) word Mbaud=0; Mbaud=20*(10000/(baud/100)/16; SCI1BDH=(byte)(Mbaud&0xFF00)8); SCI1BDL=(byte)(Mbaud&0x00FF); SCI1C1=0; SCI1C2=(0|SCI1C2_TE_MASK|SCI1C2_RE_MASK); void SCISendS(char *p) word i; if(p=0) return; for(i=0;pi!=0;+i) SCISend1(pi); void SCISend1(char Sch) while(!(SCI1S1&SCI1S1_TDRE_MASK); SCI1D=Sch;4.Light构件控制程序Light.c/=/构件名称: light.c/构件组成:Light_Init LED初始化 / Light_On_Off 八个LED亮暗控制程序/ Light_Half 四个LED灯交替亮暗控制程序/ Light_R 1个LED灯右移控制程序/ Light_L 1个LED灯左移控制程序/= #include Light.h #include General.h extern char P_Shift; void Light_Init(void) Light_D=0xff; Light_P=0xff; void Light_On_Off(void) Light_P=0xff; delay(10000); Light_P=0x00; delay(10000); ; void Light_Half(void) Light_P=0xf0; delay(10000); Light_P=0x0f; delay(10000); void Light_R(void) Light_P=P_Shift; if(P_Shift&0x01)=0) P_Shift=0x7f; else P_Shift=(P_Shift1)|0x80; delay(10000); void Light_L(void) ;自行编写此程序 5.通用构件General/=/函数名称: General.c/函数参数: k-延时的时间参数/函数返回: 无/功能概要: 可以根据时间参数K值延时/= #include General.h void delay(int k) int j;char i; for(j=0;jk;+j) for(i=0;i255;+i); 6.中断程序Isr.c/=/函数名称: Isc.c/函数参数: 无/函数返回: 无/功能概要: SCI1接收中断(17号)程序, 当接收到字符时将数据时将接收到的数据/ 读入, 根据数据是否为A, B, C, D 将全局变量CF设置为/ 15, 该变量在中程序中作为控制Light构件的参数./= #include MC9S08AW60.h extern char CF; void interrupt 17 SCI1Rec(void) char Rechar,ReS; ReS=SCI1S1; Rechar=SCI1D; switch(Rechar) case 0x41: CF=1;break; case 0x42: CF=2;break; case 0x43: CF=3;break; case 0x44: CF=4;break; default: CF=5; 实验三 键盘中断及LED数码块实验一、实验目的:1熟练运用嵌入式开发系统环境、C语言及调试方式;2复习串行通信接口(SCI)的内容;3加强对键盘原理的理解掌握键盘处理编程方法;4理解LED数码块的显示原理,掌握LED数码块显示编程方法。实验箱提供一个16键键盘,用于键盘中断信号的输入。系统提供两种接线方式:当将键盘接入上一排插孔时为固定接线,键盘接线原理图如图3-1所示。当将键盘接入下一排插孔时为手动接线,连线的位置在键盘的左边。实验箱提供四个LED数码块,PB0PB7为段码接口,PTD0、PTD1、PTD4、PTD5为位码控制接口。列线 n1 n2 n3 n4MCU内部上拉电阻12345678行线m1 m2 m3 m45VPTG1PTG0PTG2PTG3PTG4PTD2PTD3PTD7agdfecbhagdfecbhagdfecbhagdfecbhabfCS0CS1CS2cdeghCS3123456789101112PTD3PTB6PTB2PTB7PTB3PTB41K1K1K1KPTB1PTD2PTD1PTB5PTB0PTD03-1键盘及LED数码块原理图二、实验要求:1仔细阅读本实验指导书;2复习有关的键盘中断和串行通信接口(SCI)的章节;3熟悉AW60键盘模块的工作方法及编程;4熟悉LED数码块原理及动态显示编程;4根据实验内容要求编写好程序,为实验做充分地准备。三实验设备及其连接1PC机一台2飞思卡尔嵌入式实验开发系统一台3串行通信线一根四实验内容1理解并运行按键扫描及键值键码发送样例程序(将按键的键值及键码从串行口发送到PC机端的串口工具软件);采用键盘中断方式。PTD7,3,2及PTG4接键盘4根列线,PTG3-0接键盘4根行线。要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示,(键的ASCII码值)。2理解并运行LED数码块样例程序(在LED数码块上显示“2012”);3参考按键及LED数码块样例程序,设计一个按键显示程序,将按键的键码在LED数码块上显示。7段LED显示字型码显示字符hgfedcba字型码共阴极共阳极001111113FC01000011006F9210110115BA4310011114FB0411001106699511011016D92611111017D827000011107F8811111117F80911011116F90A11101117788B11111007C83C011100139C6D10111105EA1E11110017986F1110001718E五编程提示1利用构件式方法编程,可以使程序结构清晰,可移植性好,但要注意建立相关的头文件;2矩阵式键盘采用扫描法来确定哪一个键被按下,键盘的接口硬件确定后,每个键的键值就确定了,但每个键的键码可以根据需要定义;键的标示码(键码)与键值对应关系通过列表对应起来,通过“行扫描”法获得某个键的键值时,通过查表法就可以得到它的定义值。3PTD7,3,2及PTG4-PTG0与键盘中断输入引脚复用,设置键盘中断允许寄存器,当键盘有键被按下时,立即产生中断,中断程序处理按键事件,比如确定哪个键被按下,然后转换为该键的定义值。4键盘扫描处理程序中的“消抖”及按键重复响应通过延时及判断按键是否被释放解决。六实验报告要求1按实验报告格式认真完成实验报告,要求画出总体流程图;2本实验中用的是键盘中断编程方式,也可以使用查询编程方式,请尽量少修改代码改用查询编程方式重新编写相应的子程序和主程序。提示:注意重键问题。思考题:1矩阵式键盘的行线及列线的特点与作用?2如何消除键盘抖动及按键重复响应?3AW60的键盘中断模块用行扫描方式最多能够实现几列的键盘?七参考例程:1按键处理程序main.c#include Includes.hvoid main(void) DisableInterrupts; /禁止总中断 MCUInit();/芯片初始化 SCI1Init(SYSTEM_CLOCK,9600);/用SCI1,系统时钟为时钟源,波特率为9600 KBInit(); / 键盘初始化 KBI1SC |=(11); / 开键盘中断 EnableInterrupts; / 开总中断 while (1) / 主循环 总头文件Includes.h#include MC9S08AW60.h /映像寄存器地址头文件 #include Type.h /类型别名定义 #include GeneralFun.h /通用函数头文件 #include /* for EnableInterrupts macro */ /1.2 包含面向硬件对象头文件 #include SCI.h /该头文件包含SCI串行通信函数声明 #include Keyboard.h /该头文件包含键盘函数声明 #define SYSTEM_CLOCK 20 /系统总线频率(MHz) /4 函数声明 void MCUInit(void); /AW60芯片初始化数据类型重定义头文件Type.h #ifndef TYPE_H /防止重复定义#define TYPE_Htypedef unsigned char uint8; / 8 位无符号数typedef unsigned short int uint16; / 16 位无符号数typedef unsigned long int uint32; / 32 位无符号数typedef char int8; / 8 位有符号数typedef short int int16; / 16 位有符号数 typedef int int32; / 32 位有符号数 #endif 串行口构件程序文件SCI.c #include SCI.h void SCI1Init(uint8 sysclk,uint16 baud) unsigned int ubgs=0; /1.计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk*1000000) ubgs = sysclk*(10000/(baud/100)/16; SCI1BDH= (unsigned char)(ubgs & 0xFF00) 8); SCI1BDL= (unsigned char)(ubgs & 0x00FF); SCI1C1= 0; /无校验,正常模式(开始信号 + 8位数据(先发最低位) + 停止信号) SCI1C2= (0 | SCI1C2_TE_MASK | SCI1C2_RE_MASK ); /允许发送,允许接收,查询方式收发 void SCI1Send1(unsigned char ch) while(!(SCI1S1 & SCI1S1_TDRE_MASK);/判断发送缓冲区是否为空 SCI1D = ch; void SCISendString(char *p) word k; if(p = 0) return; for(k = 0; pk != 0; +k) SCI1Send1(pk); 按键处理构建程序文件Keyboard.c文件#include Keyboard.h #include GeneralFun.h /初始化键盘模块void KBInit(void) PTDD &= 0b01110011; /键盘口复位 PTGD &= 0b11100000; PTDDD &= 0b01110011; /定义列线(7-4位)为输入 PTGDD &= 0b11101111; PTDPE |= 0b10001100; /输入引脚(列线)有内部上拉电阻 PTGPE |= 0b00010000; PTGDD |= 0b00001111; /行线(3-0位)为输出 KBI1SC &=(11); /屏蔽键盘中断(KBIE = 0) KBI1PE = (0 |KBI1PE_KBIPE7_MASK |KBI1PE_KBIPE6_MASK |KBI1PE_KBIPE5_MASK |KBI1PE_KBIPE4_MASK); /允许输入引脚(列线)的中断可进入 KBI1SC = (0 |KBI1SC_KBACK_MASK); /清除键盘中断请求(KBACK = 1) /N次扫描模块:N次扫描键盘,消除抖动问题uint8 KBScanN(uint8 KB_count) uint8 i,KB_value_last,KB_

温馨提示

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

评论

0/150

提交评论