




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式MCU应用举例一.预备知识:
预处理命令#pragma介绍一些常用的#pragma命令的扩展功能。1.用于SB相对地址预处理命令:#pragmaSBDATA变量名对变量进行声明,访问该变量时NC30会生成AS30伪指令“.SBSYM”,并使用SB相对寻址模式。这样可以生成高效的ROM代码,下图是“#pragmaSBDATA”命令的图形说明。2.生成位操作指令NC30允许用户以位为单位处理数据。设置一个位段来实现位操作,位段利用结构体定义符号,其格式如下:stucttag{类型说明符号位符号:比特数};引用一个位符号时,用点“.”分割开:变量名.位符号指定该位的方法和对结构体的处理相同。位段在存储器中的位置的分配与编译器有关。NC30对位段分配存储区时有两条规则:从LSB开始顺次分配另一种类型的数据放到下一个地址下图是如何对位段分配存储区的例子:设定位段后,虽然已可以在程序中处理位符号,但生成的是一条运算、逻辑指令,并不是位指令,若使用扩展功能“#pragmaBIT”对位段进行声明,则可以生成代码效率更高的“直接位操作指令”下图示出了一个例子,说明了如何写这条预处理命令及其展开情况的。除了用“#pragmaBIT”声明的数据外,对下面的变量NC30编译器也可以生成直接位操作指令:用“pragmaSBDATA”声明的变量用“pragmaADDRESS”声明的变量,且其地址位于绝对地址00000到01FFF内用‘-fbit’指定的近程变量。3.I/O接口的控制在控制内置I/O接口时,需指定变量的绝对地址。在NC30中可以使用扩展功能“#pragmaADDRESS”来指定变量的绝对地址,其格式如下:#pragmaADDRESS变量名绝对地址注意只对函数外定义的变量和在函数内定义的静态变量有效。扩展功能“#pragmaADDRESS”也可以用来设置SFR区。使用这种方法设置SFR时,一般准备一个独立的文件,并将其包含在源程序中。下图是一个SFR区定义文件的例子二.I/O口控制1.LED特性LED是发光二极管的简称,它通过一定的电流发光,LED有极性2.LED的电路连接在M16C/62C学习板上,将电阻和LED分别接在M30620FCAFP的p7口上,如下图所示:当端口输出为“L”时,LED亮灯,端口输出为“H”时,LED灯灭。3.LED亮灯程序(2)编写使LED1和LED2交错亮的程序编写顺序如下:1.源文件的准备启动程序和向量文件按照原来的使用,仅做成控制I/O的主程序。(1).在硬盘里做新的文件夹,文件夹名采用集成开发环境TM的项目名,此处用”sampleA”(2).对于sampleA.c”,采用编译程序用合乎规则的内容编写。2.编译用集成开发环境TM做成项目,并进行编译,做成在调试器(kd30)上的可运行的文件(sampleA.x30)以及用闪存写入器写入闪存的文件(sampleA.mot)3.调试用调试程序确认其操作。4.将程序固化到ROM控制程序清单如下:#pragmaADDRESSP73edh/*定义P7口的地址*/#pragmaADDRESSPD73efhvoid_main(void)unsignedcharP7,PD7;/*在p7方向寄存器和数据器里装入值作为变量*//*宏定义*/#defineLED_off/*LED1,2灯灭*/#defineLED1_on/*LED1灯亮,LED2灯灭*/#defineLED2_on/*LED1灯灭,LED2灯亮*/main(){unsignedlongi;P7=LED_off;/*p7口输出H,灯灭*/PD7=0Xff;/*p7口方向输出*/for(;;){P7=LED1_on;/*LED1灯亮*/
for(i=0x8ffff;;)/*等待(软等待)*/{i--;if(i==0)break;}P7=LED2_on;/*LED2灯亮*/for(i=0x8ffff;;)/*软等待*/{i--;If(i==0)break;}}}三. C语言和汇编语言混合编程Nc30编译器允许使用c语言和汇编语言进行混合编程。在c语言程序中,可以进行直接插入汇编语言来编写程序,也可以用调用汇编语言编写的子程序的方式来进行。反之,在汇编语言的程序中,也可以调用C语言所写的函数。1直接插入汇编语言方式在C语言编程中,对与一些硬件有关的操作,如直接改写C标志,用C语言则有些不方便,这时可以有两种方法解决这个问题,一个是使用“asm”功能,另一个是使用“#pragmaASM”功能(1)使用“asm”功能当在某一行写入asm时,可以把双引号中的字符串按汇编语言看待插入汇编程序,通常这用来直接改变标志和寄存器的值或一些要求高速处理的语句。当要访问的是一个函数内部的自动变量时,写入一个使用“$$FB”的语句,编译器会自动识别$$,用FB寄存器的偏移值来取代它,C语言中的自动变量名可以用于汇编语言程序。(2).使用“#pragmaASM”功能如果嵌入的汇编语言包含多行,这时可以使用“#pragmaASM”功能,NC30编译器能识别位于“#pragmaASM”和“pragmaENDASM”之间的程序段,直接插入编译后的汇编语言在源程序中,见下例:2调用汇编子程序Nc30编译器允许在C语言程序中调用汇编语言子程序。首先说明一下的是nc30编译器在调用一个函数时所作的处理,这时要进行三项操作:建造及释放堆栈帧传送参数值传送返回值下图是一个C语言程序执行时堆栈帧的建造过程:NC30编译器有两种方法传递函数的参数值,一种是“通过寄存器”,另一种是通过堆栈。参数传递遵守的规则如下表函数的返回值(结构体和共用体除外)都在寄存器中,数据类型不同,存储的寄存器也不同,见下表:若返回值用结构体和共用体描述时,则通过存储地址和堆栈传送参数值。也就是说在调用该函数时,先开一个存储区,将其地址作为一个隐型参数存入堆栈。被调用函数把返回值写到这个区,从该函数返回时可根据此地址取得返回值。在nc30编译器中,C程序中的函数名和汇编程序名之间的关系随函数的性质而定,下表示出了函数转换成汇编程序中符号的规则:下面说明如何在C程序中调用一个汇编子程序。在C程序中写入一行预处理命令来规定参数传递方式。#pragmaPARAMETER函数名(寄存器名,…)这种调用方式较为简单,但要注意:1.在写入“#pragmaPARAMETER”时,确认已对函数做了声明。
2.看一下函数声明中:函数参数值应该是8位或16位整数或16位指针。返回值不能用结构体或共用体。寄存器个数和参数个数应匹配。寄存器名不区分大小写。由#pragma指定的函数体如C程序中已定义过会导致出错。汇编程序应该按照下列规则编写:1.汇编子程序写成一个单独的文件2.子程序名应遵守符号转换的规则3.在c程序中对调用的子程序已做了原型声明。下图是一个使用“#pragmaPARAMETER”的一个例子,这个程序的功能是用LED显示加计数的结果,LED显示部分是用汇编语言写的。另一种方法是使用间接寻址方式调用汇编子程序的,注意,在使用函数指针用寄存器进行参数传递的场合,不要用“#pragramPARAMETER”来规定。使用存储类型说明符“extern”声明函数为外部参考。下图是使用间接寻址调用汇编子程序的一个例子,按照参数mode的值,选择进行“加”计数器或“减”计数器。3汇编程序调用c语言程序在汇编程序中调用C语言的函数时,应符合下面的规则:1.前述的符号转换规则;2.C语言函数构成一个单独的文件;3.在汇编语言文件中,用“.glb”伪指令说明C语言函数为外部过程。下图示出了汇编程序中调用C语言函数的情况:四.中断程序所谓中断是CPU相应请求停止正在执行的任务去处理其它的任务,处理完后,又恢复进行原来的操作。在M16C/62中,有根据外部端子或内部时钟电路等产生中断的方法和在程序中执行命令而产生中断的方法。1.M16C/62的中断M16C/62有很多中断方式,本课程主要学习是二种:一种是根据I/0中的INT0或INT1从外部端子进行的中断,另一种是使用定时器进行的时间中断。2. 使用中断的必要处理用程序进行中断时有必要进行下面的处理:中断函数的处理;允许中断;中断向量的设定;(1).中断函数中断函数是用来记述中断时执行处理的函数。中断函数用#pragmaINTERRUPT函数名来声明中断函数用来中断原来程序的进程,所以要将不想置换的寄存器在中断前进行保存,中断后返回,中断函数结束后要进行返回原来的操作(2).允许中断允许中断需要具备以下的条件:根据I标志(中断禁止标志)确定是否允许中断,是否允许全部的屏蔽中断。根据每个中断源优先级的设定,确定是否允许中断。只允许符合条件的中断源进行中断,中断优先级分为1-7级,数值大的,优先级高。(3)中断向量的设定中断向量是预先存放的中断函数的起始地址。中断函数与其它函数不同,它不是受另外函数调用而执行的。中断函数是相应中断请求时,根据存放着中断向量的地址开始执行程序操作的。3.来自INT0口的中断(1)控制INT0中断的寄存器如图:(2)规定。程序启动时LED1-LED8等灭,按下INT0开关时LED1-LED8灯亮。(3)方法。main程序:使LED灯灭,建立中断等待的无限循环语句。中断程序:使用LED灯灭,从中断返回。(4)文件的分配启动程序:nctro.a30+sect30.inc主程序文件:rei3.c+m16io.h(5)文件的更改设定sect30.inc中断向量的地址将中断程序记叙到主程序中(6)程序清单文件名为sect30.a30的程序清单如下:程序文件名为rei3.c程序清单:4.定时器中断M16C/62学习板内置有11个16位定时器,按功能可分为定时器A(5个)定时器B(6个)两种,这些定时器有各种不同的功能。下面以定时器A0为例。(1)定时器A0相关的寄存器如下图:(2)设定内容计数源f32( 主时钟进行32分频的时钟)若做1秒的计数,则要选用周期最大的计数源无脉冲输出无门功能(3)规定。用二进制数将LED1-LED8用于每1秒的累加计数。(4)方法。使用定时器A0做计数源,要做1s的计数,计算一个周期需要2us,则需要计数1s/2us=500000次,因为是16位计数器,不能设定为500000次,若取1s=100ms×10次100ms=2us×50000次这样加入100ms的中断,只需进行10次计数即可(5)文件的分配启动程序:ncrt0.a30+0-sec30.inc主程序文件:rec3.c+m16io.h(6)文件的更改设定sect30.inc的中断向量的地址将中断程序记录在主程序中。#include“m16io.h”#definePORTIN0x00#definePORTOUT0xff#defineLED_OFF0xff#defineLED_ON0x00#defineCNT_TA05000-1#defineCNTIS_TAO10voidportinit(void);voidtimerinit(void);voidta0int();#pragmaINTERRUPTta0intcharta0flag;intcnt1scharledcnt;voidmain(){ cnt1s=CNT1S_TAO;ledcnt=0x00;portint();timerinit();_asm(“\tFSETI”);while(1);}voidta0int(){cnt1s--;if(cnt1s==0){ledcnt++;port_7=ledcnt^0xff;cnt1s=CNT1S_TA0;}ta0=CNT_TA0;}voidtimerinit(void){ udf=0x00; ta0mr=0x80; ta0=CNT_TA0; ta0ic=0x06; tabsr=0x01;}voidport(void){ 同前}五.LCD模块的控制LCD模块是在LCD显示器里预先装入用于显示的部件。在M16C/62学习板上的LCD板上的sc1602bs被广泛的应用。1.LCD模块的构成当将数据写入LCD时,在LCD模块内对应的文字显示位置的存储器也被写入。只要不改写,根据内部LCD控制器的控制,就将自动地继续显示。2.LCD模块的初始设定LCD模块在电源接通后,要进行一系列的初始化设定,其设定步骤如下:将复位的操作以8位方式进行3次,如下图所示:此时LCD模块接受8位信息,M16C/62学习板的LCD的低4位接地。传输“0”数据,根据3次操作送出的功能模块,LCD模块处于取8位数据的受信状态。用4位传输数据的初始化如下图所示:3.控制LCD模块的函数(1)等待函数LCD板的控制中,要求等待的时间有三种:15ms,4.1ms,0.1ms。voidwait_ms(intk){ unsignedshortwi,wj; for(wi=0;wi<15*k;wi++) for(wj=0;wj<306;wj++) ;}
(2).8位命令输出函数初始设定的开始不能用四位命令传输数据,为此要制作用8位传输数据的函数,如下图所示:(3)用4位模式传输命令的函数命令数据采用8位无意义,4位传输需要分高4位,低4位二次传输。用4位模式传输命令的函数制作,如下图所示:(4)用4位传输数据的函数在传输命令和数据时,RS的值会发生改变,为此,作出与传输命令不同的函数,如下图所示:(5)BUSY校验函数LCD模块在前一写入过程未结束时,后一数据不能送入。写入过程中LCD模块的BUSY标志为“1”,只有在BUSY标志为“0”时才能进行后一数据的写入。为此,要制作读出的BUSY标志的函数。如下图所示;其流程和清单如下:(6)LCD模块初始设定的函数在LCD模块内时按照确定的规格来设定的,在下面的清单上加以说明。六.A/D和D/A转换A/D转换A/D转换器由一个电容耦合放大器的10位逐位逼近A/D转换电路构成。P100到P107为8个A/D输入引脚,用A/D控制寄存器0的位2,位1和位0选择其中的一个进行A/D转换。P95和P96也可以用作模拟信号输入端。用作A/D转换的I/O口的方向寄存器必须设为输入。原理框图如下:A/D转换可以用软件启动,也可以用外部信号触发产生。A/D转换的工作时钟ФAD在电源为5V时有三种:FAD,FAD/2,FAD/4.在电源为3V时有FAD/2,FAD/4.FAD为CPU的主时钟f(XIN)。A/D转换的结果存在所选引脚的A/D寄存器中。共有8路A/D输入,每路有两个8位寄存器存放A/D转换结果。它们的地址为03C0H-03CFH.当设为10位分辨率时,低8位存在偶地址中,高2位存在奇地址中。当设为8位分辨率时,8位存在偶地址中。A/D转换有5种工作方式,由A/D控制寄存器0的位4和位3选择。单次模式
对某个指定的引脚进行A/D转换,只做一次。重复模式对某个指定的引脚进行A/D转换,重复多次单次扫描模式对两个或更多的引脚进行A/D转换,逐个转换一次重复扫描模式0对两个或更多的引脚进行A/D转换,重复轮流进行转换。重复扫描模式1与重复扫描模式0不同是扫描时可以指定一些输入引脚进行重点转换。1.单次模式在单次模式中,对模拟输入端选择位选出的引脚进行单次A/D转换。下表为单次模式的性能说明。下图为用软件触发启动A/D转换的单次模式工作时序图当A/D转换开始标志设置为“1”,A/D转换开始工作。在A/D转换完成后,把逐次比较寄存器的内容(转换结果)存到A/D寄存器。此时A/D转换中断请求变为“1”。A/D转换启动标志变为“0”,A/D转换停止。下面图示描述转换过程:2.重复模式在重复模式中,对模拟输入端选择位选出的引脚重复进行A/D转换。下表为重复模式的性能说明:3.单次扫描模式在单次扫描模式中,用A/D扫描引脚选择位依次做A/D转换的引脚。下表为单次扫描模式的性能说明:4.重复扫描模式有两种重复扫描模式:重复扫描模式0和重复扫描模式1。在重复扫描模式0中,用A/D扫描引脚选择位选出的用作重复扫描A/D转换的引脚。重复扫描模式1在重复扫描模式1中,对所有引脚作重复扫描A/D转换,重点是用A/D扫描引脚选择位选出的引脚。5.A/D转换注意事项:(1)对A/D控制寄存器0(位6除外)和1的各位及A/D控制寄存器2位0的写操作,应在A/D转换停止时进行。特别是VREF连接位从“0”变到“1”,要经过1us或更长的一段时间,再启动A/D转换。(2)为了减小噪声对A/D转换的影响,最好单用一个电源加到AVcc和VREF引脚。AVss和AVcc引脚之间,AVss和VREF引脚之间要接一个电容。AVss引脚和模拟输入端之间最好也接一个电容。A/D转换精度(1)10位模式和8位模式A/D转换有10位和8位模式使用10位模式时,A/D转换的输出为10位,理论上A/D转换特性如下图。这时加到比较器的电压Vref的值与逐次比较寄存器内容n的关系为:Vref=VREF/1024×n-VREF/2048式中VREF是A/D转换的基准电压。A/D转换过程如下:①转换开始时把逐次比较寄存器的内容清零,把第9位置置“1”,把由逐次比较寄存器产生的比较电压Vref与模拟输入端的电压VIN进行比较如果Vref<VIN则把逐次比较寄存器的位9置“1”如果Vref>VIN则把逐次比较寄存器的位9置“0”转换精度:A/D转换的精度在10位模式时为有取样保持功能:AN0到AN7输入:±3LSBANEX0和ANEX1输入(包括有外接运算放大器的模式):±7LSB
无取样保持功能:±3LSB在8位模式时为:有取样保持功能:±2LSB无取样保持功能:±3LSB6.D/A转换器它是一个8位R-2R型的D/A转换器。片内含有两个独立的这种D/A转换器。D/A转换在写入一个值到相应的D/A转换寄存器时发生。两个D/A转换寄存器的地址分别为03D8H和03DAH。由D/A控制器的位0和位1决定转换结果是否输出。D/A转换输出端DA0,DA1与P93,P94引脚共用,这些端口用作D/A转换时,不要把该端口设成输出,不要接通相应端口的上拉。输出模拟电压(v)由D/A转换寄存器中的设置值(n:十进制)决定。V=VREF×n/256(VREF为参考电压)下表列出了D/A转换器的性能下图为D/A转换器的方框图下图为D/A控制寄存器的组成下表为D/A转换寄存器的组成下图为D/A转换器的等效电路下面我们举一个在多媒体应用中,有关A/D和D/A转换器的应用实例。首先我们必须了解下面的知识:在单片机的多媒体应用中,需要对声光等模拟信号进行采集和处理。M16C/62单片机内部置有多路10位A/D转换器和2个D/A转换器,和适合这方面的应用。首先我们对语音信号进行采集,大概需要8K的采样率,这样才能使语音更接近真实,从而能够对信号进行识别和分类。采集的语音信号经过低噪声放大器放大到足够的幅度后,才加到A/D输入端。下面是语音信号采集电路图,其中语音信号经过放大处理后,接到单片机的A/D输入端AN0,每按一次键采集一段语音,存到RAM中。在上图中,按键接在INT0端,工作在中断方式,每次按键启动一次DMA过程,把采集到的语音数据存到外部RAM中从D0000H地址开始的单元。本例中我们采样个数为32K字节。
程序流程图和信号采集程序清单如下所示:/*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装饰水电劳务合同范本
- 卖给车商的合同范本
- 小区大门改造合同范本
- 公交卡采购合同范本
- 建筑改造设计合同范本
- 餐饮空间设计合同范本
- 中小学期中期末家长会模板66
- 2025年新规定:合同变更法律依据详解
- 2025标准城市商业租赁合同模板
- 市政园林人工合同范本
- 知识付费居间合同样本
- 高考英语总复习《阅读七选五》专项测试卷含参考答案
- 《犯罪心理学》教学大纲
- 幼儿园市级课一等奖-大班语言健康绘本《我的情绪小怪兽》有声绘本课件
- 《淘宝开网店详解》课件
- 《铁路技术管理规程》(普速铁路部分)
- 农业新质生产力
- 成语故事《一叶障目》课件2
- 西工大附中2025届高考英语一模试卷含解析
- 《支付宝相关功能》课件
- 颈椎损伤术后的康复护理
评论
0/150
提交评论