ImageVerifierCode 换一换
格式:DOCX , 页数:65 ,大小:10.71MB ,
资源ID:9416555      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9416555.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式系统实验报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式系统实验报告.docx

1、嵌入式系统实验报告嵌入式系统专题实验报告学院:电信学院班级:电信(硕)81班姓名:聂金学号:06035021姓名:尹鑫学号:08058029提交日期:2011年5月27日星期五瑞萨嵌入式M16C62P单片机介绍M16C62P系列单片机是瑞萨科技1996年推出的16位单片机。采用高性能的硅栅CMOS工艺,使用高效率的复杂指令,具有1兆字节的线性地址空间,能高速执行指令,内置有乘法器和DMAC。 M16C62P单片机融合了基于寄存器型和基于存储器型两种结构的优点。M16C单片机具有超低功耗、极强的抗干扰能力和很高的C语言编程效率等特点。片内集成了丰富的周边功能电路模块,应用领域广阔。 该单片机有着

2、非常强大的指令,既有一般的指令格式,也有紧凑的指令格式。高速的乘法运算、增强的存储器与存储器之间的操作、增强的按位处理功能、高效的对4位和8位的操作、高速的16位处理能力,使处理器速度大大加快。内置双电源型的FLASH存储器,可高速改写、并支持串、并联输入输出方式,CPU改写方式等。 M16C单片机配备有软件模拟器和各种级别的硬件仿真器,具有集成调试环境。采用HEW(High-performance Embedded Workshop)对源程序进行编译,采用KD30软件对系统进行在线仿真,利用Flashdata对程序进行烧录。另外,还支持E8仿真器。 M16C62P单片机的系统构架及资源如下:

3、图1.M16C62P单片机系统架构图实物图如下:表1.瑞萨嵌入式系统实验设备技术参数表指 标说 明存储容量片内RAM 3KB20KB,片内ROM 32KB256KB机器周期/ns62.5ns(5V 16Mhz)处理速度/MIPS8(16Mhz)寄存器通用寄存器 16位62组 专用寄存器 16位5电源4.25.5VDC(频率为16Mhz)低功耗在5V电压,16MH工作频率,1等待方式工作时,功耗为18mW。中断25个内部中断源和8个外部中断源,4个软件中断,7级中断优先级可选定时器5个输出型定时器,6个输入型定时器串口3个异步同步通道,2个同步通道DMAC2个通道(有24种触发源)A/D转换10

4、位8通道D/A8位2通道CRC计算电路1个电路监视定时器15位(可预分频器)可编程I/O口87口输入口1个(p8.5与NMI共用)存储器扩充1.2MB或4MB片选输出端4个处理器工作模式3种模式(单片模式、存储器扩充模式、微处理器模式)实验要求1、掌握renesas嵌入式系统原理及嵌入式C语言的编程方法。2、熟悉并掌握renesas嵌入式系统的集成编译环境和仿真调试环境。3、掌握M16C/62P系列嵌入式微控制器的基本程序设计方法。实验环境Microsoft Windows XP Professional Verb 2002Service Pack 3 PCM16C/62P嵌入式系统实验箱集成

5、开发环境HEW仿真调试环境KD30实验任务实验一:熟悉M16C/62P嵌入式系统实验箱及嵌入式C语言的基本编程方法实验目的:了解renesas嵌入式系统,掌握嵌入式C语言的编程方法。基本要求:学会使用M16C/62P嵌入式系统实验箱;熟悉嵌入式C语言的编程方法,了解嵌入式C语言和普通C语言的异同。 内容提要:了解renesas嵌入式系统的组成结构,熟悉M16C/62P嵌入式系统实验箱。嵌入式C语言的变量定义;程序结构设计;外围输入、输出设备的控制指令的使用等。 实验二:M16C/62P嵌入式系统的集成编译环境和仿真调试环境实验实验目的:掌握M16C/62P的集成编译HEW和仿真调试环境KD30

6、的使用方法。基本要求:能够熟练使用renesas嵌入式设备的集成编译环境HEW和仿真调试环境KD30。内容提要:熟悉renesas嵌入式设备的编程环境HEW和调试环境KD30。能够根据实验要求在编程环境HEW下设计相应的工程项目,包括文件定义、变量定义、程序结构设计、算法实现等;在KD30环境下,掌握程序的调试步骤,如何排除程序中的错误等。实验三:基础模块设计实验实验目的:掌握各基础模块的使用和编程方法。基本要求:熟悉功能函数库library中的函数,通过对各基础模块(如LCD、LED、键盘、定时器和中断等)的学习,了解其工作原理。并能根据实验要求编制相应的控制程序。 内容提要:完成7段LED

7、模块、LCD16*2和LCD128*64显示模块、键盘的使用模块,定时器的使用、定时中断的使用、AD和DA等模块基本实验环节。 实验四:综合设计实验实验目的:全面掌握M16C/62P系列嵌入式微控制器的程序设计技术。基本要求:利用实验一三的积累,完成综合实验任务。内容提要:1)设计程序查找一维数组的最大(小)值、中值和均值;2)实现具有简单人机界面的加、减、乘、除、开方和幂运算计算器;3)分别采用定时中断和定时器,设计秒表和倒计时表,并能显示日历。实验思路 由于本实验属于开放式实验,因此在集中设计环节给了我们很大的发挥空间。由于我们两人都是第一次接触单片机,对单片机编程不是很了解,因此在设计上

