嵌入式系统实训教程.doc_第1页
嵌入式系统实训教程.doc_第2页
嵌入式系统实训教程.doc_第3页
嵌入式系统实训教程.doc_第4页
嵌入式系统实训教程.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统实训教程马兴录2013-03-18目录第1章 单片机实验教程11.1 单片机开发环境的搭建11.1.1 单片机开发环境介绍11.1.2 单片机开发环境的搭建11.1.3 联机调试31.1.4 练习41.2 单片机联机调试功能试验51.2.1 观察各类存储单元51.3 单片机定时器实验71.3.1 实验目的71.3.2 设计要求71.3.3 实验原理71.3.4 实验步骤71.3.5 常见问题81.3.6 练习81.4 单片机中断系统实验91.4.1 实验目的91.4.2 设计要求91.4.3 实验原理91.4.4 实验步骤101.4.5 练习131.5 简单交通灯控制系统的设计141.5.1 实验目的141.5.2 实验要求141.6 单片机串行通讯接口实验141.6.1 实验目的141.6.2 实验要求141.6.3 实验原理1422第1章 单片机实验教程1.1 单片机开发环境的搭建本节目标:搭建Keil C51单片机编程开发环境,以及Proteus仿真环境,实现两者的联机调试。1.1.1 单片机开发环境介绍目前,51单片机的开发大都使用C51编程语言,基本不再使用汇编语言。这大大简化了单片机应用程序的开发。当前使用最多的开发环境是Keil C51。目前最高版本为uVision 4,除支持51系列单片机外,还可支持大多数的ARM芯片。Keil开发环境本身带有模拟器,可以模拟调试单片机应用程序。也可以与Proteusl联合实现软硬件联调,达到更好的仿真效果。Protues是硬件线路板的设计开发软件,用来设计硬件线路连接原理图及印刷电路板图等,是常用的硬件线路版设计软件。同时,它还具有较强的硬件仿真能力,可以形象直观地仿真硬件的运行情况,特别是它可以仿真多种常见的处理器,允许给处理器提供相应的程序并仿真运行。因此目前最为流行的单片机学习及开发环境是Keil C51 + Proteus。1.1.2 单片机开发环境的搭建本文以Proteus 7.5和Keil uVision 2为例来搭建51单片机的开发环境。(1) 安装Keil uVision2。(安装完后,要将补丁文件复制到keilC51bin文件夹内)(2) 安装Ptoteus 7.5。(安装crack时,要关闭杀毒软件;Keil驱动要等安装完Keil之后再安装)上述两软件均安装在默认文件夹内。Proteus安装在C:Program FilesLabcenter Electronics文件夹内,Keil安装在c:keil文件夹内。如果只使用keil编写C51应用程序,编译生成可执行文件(后缀为.hex)供Proteus使用,则两个软件无需配置,各自独立使用即可,以下步骤则无需进行。如想实现Keil与Proteus的联机调试功能,则需要进行如下配置:(1)运行Proteus软件包内的 Keil驱动vdmagdi.exe ,将驱动安装到keil的文件夹内。安装时,选择“AGDI Driver for uVision2”,然后选择安装目录为c:keil即可。(2)运行ISIS 7 Professional菜单Debug(调试),选中Use Remote Debug Monitor(使用远程调试监控),该选项前应该有“”。(3)创建或打开Keil C的工程后,选择菜单Project-Options for Target Target 1 ,打开Options for Target Target 1 窗口后,选择Debug选项卡,选择右边的Use:Proteus VSM Simulators,确定,如下图所示:图1 Keil工程的调试选项(4) 确保keil生成的可执行文件与proteus项目中单片机所执行的文件为同一个文件。Keil的输出配置:如输出文件名为ledc.hex,所在文件夹选择好,Create HEX File选项前打“”。图2 Keil 工程的输出选项然后在Proteus的项目中,双击单片机器件,弹出如下窗口:图3 Proteus项目内的单片机程序文件在该窗口内选择Program File为keil生成输出的ledc.hex。1.1.3 联机调试寻找可用的Proteus简单例程。如51单片机的流水灯例程。内部包括Proteus项目(后缀为.DSN)以及对应的C51程序项目文件(后缀为.uv2)。用Proteus打开.DSN的项目。确保该项目中的单片机程序为ledc.hex,菜单选项Use Remote Debug Monitor前应该有“”。进入Keil环境,打开.uv2的项目文件。确保编译输出为ledc.hex;确保Debug选项如图1所示。(1) 编译C51工程。选择菜单选项ProjectBuild target(2) 进入调试模式。选择菜单选项DebugStart/Stop Debug Session为观察方便,可将两个软件窗口并排在桌面上,如下图所示:(3) 在Keil内单步执行C51程序(按F10),可以看到Proteus内的指示灯有相应的亮灭变化。(选择菜单ViewDisassembly Windows可以只保留C语句 )1.1.4 练习(1)针对流水灯硬件设计实例,自行创建相应的C51应用项目,实现流水灯从中间向两边流动的效果。(2)在Proteus内,自行添加红、黄、绿不同颜色的指示灯,然后编写C51程序,让这些灯闪烁起来。1.2 单片机联机调试功能试验本实验要学会利用Keil开发环境,观察单片机内部的各类存储器,掌握程序存储器、数据存储器、SFR各自的特点及使用方法。熟练掌握联机调试单片机程序的方法。1.2.1 观察各类存储单元(1)CPU内部寄存器的观察进入程序调试运行模式,Keil开发环境界面如图所示:左侧显示CPU内部的各寄存器名称及其内容,随着程序的运行,内容发生变化的寄存器会议高亮颜色标注出来。(2) C语言变量内容的观察:打开“ViewWatch & Call Stack Window”。在C语言变量名字上按鼠标右键,选择“Add XXX to Watch Window”,这样,该变量的内容就会显示在Watch Windows中,并随着程序的执行而变化。如图所示:按F2可以修改变量名或删除该变量。(3) 断点的设置:在C语句的最左端双击(或选择菜单项DebugInsert/Remove Breakpoint)可以添加或删除断点。这样可以使用DebugGo(或F5键)全速运行至断点位置。1.3 单片机定时器实验1.3.1 实验目的本实验要学会单片机定时器的设定及使用。1.3.2 设计要求设计一个倒计时秒表。要求利用两个7端数码管组成一个2位数的倒计时秒表,根据给定初始值,倒计数至0。1.3.3 实验原理(1)单片机定时器8051单片机内部集成了2个16位的计数器。可以根据需要将其作为定时器使用。这时,定时器的计数频率为系统CLK/12。如果CPU采用12MHz的晶振,则定时信号源的频率固定为12MHz/12=1MHz。如果定时周期设定为50ms,则需要计数0.05S/1MHz=50000个脉冲。因为单片机定时器为加1计数器,所以,计数器初始值应设定为65536-50000=15536(即16进制的3CB0)。另外,还需要设置定时器工作模式寄存器TMOD。如果使用定时器0,16位定时器方式,则TMOD=0x01。(2)数码管显示原理1.3.4 实验步骤(1)学习实验例程:数码管显示 用Proteus软件打开其原理图;用Keil软件打开配套的C语言工程项目。编译运行程序,观察数码管的显示情况,了解数码管的显示原理。重点学习C语言中数码管编码表的作用及用法。(2)修改原理图打开Proteus软件,修改数码管例程,添加一个7段数码管,接至P1端口。注意数码管要选择共阳极类型,公共端要连接VCC。(3)修改程序打开Keil软件,打开数码管的配套工程项目。定义变量sec,用于存放秒数。Char sec=99;显示两位数的方法:While(1)P2=tabsec/10; /显示十位数P1=tabsec%10; /显示个位数If(-sec0)sec=99;/重新计数Delay(0xff);(4)利用定时器实现准确延时 修改delay()函数如下:Void delay(int nsec)int i; TMOD=0x01;/16 bits,internal pulse counting for(i=0;i20)/如果定时器设定为50ms中断一次,在此计数20次,则1S时间到。/进行1s的定时操作二、数码管的动态显示原理1.4.4 实验步骤一、修改原理图: 1) 首先,学习使用连线标号(Wire Label)实现信号连接。如上图,选择窗口左侧的“LBL”,然后,鼠标移至相应连线上,出现T型标志时,点击鼠标左键,弹出如下窗口:输入连线标号,如P21,表明该信号连至单片机的P21引脚。同样,需要将单片机的P21引脚连上线,并标注相同的标号。这样,标号相同的连线在物理上是连接在一起的。2)实现单组LED的连接放置LED,型号选择7SEG-MPX2-CA-BLUE;然后实现如图连线。3)利用复制功能,放置4组LED。注意修改个器件的标号以及数码管公共端的连线标号,不要冲突。分别时用P1口的8个引脚控制8个数码管的公共端,如下图:二、修改程序1)首先使用循环延时的方法在数码管上显示不同的数字。利用上次实验的程序,主函数修改如下:Main()int i;while(1) P1=0x01; /P10=1,左侧数码管显示 P2=tab2; /显示数字2 Delay(2); /延时 P1=0x02; /P11=1,右侧数码管显示 P2=tab3;/显示数字3 Delay(2);该程序在上方的数码管上显示23,如图:2)4组数码管显示不同数字。将上述程序中的显示语句复制,增加其他数码管控制端的语句,即可在其他数码管上显示。如:While(1)for(i=0;i8;i+) P1=1i; P2=tabi; delay(2); 该程序在8各数码管上分别显示数字0-7,运行效果如下:3)利用定时中断实现动态显示int LED_SEG=1;char li=0;void timer0_2ms() interrupt 1TH0=0xf8; TL0=0x30; /Initial value=65535-10000=55535,10ms in 12MHz TF0=0;P1 = 17)li=0;main() TMOD=0x01;/16 bits,internal pulse countingTH0=0xf8; TL0=0x30; /Initial value=65535-2000=63536,2ms in 12MHz TF0=0; TR0=1; /start Timer 0 IE = 0x82; while(1); 该程序利用2ms中断处理程序,每隔2ms显示1位数字,利用中断可以不停刷新8个数码管。主程序可以安排其他任务。1.4.5 练习 修改程序,增加一个函数disp(char seg,char data),用于在指定的某组数码管上显示2位十进制数字data。1.5 简单交通灯控制系统的设计1.5.1 实验目的 练习单片机控制程序的设计,掌握以中断处理程序为主的软件设计方法1.5.2 实验要求 在实验1.4的基础上,增加四个方向的红黄绿指示灯。按十字路口交通灯的控制要求,实现固定时间间隔的交通灯控制。1.5.3 程序设计一、程序实现的主要功能:(1)数码管的动态显示数码管的动态显示需要定期刷新才能保证显示的正确性。该功能可以放在定时中断处理程序中实现。实现的思路如下:定义显示缓冲区,存放4组数码管上显示的2位数:unsigned char dispbuf8;volatile unsigned char li=0;利用定时中断处理程序刷新显示:void timer0_2ms() interrupt 1TH0=0xf8; TL0=0x30; /Initial value=65535-2000=63535,2ms in 12MHz TF0=0;P1 = 17)li=0;再定义函数disp(char seg,char data),用于修改显示缓冲区,在指定的某组数码管上显示2位十进制数字data。Void disp(char seg,char data)Dispbufseg * 2 = data % 10; /个位数 Dispbufseg * 2 + 1 = data /10;/十位数(2)倒计时及红绿灯的转换该部分功能可以放在定时中断中完成,也可以放在主程序中完成。下面例子是用主程序实现:定义计时变量:int tcount=500;/用于计时1S bit SecFlag=0;在定时中断程序中进行计时判断:if(-tcount = 0) SecFlag = 1; tcount = 500;在主程序中进行秒计时处理main() While(1) If(SecFlag) /1S时间到 SecFlag=0; 进行4个方向的通行时间到计时;判断并切换红黄绿灯;调用disp函数修改时间显示等 IDL=1;/让单片机处于空闲状态,本语句可选 1.5.4 练习将每个方向的通行时间设为变量,编写函数SetTrafficTime(char dir,char t)。1.6 单片机串行通讯接口实验1.6.1 实验目的 学习单片机串行通讯的使用,掌握以中断方式来处理串行通讯1.6.2 实验要求 在实验1.5的基础上,利用串行通讯,实现交通灯控制系统的远程设置。允许通过串口设定各方向的通行时间及红黄绿指示灯的控制方式。1.6.3 实验原理8051单片机内部集成了1路UART接口,用于实现串行通讯。如果需要实现自定义波特率的串行通讯,需要使用定时器1来产生波特率。(1) 首先,设置定时器1的工作模式及初始值TMOD = 0x21; /*-T1:Mode 2;T0:Mode 1*/*Baud Rate=(T1 overflow rate)* 2SMOD/32T1 overflow rate=(fosc/12)/(256-TH1)So if Baud rate is 1200bps, TH1 will be(fosc=11.0592MHz)256-TH1=(11059200/12)/(1200*32)TH1=232=E8(Hex)*/ TH1=0xe8;/0xfd; TL1=0xe8;/1200bps/0xfd;/*9600bps*/ TR1=1; /Start timer1 to generate BAUD rate pulse(2) 设置串行通讯格式: SCON = 0x50; /Mode 1, T1=baud(3) 允许串行通讯中断IE = 0x90;/EA=1;ES=1;(4) 编写串行通讯中断处理程序void uart_int() interrupt 4unsigned char c; if(RI) /接收中断 /数据接收及处理 Else /发送中断,无任何处理 TI =0; 1.6.4 通讯协议实现串行通讯的双方要遵从同样的协议,以便进行数据的定义及处理。在仪器仪表中,经常使用Modbus协议,也可以使用自定义协议。有关Modbus协议请参考相关资料。为简化程序,在此使用自定义协议:协议数据包由5个ASCII字符组成:B0:首字符,表示方向,用字母N、S、E、W分别表示North、South、East和West四个方向。B1:大写字母R表示红灯时间,G表示绿灯时间。黄灯时间固定为3秒。B2-B4:十进制ASCII码表示的3位数时间,B2存放百位数,B3十位数,B4个位数如设置方向北的红灯时间为123秒,协议包为:NR123unsigned char RcvBuf8; /接收缓冲区unsigned char RcvNum=0; /接收到的字符个数 /协议包的接收与处理void uart_int() interrupt 4unsigned char c; if(RI) /接收中断 RI = 0; c = SBUF;If( (c=N) | (c=S) | (c=E) | (c=W) /首字符 RcvBuf0=c; RcvNum=1;Else if(RcvNum)/接收后续字符 RcvBufRcvNum+=c; If(RcvNum=5)/接收到完整的数据包 /数据包的处理,修改对应方向的时间变量 Else /发送中断,无任何处理 TI =0; 1.6.4 实验步骤(1)打开Proteus软件,打开上个实验项目。(2)添加虚拟终端器件:终端的TxDRxD分别与单片机的RxDTxD引脚对接(3)利用Keil,修改源程序,增加串行通讯功能。1.7 单片机课程设计1.7.1 课程设计要求(1)设计一个完整的单片机应用系统。具体应用可以是交通灯控制系统,也可以是自选题目(需与老师商量)。(2)要求首先确定系统的功能,即进行需求分析,形成系统需求分析说明书。(3)完成系统的硬件设计:用Proteus实现硬件电路原理图的设计。(4)完成配套软件的设计:用Keil C51开发程序,并能在Proteus中仿真运行。1.7.2 提交 (1)文档:系统的需求分析说明书及相关设计文档。 (2)软硬件设计资料:电路图和源程序。上述内容打包,文件名为“学号姓名.rar”进行提交。第2章 ARM程序设计实验本章实验内容是针对ARM裸机芯片进行编程。在ARM上编写程序,可以使用ARM汇编语言、C语言或C+语言进行编程,也可以三者混合编程。所用开发工具可以使用ADS、Keil或其它与ARM芯片配套提供的专用开发工具。本章实验均以Keil公司的uVision 4.0以上版本实现。2.1 ARM混合编程实验2.1.1 实验目的(1)学会ARM编程所使用的汇编语言和C语言,掌握这两种语言混合编程的方法。(2)熟悉在uVision开发环境中ARM程序的设计步骤。(3)学习ARM处理器的7种工作模式及切换。2.1.2 实验要求创建一个新的ARM项目,使用uVision中的默认启动代码Startup.S。在启动代码的基础上,增加C语言程序及其他汇编语言程序,实现汇编与C之间的混合编程。2.1.3 实验原理(1)C语言内嵌汇编的方法n 内嵌汇编n 在C和C语言中嵌入汇编语言可以实现一些高级语言中没有的功能。在Keil中,可以采用如下语法实现汇编的嵌入void my_strcpy (char *dst, const char *src) int ch; _asm loop: LDRB ch, src, #1 STRB ch, dst, #1 CMP ch, #0 BNE loop (2) C语言中调用汇编程序首先需要在C语言中声明将要调用的汇编子程序的名称及参数,如下所示的extern void strcopy(char *d, const char *s);#include extern void strcopy(char *d, const char *s);int main() const char *srcstr = First string - source; char dststr = Second string - destination; printf(Before copying:n); printf( %sn %sn,srcstr,dststr); strcopy(dststr,srcstr); printf(After copying:n); printf( %sn %sn,srcstr,dststr); return 0; C语言与汇编语言参数的传递符合ATPCS标准,即函数前4个参数通过R0R3来传递,其它参数通过堆栈(FD)传递。 汇编语言程序需要将子过程名export出去,以便C语言程序可以引用。 AREA SCopy, CODE, READONLY EXPORT strcopystrcopy ; r0 points to destination string ; r1 points to source string LDRB r2, r1,#1 ; load byte and update address STRB r2, r0,#1 ; store byte and update address; CMP r2, #0 ; check for zero terminator BNE strcopy ; ke

温馨提示

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

评论

0/150

提交评论