单片机原理与应用技术实验指导书(v2.3)_第1页
单片机原理与应用技术实验指导书(v2.3)_第2页
单片机原理与应用技术实验指导书(v2.3)_第3页
单片机原理与应用技术实验指导书(v2.3)_第4页
单片机原理与应用技术实验指导书(v2.3)_第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灯现象 第 3 页 图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.inc MyCode: SECTION ; this assembly routine is called the C/C+ application asm_main: JSR MCUInit JSR Switch_Init JSR Light_Init M_Scan: JSR Switch_Read LDA $70 CMP #$01 BNE M01 LDA #0 GN D Vcc 拨码开关 导线接插点 JSR Light_On_Off LDHX #$0fff JSR DelayHX LDA #1 JSR Light_On_Off LDHX #$0fff JSR DelayHX BRA M_Scan M01: CMP #$02 BNE M02 JSR Light_Half LDHX #$0fff JSR DelayHX M02: BRA M_Scan RTS ; return to caller 2、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 $00 Loff: equ $ff Ldiff: equ $0f ;声明外部函数 XDEF Light_Init ;小灯初始化 XDEF Light_On_Off ;驱动小灯“ 亮“,“ 暗“ XDEF Light_Half ;驱动小灯“四亮“,“四灭“ ;Lightinit:定义控制小灯的MCU引脚为输出-* ;功能:定义控制小灯的MCU引脚为输出, 并使小灯初始为暗 * ;-* Light_Init: LDA #$FF STA Light_P ;设置初始时八个LED灯全灭 LDA #$FF STA Light_D ;设置LED所接PTB口为输出 第 5 页 RTS ;Light_On_Off:驱动小灯“亮“,“灭“-* ;功能:根据A 的值控制小灯的亮和暗 * ;-* Light_On_Off: CMP #0 BNE Light_1 LDA #Lon STA Light_P BRA Light_Exit Light_1: CMP #1 BNE Light_Exit ;入口非L/A,程序无响应 LDA #Loff STA Light_P Light_Exit: RTS ;Light_Half:驱动小灯 “四亮“,“四灭“-* ;功能:根据A 的值控制小灯的亮和暗 * ;-* Light_Half: LDA Light_P CMP #Ldiff BNE Light_half1 LDA #Ldiff STA Light_P BRA L_exit Light_half1: LDA #Ldiff STA Light_P L_exit: RTS 3、拨动开关控制程序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 RTS 4、延时通用程序DelayHX.asm XDEF DelayHX DelayHX: PSHA ;A进栈(保护寄存器A) CPX #0 ;X变址寄存器中的值是否为0 BEQ DelayHX_Exit DelayHX_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: 第 7 页 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进行调试时都有哪些方法?在调试过程中可以观察到什么与程序相关的要素? 第 9 页 实验二 串口通信(SCI)实验 一、实验目的: 1进一步熟悉嵌入式开发系统环境、汇编、C语言、调试方式。 2加强串口通信(SCI)基本原理及编程原理的理解。 3理解C语言工程结构,掌握运用08C建立工程的方法。 4分别运用查询方式、中断方式实现通信。 二、实验要求: 1仔细阅读本实验指导书。 2复习有关的串行通信(SCI)的章节 3熟悉AW60串行通信(SCI)的工作方法及编程。 4根据实验内容要求编写好程序,为实验做充分地准备。 实验原理图如下: 三实验设备及其连接 1PC机 一台 2飞思卡尔嵌入式实验开发系统 一台 3串行通信线 一根 4万用表 一只 四实验内容 1理解串行通信(SCI)原理。 2理解及掌握本实验的样例工程: 4 1 2 3 5 6 7 8 9 232 电 平 OUT IN MAX232CPE 16 15 14 13 12 11 10 9 1 2 3 4 5 6 7 8 +5V GND +5V TTL 电 平 OUT IN TTL 电平 转为 232 电 平 14 4 1 2 3 5 6 7 8 9 PC 4 1 2 3 5 6 7 8 9 4 1 2 3 5 6 7 8 9 RxDTxD 先通过串口向外发送一个字符串,等待从串口接收信息,以中断方式的接收信息,当接收到的信息 为“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!“字符串 第 11 页 /= #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 SCI1BDL=(byte)(Mbaud 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 SCI1D=Sch; 4.Light构件控制程序Light.c /= /构件名称: light.c /构件组成:Light_Init LED初始化 第 13 页 / 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 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;j /* 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_H typedef 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 SCI1BDL= (unsigned char)(ubgs SCI1C1= 0; /无校验,正常模式(开始信号 + 8位数据(先发最低位) + 停止信号) SCI1C2= (0 | SCI1C2_TE_MASK | SCI1C2_RE_MASK ); /允许发送, 允许接收,查询方式收发 void SCI1Send1(unsigned char ch) while(!(SCI1S1 /判断发送缓冲区是否为空 SCI1D = ch; void SCISendString(char *p) word k; if(p = 0) return; 第 21 页 for(k = 0; pk != 0; +k) SCI1Send1(pk); 按键处理构建程序文件Keyboard.c文件 #include “Keyboard.h“ #include “GeneralFun.h“ /初始化键盘模块 void KBInit(void) PTDD /键盘口复位 PTGD PTDDD /定义列线(7-4位) 为输入 PTGDD PTDPE |= 0b10001100; /输入引脚(列线) 有内部上拉电阻 PTGPE |= 0b00010000; PTGDD |= 0b00001111; /行线(3-0位) 为输出 KBI1SC /确定本次按键键码显示在第一行还是第二行 else Ramaddr=bi+0x00; Ramaddr|=0b10000000; /合成要写入的 DDRAM地址 LCD_RS_WR / LCD_RS_WR / LCDcommand(Ramaddr); /设置DDRAM 地址 LCD_RS_WR|=LCD_RS_MASK; / LCD_RS_WR / LCDcommand(KBDef(value); /向设置的DDRAM地址写入键值 bi+; /按键序次加一 if (bi=32) bi=0; /如果有效按键达到33次, 序次bi归零 PTDD PTGD/0b11101111; /键盘初始化键盘中断 KBI1SC |=(1 #include “MC9S08AW60.h“ #include “Type.h“ #include “TPM.h“ #include “Generalfun.h“ void MCUInit(void); /需要定义及赋初值的全局变量不能在头文件中定义, 在main.c中定义 /并赋初值,同时在其使用的函数中或函数对应头文件中声明 extern uint8 B0=0; void main(void) DisableInterrupts; MCUInit( ); PTBD=0xff; PTBDD /LED_SwitchInit; PTBDD|=0b00000001; PTBPE|=0b00000110; TPM1Init(); TPM1ChInit(); EnableInterrupts; while(1) Butt_proc(); if (B0=1) Led_Flash(); 2TPM.C文件 / TPM1初始化函数设置模块的时钟源, 分频及模数寄存器数值 / TPM1通道初始化函数,设置各通道的工作模式, 电平方式,中断允许开关 #include “TPM.h“ void TPM1Init(void) TPM1SC=(0|TPM1SC_CLKSA_MASK TPM1SC_PS2_MASK|TPM1SC_PS1_MASK|TPM1SC_PS0_MASK); /TPM1不允许溢出中断, 时钟源选择系统时钟(20MHZ), 分频因子128 TPM1MODH=0x7A; TPM1MODL=0x12; /根据时钟源及分频因子 ,将TPM1的定时周期设定为200ms TPM1CNTH=0x00; TPM1CNTL=0x00; /模块计数器清零 void TPM1ChInit(void) /设置通道0 允许中断 ,输入捕捉, 捕捉上升沿; /设置通道1不允许中断, 输出比较,初始通道无动作仅软件比较 TPM1C0SC=0|TPM1C0SC_CH0IE_MASK|TPM1C0SC_ELS0B_MASK |TPM1C0SC_ELS0A_MASK; TPM1C1SC=0|TPM1C1SC_MS1A_MASK; TPM1C1VH=0x3A; /设置通道动作时间 TPM1C1VL=0x12; 第 47 页 void Butt_proc(void) uint8 temp,temp1; temp=(PTBD/读两个拨动开关 temp=temp #include “MC9S08AW60.h“ #include “Type.h“ extern uint8 B0; interrupt 5 void TPM1Cho_isr(void) uint8 temp; DisableInterrupts; B0=0x01; temp=TPM1C0SC; TPM1C0SC EnableInterrupts; 4通用程序文件General.c void Delay(uint16 count) uint16 i,j; for(j=0; j5) CHn=5; switch(CHn) case 0:TPM1C0SC=0b00110100;break; case 1:TPM1C1SC=0b00110100;break; case 2:TPM1C2SC=0b00110100;break; case 3:TPM1C3SC=0b00110100;break; case 4:TPM1C4SC=0b00110100;break; case 5:TPM1C5SC=0b00110100;break; void TPM1PWMRun(uint8 CHn,uint8 percent,uint16 ModP) uint16 duty,MP; uint8 dutyH,dutyL; MP=ModP ; TPM1SC=0x00; TPM1CNTH=0x00; TPM1CNTL=0x00; TPM1MODL=(uint8)(ModP); TPM1MODH=(uint8)(ModP8); duty=(uint16)(MP/100)*percent); dutyL=(uint8)(duty); dutyH=(uint8)(duty8); if (CHn5) CHn=5; switch(CHn) case 0: TPM1C0VH=dutyH;TPM1C0VL=dutyL;TPM1C0SC=0b00111100;break; case 1: TPM1C1VH=dutyH;TPM1C1VL=dutyL;TPM1C1SC=0b00111100;break; case 2: TPM1C2VH=dutyH;TPM1C2VL=dutyL;TPM1C2SC=0b00111100;break; case 3: TPM1C3VH=dutyH;TPM1C3VL=dutyL;TPM1C3SC=0b00111100;break; case 4: TPM1C4VH=dutyH;TPM1C4VL=dutyL;TPM1C4SC=0b00111100;break; case 5: TPM1C5VH=dutyH;TPM1

温馨提示

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

评论

0/150

提交评论