8、遇到了很大的问题,很多很好的思路由于技术因素都无法很好的实现,后来我们就抛弃了实用性这一个因素,尽量用上实验箱上所有的模块,使得通过这次实验使我们对瑞萨嵌入式系统以及单片机有更加深入的了解。 在完成基本的四项任务后,我们还未加入的环节有: 红外感应;LED指示灯;AD0旋钮模块;DA声音输出模块; 因此在最后的环节,我们综合了以上所有模块的功能,做出了以LED指示灯为指示效果的跑马灯,其中速度快慢不同声音输出也不同,而速度由AD旋钮模块来控制,红外感应是跑马灯的启停开关。 使用的设备: LCD12864图形液晶屏、键盘、7段数码管、LED灯、拨动开关、LCD数码液晶屏、定时器和定时中断、Mic

9、插口和Phone插口,红外感应。源代码与结果任务1.数组处理程序该段程序完成的功能如下:用户规定数组长度,然后输入相应个数个数据,每输入一个数据按“#”键确认,最后程序输出数组的最大值,最小值,中值和平均值结果。程序流程如下:1. 首先利用键盘读入程序启停开关量,进入程序。2. 将数组长度定义为全局变量,在寻找数组最大值,最小值,中值和平均值时不用反复定义。3. 在主程序内,利用getchar指令从键盘获得数组长度,并通过init函数初始化数组,申请存储空间。4. 利用getchar指令获得用户输入的每一个数组元素。5. 利用max, min, mid, average等子函数完成求最大,最下

