嵌入式mcum16c应用举例PPT课件_第1页
嵌入式mcum16c应用举例PPT课件_第2页
嵌入式mcum16c应用举例PPT课件_第3页
嵌入式mcum16c应用举例PPT课件_第4页
嵌入式mcum16c应用举例PPT课件_第5页
已阅读5页,还剩176页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式MCU应用举例,嵌入式mcum16c应用举例,一.预备知识:预处理命令#pragma,介绍一些常用的#pragma命令的扩展功能。1.用于SB相对地址预处理命令:pragmaSBDATA变量名对变量进行声明,访问该变量时NC30会生成AS30伪指令“.SBSYM”,并使用SB相对寻址模式。这样可以生成高效的ROM代码,下图是“pragmaSBDATA”命令的图形说明。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,2.生成位操作指令,NC30允许用户以位为单位处理数据。设置一个位段来实现位操作,位段利用结构体定义符号,其格式如下:stucttag类型说明符号位符号:比特数;引用一个位符号时,用点“.”分割开:变量名.位符号,嵌入式mcum16c应用举例,指定该位的方法和对结构体的处理相同。位段在存储器中的位置的分配与编译器有关。NC30对位段分配存储区时有两条规则:从LSB开始顺次分配另一种类型的数据放到下一个地址下图是如何对位段分配存储区的例子:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,设定位段后,虽然已可以在程序中处理位符号,但生成的是一条运算、逻辑指令,并不是位指令,若使用扩展功能“pragmaBIT”对位段进行声明,则可以生成代码效率更高的“直接位操作指令”下图示出了一个例子,说明了如何写这条预处理命令及其展开情况的。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,除了用“pragmaBIT”声明的数据外,对下面的变量NC30编译器也可以生成直接位操作指令:用“pragmaSBDATA”声明的变量用“pragmaADDRESS”声明的变量,且其地址位于绝对地址00000到01FFF内用fbit指定的近程变量。,嵌入式mcum16c应用举例,3.I/O接口的控制,在控制内置I/O接口时,需指定变量的绝对地址。在NC30中可以使用扩展功能“pragmaADDRESS”来指定变量的绝对地址,其格式如下:pragmaADDRESS变量名绝对地址注意只对函数外定义的变量和在函数内定义的静态变量有效。扩展功能“pragmaADDRESS”也可以用来设置SFR区。使用这种方法设置SFR时,一般准备一个独立的文件,并将其包含在源程序中。下图是一个SFR区定义文件的例子,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,二.I/O口控制,1.LED特性LED是发光二极管的简称,它通过一定的电流发光,LED有极性2.LED的电路连接在M16C/62C学习板上,将电阻和LED分别接在M30620FCAFP的p7口上,如下图所示:,嵌入式mcum16c应用举例,当端口输出为“L”时,LED亮灯,端口输出为“H”时,LED灯灭。,嵌入式mcum16c应用举例,3.LED亮灯程序(2),编写使LED1和LED2交错亮的程序编写顺序如下:1.源文件的准备启动程序和向量文件按照原来的使用,仅做成控制I/O的主程序。(1).在硬盘里做新的文件夹,文件夹名采用集成开发环境TM的项目名,此处用”sampleA”(2).对于sampleA.c”,采用编译程序用合乎规则的内容编写。,嵌入式mcum16c应用举例,2.编译用集成开发环境TM做成项目,并进行编译,做成在调试器(kd30)上的可运行的文件(sampleA.x30)以及用闪存写入器写入闪存的文件(sampleA.mot)3.调试用调试程序确认其操作。,嵌入式mcum16c应用举例,4.将程序固化到ROM控制程序清单如下:#pragmaADDRESSP73edh/*定义P7口的地址*/#pragmaADDRESSPD73efhvoid_main(void)unsignedcharP7,PD7;/*在p7方向寄存器和数据器里装入值作为变量*/*宏定义*/#defineLED_off/*LED1,2灯灭*/#defineLED1_on/*LED1灯亮,LED2灯灭*/#defineLED2_on/*LED1灯灭,LED2灯亮*/,嵌入式mcum16c应用举例,main()unsignedlongi;P7=LED_off;/*p7口输出H,灯灭*/PD7=0Xff;/*p7口方向输出*/for(;)P7=LED1_on;/*LED1灯亮*/,嵌入式mcum16c应用举例,for(i=0 x8ffff;)/*等待(软等待)*/i-;if(i=0)break;P7=LED2_on;/*LED2灯亮*/for(i=0 x8ffff;)/*软等待*/i-;If(i=0)break;,嵌入式mcum16c应用举例,三.C语言和汇编语言混合编程,Nc30编译器允许使用c语言和汇编语言进行混合编程。在c语言程序中,可以进行直接插入汇编语言来编写程序,也可以用调用汇编语言编写的子程序的方式来进行。反之,在汇编语言的程序中,也可以调用C语言所写的函数。,嵌入式mcum16c应用举例,1直接插入汇编语言方式,在C语言编程中,对与一些硬件有关的操作,如直接改写C标志,用C语言则有些不方便,这时可以有两种方法解决这个问题,一个是使用“asm”功能,另一个是使用“pragmaASM”功能,嵌入式mcum16c应用举例,(1)使用“asm”功能,当在某一行写入asm时,可以把双引号中的字符串按汇编语言看待插入汇编程序,通常这用来直接改变标志和寄存器的值或一些要求高速处理的语句。当要访问的是一个函数内部的自动变量时,写入一个使用“$FB”的语句,编译器会自动识别$,用FB寄存器的偏移值来取代它,C语言中的自动变量名可以用于汇编语言程序。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,(2).使用“pragmaASM”功能,如果嵌入的汇编语言包含多行,这时可以使用“pragmaASM”功能,NC30编译器能识别位于“pragmaASM”和“pragmaENDASM”之间的程序段,直接插入编译后的汇编语言在源程序中,见下例:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,2调用汇编子程序,Nc30编译器允许在C语言程序中调用汇编语言子程序。首先说明一下的是nc30编译器在调用一个函数时所作的处理,这时要进行三项操作:建造及释放堆栈帧传送参数值传送返回值,嵌入式mcum16c应用举例,下图是一个C语言程序执行时堆栈帧的建造过程:,嵌入式mcum16c应用举例,NC30编译器有两种方法传递函数的参数值,一种是“通过寄存器”,另一种是通过堆栈。参数传递遵守的规则如下表,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,函数的返回值(结构体和共用体除外)都在寄存器中,数据类型不同,存储的寄存器也不同,见下表:,嵌入式mcum16c应用举例,若返回值用结构体和共用体描述时,则通过存储地址和堆栈传送参数值。也就是说在调用该函数时,先开一个存储区,将其地址作为一个隐型参数存入堆栈。被调用函数把返回值写到这个区,从该函数返回时可根据此地址取得返回值。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,在nc30编译器中,C程序中的函数名和汇编程序名之间的关系随函数的性质而定,下表示出了函数转换成汇编程序中符号的规则:,嵌入式mcum16c应用举例,下面说明如何在C程序中调用一个汇编子程序。,在C程序中写入一行预处理命令来规定参数传递方式。pragmaPARAMETER函数名(寄存器名,)这种调用方式较为简单,但要注意:1.在写入“pragmaPARAMETER”时,确认已对函数做了声明。,嵌入式mcum16c应用举例,2.看一下函数声明中:函数参数值应该是8位或16位整数或16位指针。返回值不能用结构体或共用体。寄存器个数和参数个数应匹配。寄存器名不区分大小写。由pragma指定的函数体如C程序中已定义过会导致出错。,嵌入式mcum16c应用举例,汇编程序应该按照下列规则编写:,1.汇编子程序写成一个单独的文件2.子程序名应遵守符号转换的规则3.在c程序中对调用的子程序已做了原型声明。下图是一个使用“pragmaPARAMETER”的一个例子,这个程序的功能是用LED显示加计数的结果,LED显示部分是用汇编语言写的。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,另一种方法是使用间接寻址方式调用汇编子程序的,注意,在使用函数指针用寄存器进行参数传递的场合,不要用“pragramPARAMETER”来规定。使用存储类型说明符“extern”声明函数为外部参考。下图是使用间接寻址调用汇编子程序的一个例子,按照参数mode的值,选择进行“加”计数器或“减”计数器。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,3汇编程序调用c语言程序,在汇编程序中调用C语言的函数时,应符合下面的规则:1.前述的符号转换规则;2.C语言函数构成一个单独的文件;3.在汇编语言文件中,用“.glb”伪指令说明C语言函数为外部过程。下图示出了汇编程序中调用C语言函数的情况:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,四.中断程序,所谓中断是CPU相应请求停止正在执行的任务去处理其它的任务,处理完后,又恢复进行原来的操作。在M16C/62中,有根据外部端子或内部时钟电路等产生中断的方法和在程序中执行命令而产生中断的方法。,嵌入式mcum16c应用举例,1.M16C/62的中断M16C/62有很多中断方式,本课程主要学习是二种:一种是根据I/0中的INT0或INT1从外部端子进行的中断,另一种是使用定时器进行的时间中断。,嵌入式mcum16c应用举例,2.使用中断的必要处理,用程序进行中断时有必要进行下面的处理:中断函数的处理;允许中断;中断向量的设定;,嵌入式mcum16c应用举例,(1).中断函数,中断函数是用来记述中断时执行处理的函数。中断函数用pragmaINTERRUPT函数名来声明中断函数用来中断原来程序的进程,所以要将不想置换的寄存器在中断前进行保存,中断后返回,中断函数结束后要进行返回原来的操作,嵌入式mcum16c应用举例,(2).允许中断,允许中断需要具备以下的条件:根据I标志(中断禁止标志)确定是否允许中断,是否允许全部的屏蔽中断。根据每个中断源优先级的设定,确定是否允许中断。只允许符合条件的中断源进行中断,中断优先级分为17级,数值大的,优先级高。,嵌入式mcum16c应用举例,(3)中断向量的设定,中断向量是预先存放的中断函数的起始地址。中断函数与其它函数不同,它不是受另外函数调用而执行的。中断函数是相应中断请求时,根据存放着中断向量的地址开始执行程序操作的。,嵌入式mcum16c应用举例,3.来自INT0口的中断,(1)控制INT0中断的寄存器如图:,嵌入式mcum16c应用举例,(2)规定。程序启动时LED1-LED8等灭,按下INT0开关时LED1-LED8灯亮。(3)方法。main程序:使LED灯灭,建立中断等待的无限循环语句。中断程序:使用LED灯灭,从中断返回。(4)文件的分配启动程序:nctro.a30+sect30.inc主程序文件:rei3.c+m16io.h,嵌入式mcum16c应用举例,(5)文件的更改设定sect30.inc中断向量的地址将中断程序记叙到主程序中(6)程序清单文件名为sect30.a30的程序清单如下:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,程序文件名为rei3.c程序清单:,嵌入式mcum16c应用举例,4.定时器中断,M16C/62学习板内置有11个16位定时器,按功能可分为定时器A(5个)定时器B(6个)两种,这些定时器有各种不同的功能。下面以定时器A0为例。(1)定时器A0相关的寄存器如下图:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,(2)设定内容计数源f32(主时钟进行32分频的时钟)若做1秒的计数,则要选用周期最大的计数源无脉冲输出无门功能,嵌入式mcum16c应用举例,(3)规定。用二进制数将LED1-LED8用于每1秒的累加计数。(4)方法。使用定时器A0做计数源,要做1s的计数,计算一个周期需要2us,则需要计数1s/2us=500000次,因为是16位计数器,不能设定为500000次,若取1s100ms10次100ms2us50000次这样加入100ms的中断,只需进行10次计数即可,嵌入式mcum16c应用举例,(5)文件的分配启动程序:ncrt0.a30+0-sec30.inc主程序文件:rec3.c+m16io.h(6)文件的更改设定sect30.inc的中断向量的地址将中断程序记录在主程序中。,嵌入式mcum16c应用举例,#include“m16io.h”#definePORTIN0 x00#definePORTOUT0 xff#defineLED_OFF0 xff#defineLED_ON0 x00#defineCNT_TA05000-1#defineCNTIS_TAO10voidportinit(void);voidtimerinit(void);,嵌入式mcum16c应用举例,voidta0int();#pragmaINTERRUPTta0intcharta0flag;intcnt1scharledcnt;voidmain()cnt1s=CNT1S_TAO;ledcnt=0 x00;portint();timerinit();_asm(“tFSETI”);while(1);,嵌入式mcum16c应用举例,voidta0int()cnt1s-;if(cnt1s=0)ledcnt+;port_7=ledcnt0 xff;cnt1s=CNT1S_TA0;ta0=CNT_TA0;,嵌入式mcum16c应用举例,voidtimerinit(void)udf=0 x00;ta0mr=0 x80;ta0=CNT_TA0;ta0ic=0 x06;tabsr=0 x01;voidport(void)同前,嵌入式mcum16c应用举例,五.LCD模块的控制,LCD模块是在LCD显示器里预先装入用于显示的部件。在M16C/62学习板上的LCD板上的sc1602bs被广泛的应用。1.LCD模块的构成当将数据写入LCD时,在LCD模块内对应的文字显示位置的存储器也被写入。只要不改写,根据内部LCD控制器的控制,就将自动地继续显示。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,2.LCD模块的初始设定,LCD模块在电源接通后,要进行一系列的初始化设定,其设定步骤如下:将复位的操作以8位方式进行3次,如下图所示:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,此时LCD模块接受8位信息,M16C/62学习板的LCD的低4位接地。传输“0”数据,根据3次操作送出的功能模块,LCD模块处于取8位数据的受信状态。用4位传输数据的初始化如下图所示:,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,3.控制LCD模块的函数,(1)等待函数LCD板的控制中,要求等待的时间有三种:15ms,4.1ms,0.1ms。voidwait_ms(intk)unsignedshortwi,wj;for(wi=0;wi2);a_ad8=(char)t;DM0SL=DM0SL|0X80ADCON2=0X01;ADCON0=0X20;ADCON0=ADCON0|0X40;TIMERA3=2000;,嵌入式mcum16c应用举例,在前面的信号采集中,我们用到了A/D转换器,而我们要听到声音,需要把数字声音信号转换成模拟电压。这就要用到D/A转换器,M16C/62单片机内有2个8位D/A转换器,可以完成这个功能。我们用8个按键产生频率不同的音频信号。当不同的键按下时,从DA0口分别输出不同的音乐信号。键盘电路如下图所示,不同的键按下,加到A/D转换输入口的电压不同,于是一个I/O口可以识别多个按键。,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,通过对上面语音信号的采集和数字转换为语音信号的实现过程进行学习,我们对M16C/62单片机的A/D和D/A转换器的功能有了初步了解,而且对该系列单片机的编程也有了基本思路。在以后的学习中,可以自己动手,编出高质量和实用的应用程序。,嵌入式mcum16c应用举例,七、自动小车应用范例,嵌入式mcum16c应用举例,1、DC电机驱动部分,嵌入式mcum16c应用举例,嵌入式mcum16c应用举例,CPU板与DC电机驱动部分的连接,嵌入式mcum16c应用举例,2、光距离传感器部分,嵌入式mcum16c应用举例,光距离传感器部分的连接,嵌入式mcum16c应用举例,距离与输出电压的关系图,嵌入式mcum16c应用举例,光距离传感器部分电路的基本组成,嵌入式mcum1

温馨提示

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

评论

0/150

提交评论