




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 提高实验5.1 内部时钟源1.实验目的体验总线时钟的变化,通过修改系统时钟寄存器,改变总线时钟频率,进而改变LED1与LED2的闪烁频率。2.实验内容输入以下程序,观察实验现象。#include /* 中断 */#include “derivative.h” /* 外设定义 */void delay(unsigned int cnt) unsigned int i,j; for(i=0;i=cnt;i+) for(j=0;j200;j+) asmnop void main(void) unsigned char cnt1=0,cnt2=0; /*EnableInterrupts; */ SOPT1 = 0x43; /*SOPT2 = 0x0; */ PTBDD = 0xff; for(;) if(cnt1+%10) = 0) cnt2+; ICSC2 = (cnt2%4)*64; PTBD_PTBD6 = 1; delay(200); PTBD_PTBD6 = 0; delay(200); /*_RESET_WATCHDOG();*/ 5.2 汇编编程1.实验目的学习使用汇编与联接小工具,了解程序下载的具体流程。2.实验内容 手工汇编一段代码,手工输入并运行,输出一些“A” 读取状态图5-1 流程图汇编程序:ORG $100OUTA LDA $24AND #$80BEQ OUTALDA #ASTA $27JMP OUTA编译后的代码:0100 B6 24 0102 A4 80 0104 27 -6(FA) 0106 A6 41 0108 B7 27 010A CC 01 00 步骤:(1)在codewarrior中新建一个asm工程;(2)查看汇编后的代码;(3)使用汇编与联接小工具,手工操作;(4)观察生成的s19文件。MY_ZEROPAGE: SECTION SHORT ; Insert here your data definitionCNT DS.B 1main:_Startup: MOV #$FF,PTBDDmainLoop: MOV #$7F,PTBD LDA #255LOOP1: MOV #255,CNT DBNZ CNT,* DBNZA LOOP1 MOV #$BF,PTBD LDA #255LOOP2: MOV #255,CNT DBNZ CNT,* DBNZA LOOP2 BRA mainLoop 汇编后生成的下载文件S05B0000433A5C446F63756D656E747320616E642053657474696E67735C41646D696E6973747261746F725CD7C0C3E65C667265657363616C65CFC4C1EED3AA5CBBFAC6F7BBE3B1E0CAB5C0FD5C61686330385C6368656E2E70726D97S123E000A6FFB7036E7F02A6FF6EFF603B60FD4BF86EBF02A6FF6EFF603B60FD4BF820E4E1S105FFFEE0001DS903E0001C3. 汇编与联接小工具的使用方法ahc08.exe, linker.exe, hiwave.exe 的使用需要指定一个目录( project directory,current directory ),在该目录中新建一个*.ini的文件,以保存配置信息,同时这些工具需要使用的输入和输出文件也应该放在该指定的目录下,或者指定包含目录。配置信息如下。Global: 所有工具和工程共同使用的配置信息,比如最近使用的工程名单等等。保存在文件 mcutools.ini 中。(a) progmcutools.ini (如果ahc08.exe等工具在prg目录下启动,则使用该目录下的ini文件)(b)c:windowsmcutools.ini(在其它地方启动工具)Local: 针对某个项目的配置文件。(1)ahc08.exe 的使用(a)打开ahc08.exe,新建配置并保存;project.ini。(b)拷贝源文件到新建目录;main.asm & derivative.inc。(c)对ASM文件汇编,会发现找不到文件,因为derivative.inc中又包含了MC90S08QG8.INC,需要指定包含目录。图 5-2 配置目录(2)linker.exe的使用(a)打开linker.exe,打开配置并保存;project.ini(b)linker的输入文件: 1assembler&compiler产生的object-code文件; 2library files; 3linker PRM 文件。(c)观察ide下的prm文件内容;(d)一个比较完整的linker prm文件; LINK *.abs NAMES *.o END SEGMENTS END PLACEMENTEND STACKSIZE0x50 VECTOR 0_Startup(e)linker的输出文件:Project.abs, Project.abs.s19, Project.map。一个比较完整的linker prm中的内容如下所示。LINK chen.absNAMES main.o END /* CodeWarrior will pass all the needed files to the linker */SEGMENTS /* PLACEMENT 要用的区域定义 */ Z_RAM = READ_WRITE 0x0060 TO 0x00FF; RAM = READ_WRITE 0x0100 TO 0x025F; ROM = READ_ONLY 0xE000 TO 0xFFAD; ROM1 = READ_ONLY 0xFFC0 TO 0xFFCF;ENDPLACEMENT DEFAULT_RAM /* non-zero page variables */ INTO RAM; _PRESTART, /* startup code */ STARTUP, /* startup data structures */ ROM_VAR, /* constant variables */ STRINGS, /* string literals */ VIRTUAL_TABLE_SEGMENT, /* C+ virtual table segment */ DEFAULT_ROM, COPY /* copy down information: how to initialize variables */ INTO ROM; _DATA_ZEROPAGE, /* zero page variables */ MY_ZEROPAGE INTO Z_RAM;ENDSTACKSIZE 0x50VECTOR 0 _Startup Ide中linker prm文件的指定图 5-3 prm文件指定示意图(3)hiwave.exe的使用Simulator/Debugger工具(a)运行hiwave.exe(b)component/set connection 选择调试连接(c)file/load Application(d)找到link产生的*.abs文件图 5-4 调试示意图5.3 中断5.3.1 汇编使用范例:RTI的使用1.实验目的熟悉汇编条件下中断入口的使用方法,学习了解RTI中断的使用。2.实验内容产生中断则LED闪烁。(1)新建一个汇编工程;(2)在XDEF后面添加标号RT_ISR, XDEF _Startup, main,RT_ISR;(3)在中断全局允许前,添加一点初始化代码: MOV #$FF,PTBDD ;定义输出 LDA #$16 ;允许RT中断,时间间隔512ms STA SRTISC ;设置RTI CLI ; enable interrupts(4)编写中断子程序,让LED闪烁RT_ISR: LDA PTBD EOR #$FF; STA PTBD LDA #$56 ;清除标志 STA SRTISC; RTI(5)修改PRM文件,添加RT_ISR说明VECTOR 23 RT_ISR VECTOR ADDRESS 0xffd0 RT_ISR 注意,和51系列单片机不同的是,MC9S08QG8单片机中断入口一般不能放在中断程序之前,而是放在只有两字节的跳转指令前。5.3.2 C使用范例:IRQ管脚的使用1.实验目的熟悉C语言编程时中断入口的使用方法,学习了解IRQ中断的使用。2.实验内容产生中断LED1亮灭两次。(1)新建一个c工程;(2)在打开中断允许之前添加4行初始化: SOPT1 = 0x02; /* 禁止 COP、STOP and RST*/ IRQSC = 0x16; /* 允许IRQ管脚,允许IRQ中断,下降沿触发*/ PTBDD = 0xFF; /* PTB输出*/ PTBD = 0xFF; /* 关闭LED*/ EnableInterrupts; /* enable interrupts */(3)添加中断服务子程序、延时子程序interrupt 2 void IRQ_ISR() unsigned char i; for(i=0;i200;i+); /*延时*/ while(!PTAD_PTAD5); /*等待按键释放*/ PTBD_PTBD6 = 0; /*LED亮*/ delay(500); /*延时*/ PTBD_PTBD6 = 1; /*LED灭*/ delay(500); PTBD_PTBD6 = 0; /*亮、灭两次*/ delay(500); PTBD_PTBD6 = 1; IRQSC = 0x16; /*清除标记,缺乏将不停*/ void delay(unsigned int ms) unsigned int i; unsigned int j; for(j= 0;jms;j+) for(i = 0;i200; i+) 5.3.3 KBI的使用1.实验目的熟悉KBI和RTI中断的使用及配合使用的方法。2.实验内容按SW1时,LED1和LED2亮灭1次;按SW2时,LED1和LED2亮灭2次;按SW1和SW2时,LED1和LED2亮灭3次; unsigned char LedOnOffCnt;SOPT1 = 0x03; PTBDD = 0xFF; PTBD = 0xFF; SRTISC = 0x56; /*kbi init*/ KBISC = 0x04; /*禁止kbi中断*/ KBIES = 0; /*PTAPE = 0x0C; */ KBIPE = 0x0C; KBISC = 0x04; /* 清除标志*/ KBISC = 0x06; /*允许中断*/ EnableInterrupts; /* enable interrupts */interrupt 18 void KBI_ISR() unsigned char KbStatus; unsigned int delay; for(delay = 0;delay5000;delay+) KbStatus = PTAD; KbStatus &= 0x0c; /* 取出两位*/ if(KbStatus = 0x08) /* sw1*/ LedOnOffCnt = 2; else if(KbStatus = 0x04) /*sw2*/ LedOnOffCnt = 4; else if(KbStatus = 0x0) /*sw1 & sw2*/ LedOnOffCnt = 6; elseLedOnOffCnt = 0;KBISC = 0x06; /*允许中断,清除标志*/interrupt 23 void RTI_ISR() if(LedOnOffCnt!=0) /*freeze cnt=0 */ PTBD =0xff; /*change LED status*/ LedOnOffCnt-; SRTISC = 0x56; /*清除标志*/5.4 SCI串口5.4.1 简单接发字符1.实验目的了解单片机通过串口与pc机通信2.实验内容接收字符子程序:char RecChar() byte rec_char; if (SCIS1_RDRF) /*清除RDRF*/ rec_char = SCID; /* 清除RDRF第二步*/ SCIC2_RE = 1; /* enable Rx*/ while(!SCIS1_RDRF) /*feedCOP();*/ ; rec_char = SCID; /* get recieved character*/ SendChar(rec_char); /*echo received character*/ return SCID; /*end RecChar发送子程序:void SendMsg(char msg) byte ix=0; /* String pointer*/ byte dummy; /* 读取SCIS1*/ byte nxt_char; SCIC2 = 0x08; /* enable Tx*/ dummy = SCIS1; /*清除TDRE*/ nxt_char = msgix+; while(nxt_char != 0x00) SCID = nxt_char; /* 清除TDRE第二步*/ nxt_char = msgix+; while(!SCIS1_TDRE) /*feedCOP();*/ ; /*delay(30); /*end while(SCI1D while(!SCIS1_TC) /*feedCOP();*/ ; SCIC2_TE = 0; /*end SendMsg*/5.4.2 与超级终端通信界面的构建1.实验目的了解单片机与超级终端通信的过程2.实验内容声明三个基本函数。void SendChar(char s_char); char RecChar();void SendMsg(char msg)开机显示Welcome to the MC9S08QG8 SCI Application Select Menu: 1: LED On-Off one time2: LED On-Off five times3: LED On-Off always4: LED Freezenumber to execute: 根据选择的数字,执行相应的功能, 可以使用RTI 。实验步骤:(1)新建一个C工程;(2)在中断允许之前,增加初始化代码,同时声明全局变量LedOnOffCntPTBDD = 0xFF; SOPT1 = 0x03; /*stop COP,Enable RST*/ SCIBD = 4000000/16/9600; SRTISC = 0x16; /*允许RTI中断,周期512ms*/ LedOnOffCnt = 0;(3)在for死循环之前添加显示界面与菜单SendMsg(f Welcome to the MC9S08QG8 SCI Applicationrn); SendMsg(Select Menu:rn); SendMsg( 1: LED On-Off one timern); SendMsg( 2: LED On-Off five timesrn); SendMsg( 3: LED On-Off alwaysrn); SendMsg( 4: LED Freezern); SendMsg(number to execute: );(4)在for死循环里面添加读取串口输入的switch case 结构switch (RecChar() case 0x31 : LedOnOffCnt = 2; /*亮灭1次*/ SendMsg(rnnumber to execute: ); break; case 0x32 : LedOnOffCnt = 10;/*亮灭5次*/ SendMsg(rnnumber to execute: ); break; case 0x33 : LedOnOffCnt = 20;/*一直亮灭*/ SendMsg(rnnumber to execute: ); break; case 0x34 : LedOnOffCnt = 0; /*停止*/ SendMsg(rnnumber to execute: ); break; default: SendMsg( Invalid selection); SendMsg(rnnumber to execute: ); break; /*end switch*/(5)最后添加RTI中断服务子程序,根据LedOnOffCnt的数值,决定亮灭次数。interrupt 23 void RTI_ISR() if(LedOnOffCnt!=0) /*freeze when cnt=0 */ PTBD =0xff; /*change LED status*/ if(LedOnOffCnt=10) /*if not always*/ LedOnOffCnt-; SRTISC = 0x56; /*清除标志*/(6)在主程序之前添加SCI的三个基本函数/*/*/*发送字节void SendChar(char s_char) byte dummy; /*读取SCIS1的临时单元*/ SCIC2 = 0x08; /* 允许Tx*/ dummy = SCIS1; /*清除TDRE*/ SCID = s_char; /*清除TDRE第二步*/ while(!SCIS1_TDRE) /*feedCOP();*/ ; while(!SCIS1_TC) /*feedCOP();*/ ; SCIC2_TE = 0; /*end SendChar*/*接收字节char RecChar() byte rec_char; if (SCIS1_RDRF) /*清除RDRF*/ rec_char = SCID; /* 清除RDRF第二步*/ SCIC2_RE = 1; /* enable Rx*/ while(!SCIS1_RDRF) /*feedCOP();*/ ; rec_char = SCID; /* get recieved character*/ SendChar(rec_char); /* echo received character*/ return SCID; /*end RecChar*/*发送字符串*/void SendMsg(char msg) byte ix=0; /* String pointer*/ byte dummy; /* 读取SCIS1*/ byte nxt_char; SCIC2 = 0x08; /* enable Tx*/ dummy = SCIS1; /* 清除TDRE*/ nxt_char = msgix+; while(nxt_char != 0x00) SCID = nxt_char; /* 清除TDRE第二步*/ nxt_char = msgix+; while(!SCIS1_TDRE) /*feedCOP();*/ ; /*delay(30); */ /*end while(SCI1D*/ while(!SCIS1_TC) /*feedCOP();*/ ; SCIC2_TE = 0; /*end SendMsg*/5.5 定时器5.5.1 MTIM的使用1.实验目的掌握MTIM的使用方法2.实验内容(1)在中断允许之前添加初始化PTBDD = 0xFF;PTBD = 0xFF;SOPT1 =0x03;MTIMSC = 0x70; /*IE,RST,STOP*/MTIMCLK = 0x08; /*Fbus/256*/MTIMMOD = 125; /*400000 = 256*125*125*/MTIM_CNT = 125;/*定义一个全局变量,软分频*/MTIMSC = 0x40; /*START*/(2)添加中断服务子程序interrupt 12 void MTIM_ISR() if(-MTIM_CNT=0) MTIM_CNT = 125; PTBD = 0xFF; MTIMMOD = 125; /*清除标志 */(3)添加全局变量byte MTIM_CNT;5.5.2 TPM的使用1.实验目的掌握TPM的使用方法2.实验内容(1)TPM软件定时器应用 如果不考虑输入捕捉、输出比较、PWM这三种需要外部管脚配合的情形,TPM的应用还是很简单的,因为此时不用考虑2个独立通道,也不用设置TPMCnSC、 ( TPMCnVH:TPMCnVL )这6个寄存器。(a)初始化PTBDD = 0xFF;PTBD = 0xFF;SOPT1 =0x03;TPMMOD = 31250; /*4000000 = 31250 * 128*/TPMSC = 0x4F; /*允许中断,总线时钟128分频*/(b)中断子程序interrupt 7 void TPM_ISR() PTBD = 0xFF; TPMSC = TPMSC&0x7F;(2)TPM输入捕捉(a)添加的全局变量unsigned char n_str6;(b)中断允许前添加初始化代码:SOPT1 = 0x03; /*stop COP,Enable RST*/SCIBD = 4000000/16/9600;TPMSC = 0x0f; /*禁止溢出中断,自由加法计数,Fbus/128*/TPMC0SC = 0x4c; /*允许捕捉中断,上升沿和下降沿捕捉*/SendMsg(fThe TPMs Current Counter Value = );interrupt 5 void TPM_CH0_ISR() unsigned int n; n = TPMC0VH*256 + TPMC0VL;/*读取TPM捕捉的数值,然后转换成ASCII字符串*/ n_str0 = (n/10000) + 0x30;n_str1 = (n%10000)/1000 + 0x30 ; n_str2 = (n%1000)/100 + 0x30; n_str3 = (n%100)/10 + 0x30; n_str4 = (n%10) + 0x30; n_str5 = 0; SendMsg(n_str); /*发送字符串*/ SendMsg(rnThe TPMs Current Counter Value = ); TPMC0SC = TPMC0SC&0x7F; /*清除标志*/TPM输入捕捉电路,调节电位器,产生捕捉条件。图5-5 TPM捕捉电路图5.6 AD转换应用范例1.实验目的熟悉AD转换的使用方法2.实验内容(1)实验电路图如图5-6所示。通道0对应电位器,通道1对应光敏电阻。图5-6 实验电路图(2)中断允许前的初始化SOPT1 = 0x03; /*stop COP,Enable RST*/SRTISC = 0x46; /*disable int,512ms*/SCIBD = 4000000/16/9600;ADCCFG =0x18; /*配置为高速、1分频、长采样、10位、总线时钟 */ ADCSC2 =0x40; /*RTI 硬件触发,禁止比较*/ADCSC1 =0x40; /*允许中断,单次转换,通道0 */APCTL1 =0x03; /*管脚ADPC0,ADPC1作为模拟输入*/SendMsg(“fThe Ad-Value of ch0,ch1 = );(3)Ad转换完成中断程序interrupt 19 void AD_ISR() unsigned int ad; ad = (ADCRH&0x03)*256 + ADCRL; SendMsg(int_str(ad);/*发送ASCII串*/ SendMsg(,); ADCSC2 =0x0; /*软件触发,禁止比较*/ ADCSC1 =0x01; /*禁止中断,单次,通道1 */ while(ADCSC1_COCO!=1) _RESET_WATCHDOG(); /*等待转换完成*/ ad = (ADCRH&0x03)*256 + ADCRL; SendMsg(int_str(ad); /*发送通道1结果*/ SendMsg(rnThe Ad-Value of ch0,ch1 = ); ADCSC2 =0x40; /*RTI 硬件触发,禁止比较;*/ ADCSC1 =0x40; /*允许中断,单次,通道0 */(4)定义全局变量unsigned char n_str5;(5)将int数据转换成ASCII字符串unsigned char * int_str(unsigned int n) n_str0 = (n/1000) + 0x30; n_str1 = (n%1000)/100 + 0x30 ; n_str2 = (n%100)/10 + 0x30; n_str3 = (n%10) + 0x30; n_str4 = 0; return n_str; 5.7 ACMP应用范例1.实验目的熟悉ACMP的使用方法2.实验内容(1)模拟比较器内部结构如图5-7所示。图5-7 模拟比较器内部结构实验电路图如图5-6所示。其中ACMP+对应电位器,ACMP-对应光敏电阻。(2)实验要求RTI设置成512ms一次中断,A/D设置成软件触发方式,比较器设置成禁止输出、禁止中断。在RTI的中断里进行两次A/D转换,分别对应通道0和1。将2次的A/D转换结果,以及比较器的比较结果ACO输出到串口。(3)中断前的初始化SOPT1 = 0x03; /*stop COP,Enable RST*/ SCIBD = 4000000/16/9600; SRTISC = 0x56; /*Enable int,512ms*/ ADCCFG =0x18; /*配置为高速、1分频、长采样、10位、总线时钟 */ ADCSC2 =0x0; /*软件触发,禁止比较*/ /*ADCSC1 =0x40; /*允许中断,单次转换,通道0 */ APCTL1 =0x03; /*管脚ADPC0,ADPC1作为模拟输入*/ ACMPSC = 0xA0; /*禁止输出,禁止中断*/ SendMsg(“fA/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 葡萄酒知识培训题课件
- 常州期末考试化学试卷及答案
- 常熟融媒招聘考试题库及答案
- 茶艺基础期末考试及答案高一
- 2025普通员工合同协议书
- 2025权益代理委托合同
- 残疾人护理实操考试题及答案
- 2024人教版七年级生物下册期末复习知识点提纲(填空版+答案版)
- 2025年舞蹈理论知识考试题库
- 2025年料位传感器项目建议书
- 高原病的预防与适应
- 马克思主义政治经济学第7章剩余价值的分配
- 成品出货检验报告模板
- 2023年中考语文一轮复习:语段综合专项练习题汇编(含答案)
- 香豆素抗凝血药华法林及其类似物的合成
- 长江上游黄河上中游地区天然林资源保护工程实施方案
- GB/T 5453-1997纺织品织物透气性的测定
- GB/T 14315-2008电力电缆导体用压接型铜、铝接线端子和连接管
- 农民工工资表(模板)
- 《室内空间设计》第三章课件
- 学习《北方民族大学学生违纪处分规定(修订)》课件
评论
0/150
提交评论