10、,中指和平均值的功能。6. 其中,max, min子函数的实现采用算法中的冒泡排序法来进行查找,冒泡方向想法,核心思想都是进行顺序比较,采用中间变量存储暂时最大(小)值,当所有的元素都参与比较完毕之后,中间变量中的元素便是我们所求的最值。7. 中值的获取在完成冒泡排序之后,此时数组已经成为有序数列,位于最中间的就是中值。8. 平均值的求法是设置一累加器,将所有元素相加之后除以数组长度取整即可。源程序如下所示:int get_maximum(int *p) /最大值程序 int i; int max = 0; for(i=0;i*(p+i)?max:*(p+i); /冒泡排序法 return(m

11、ax);该段子程序就是上述采用冒泡排序法求取最大值的子程序,可以看到,变量max为中间变量,用来存储一次排序中较大的那个元素,当所有元素都进行比较之后,max中的元素极为全局最大元素。这个思想在最小值程序中一样适用。int get_minimum(int *p) /最小值程序 int i; int min = *p; for(i=0;iARRAY_LENTH;i+) min = (min*(p+i)?min:*(p+i); return(min);int get_average(int *p) /均值程序 int i; int sum = *p; for(i=0;iARRAY_LENTH;i+

12、) sum += *(p+i); /累加器 return(sum/ARRAY_LENTH); /均值求取以上程序就是实现求取均值的程序,利用累加器sun将所有元素进行累加求出总和即可。int get_mid(int *p) /中值程序 int i; int j; int mid; int temp; for(i=0;iARRAY_LENTH;i+) for(j=i;j*(p+j) *(p+i)=temp; *(p+i)=*(p+j); *(p+j)=temp; /中间变量存储 mid=*(p+(ARRAY_LENTH-1)/2); return(mid);上述程序为求取中值程序,由于开发环境不

13、支持下标查找数组,因此在上述子程序中采用指针寻址,找到每个元素所在的存储单元,取出在链表最中间存储单元中元素的值即可,由于之前已经做过冒泡排序,因此此单元内的元素便是整个数组的中值元素。void shuzhu(void) int i; di(); /关中断; SW_initialize1(); init_LCD(); init_TimerA0(); ei(); /开中断 Lcd12864_init_lcd();Lcd12864_clear_lcd();Lcd12864_light_on(); Lcd12864_clear_lcd(); Lcd12864_set_cursol(0,0); /利用

14、12864液晶屏显示字符 Lcd12864_write_lcd(输入数组长度:); ARRAY_LENTH = SW_getdec(); while(!ARRAY_LENTH); Lcd12864_putdec(ARRAY_LENTH); Lcd12864_set_cursol(0,1); Lcd12864_write_lcd(数据:); Lcd12864_set_cursol(0,2); for(i=0;i=data2) return (data1-data2); return (data2-data1);int mul(int data1,int data2) return (data1*

15、data2);int div(int data1,int data2) return (data1/data2); /四则运算功能子程序void calculator(void) /计算器子功能主程序 char op; int Num1; int Num2; int num1; di(); /关中断; SW_initialize1(); init_LCD(); init_TimerA0(); ei(); /开中断 Lcd12864_clear_lcd(); Lcd12864_set_cursol(0,0); Lcd12864_write_lcd(请输入:); Lcd12864_set_curs

16、ol(0,1); Num1=SW_getdec(); /获取操作数A Lcd12864_putdec(Num1); SW_gets(&op); /获取操作方法变量op Lcd12864_write_lcd_char(op); Num2=SW_getdec(); /获取操作数B Lcd12864_putdec(Num2); Lcd12864_write_lcd_char(=); switch(op) /根据操作方法变量调用功能子程序 case +: num1=add(Num1,Num2); Lcd12864_putdec(num1);break; case -: num1=sub(Num1,Nu

17、m2); Lcd12864_putdec(num1);break; case *: num1=mul(Num1,Num2); Lcd12864_putdec(num1); break; case /: num1=div(Num1,Num2); Lcd12864_putdec(num1); break; default: break; /若出错,则跳出 运行结果图6. 计算器乘法算例图7. 计算器加法算例图8. 计算器减法算例图9. 计算器除法算例任务3.带秒表的电子日历以例程为基础,使其以:“年/月/日 时:分:秒”的格式显示时间。调用例程中的initTimer函数对计时器进行初始化,编写LC

18、D显示函数使输出月日年时分秒可调整。利用内部计数器对不同位的。程序的工作过程是:通过计数值为7500的TimerA1的时钟中断计时,每次中断为10ms,累加毫秒计数并更新年月日时分秒,在对日期更新时还存在闰年的判断和调整;同时还会根据标志位情况累加秒表毫秒计数和倒计时毫秒计数;在主程序中,循环更新Lcd12864显示,并判断拨动开关的位置进入相应的功能或返回时钟主界面;子功能包括年月日时分秒设置,倒计时器设置。全局变量定义如下,使得不必在子程序中对需要的变量进行重复定义:int flag;int year ;int month ;int day ;int hour;int minute;int

19、 second;int second_percent;int hour1;int minute1;int second1;int second_percent1;int miaobiaoon;int daojishion;int count;程序流程如下:1. 通过主程序的开启变量,开启日历子程序函数。2. 初始化计时器TimerA1。3. 通过键盘,获得用户输入年,月,日,时,分,秒数据。4. 根据用户输入数据,设置计时器初始值。5. 开始计时,循环扫描显示。源代码:/*FUNC COMMENT* 以下是TimerA1处理函数 * ID : -* function name : void i

20、nit_timerC(void); 定时器A1初始化 void INT_TimerA1(void); 定时器A1中断处理函数 void set_busy(unsigned int time); 定时器A1重载及计数启动函数* notice : interrupt function called by interrupt program* History :*FUNC COMMENT END*/void init_TimerA1(void) /*- initialize timer A1- */ ta1mr = 0x80; /* set timer A1 mode register */ /*

21、?0000 */ /* |+ timer mode */ /* |+- ta0out is I/O */ /* |+- ta0in is I/O */ /* |+- reserved */ /* +- select f32(24MHz/32:1.43us) */ ta1ic = 0x02; /* set interrupt (priority level:2) */ ta1 = 69930; /* set timer 0.1s = 69930*1.43us */ year = 2010; month = 1; day = 11; ta1s = 1; /* start count */ /计时器

22、初始化函数,由例程修改而来void SetCalendar(void) Lcd12864_clear_lcd(); second_percent=0; Lcd12864_set_cursol(0,0); Lcd12864_write_lcd(intput the year); year=SW_getdec(); Lcd12864_set_cursol(0,1); Lcd12864_putdec(year); _lcd12864_wait(5000); Lcd12864_clear_lcd(); Lcd12864_set_cursol(0,0); Lcd12864_write_lcd(input

23、 the month); Lcd12864_set_cursol(0,1); month=SW_getdec(); Lcd12864_putdec(month); _lcd12864_wait(5000); Lcd12864_clear_lcd(); Lcd12864_set_cursol(0,0); Lcd12864_write_lcd(input the day); Lcd12864_set_cursol(0,1); day=SW_getdec(); Lcd12864_putdec(day); _lcd12864_wait(5000); Lcd12864_clear_lcd(); Lcd1

24、2864_set_cursol(0,0); Lcd12864_write_lcd(input the hour); Lcd12864_set_cursol(0,1); hour=SW_getdec(); Lcd12864_putdec(hour); _lcd12864_wait(5000); Lcd12864_clear_lcd(); Lcd12864_set_cursol(0,0); Lcd12864_write_lcd(input the minute); Lcd12864_set_cursol(0,1); minute=SW_getdec(); Lcd12864_putdec(minut

25、e); _lcd12864_wait(5000); Lcd12864_clear_lcd(); Lcd12864_set_cursol(0,0); Lcd12864_write_lcd(input the second); Lcd12864_set_cursol(0,1); second=SW_getdec(); Lcd12864_putdec(second); _lcd12864_wait(5000); return;这个函数是日历显示的函数,由于指令的便利使得很容易将年月日输出不同行,并且留一行专门显示秒表。void init_miaobiao(void) int minute=0; int second=0; int second_percent=0; return; 这个是秒表的初始化函数,将分,秒,毫秒初始化为0。voi

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1