嵌入式mcu-m16c应用举例PPT推荐.ppt
- 文档编号:7172952
- 上传时间:2023-05-08
- 格式:PPT
- 页数:184
- 大小:2.85MB
嵌入式mcu-m16c应用举例PPT推荐.ppt
《嵌入式mcu-m16c应用举例PPT推荐.ppt》由会员分享,可在线阅读,更多相关《嵌入式mcu-m16c应用举例PPT推荐.ppt(184页珍藏版)》请在冰点文库上搜索。
,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标志(中断禁止标志)确定是否允许中断,是否允许全部的屏蔽中断。
根据每个中断源优先级的设定,确定是否允许中断。
只允许符合条件的中断源进行中断,中断优先级分为17级,数值大的,优先级高。
(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次,若取1s100ms10次100ms2us50000次这样加入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=ledcnt0xff;
cnt1s=CNT1S_TA0;
ta0=CNT_TA0;
voidtimerinit(void)udf=0x00;
ta0mr=0x80;
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;
wi15*k;
wi+)for(wj=0;
wj306;
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时有三种:
,在电源为V时有,为的主时钟()。
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/1024nVREF/2048式中VREF是A/D转换的基准电压。
A/D转换过程如下:
转换开始时把逐次比较寄存器的内容清零,把第9位置置“1”,把由逐次比较寄存器产生的比较电压Vref与模拟输入端的电压VIN进行比较如果VrefVIN则把逐次比较寄存器的位9置“0”,转换精度:
A/D转换的精度在10位模式时为有取样保持功能:
AN0到AN7输入:
3LSBANEX0和ANEX1输入(包括有外接运算放大器的模式):
7LSB,无取样保持功能:
3LSB在8位模式时为:
有取样保持功能:
2LSB无取样保持功能:
3LSB,6.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:
十进制)决定。
VVREFn/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字节。
程序流程图和信号采集程序清单如下所示:
/*使用相对地址预处理命令对变量进行声明*/pragamSBDATAsw_countpragamSBDATAp_countpragamSBDATAt_disp,unsignedintcount=32768;
voidta3int()unsignedintt;
p_count+;
if(p_count=count)TA3IC=0X00;
t=(AD02);
a_ad8=(char)t;
DM0SL=DM0SL|0X80ADCON2=0X01;
ADCON0=0X20;
ADCON0=ADCON0|0X40;
TIMERA3=2000;
在前面的信号采集中,我们用到了A/D转换器,而我们要听到声音,需要把数字声音信号转换成模拟电压。
这就要用到D/A转换器,M16C/62单片机内有2个8位D/A转换器,可以完成这个功能。
我们用8个按键产生频率不同的音频信号。
当不同的键按下时,从DA0口分别输出不同的音乐信号。
键盘电路如下图所示,不同的键按下,加到A/D转换输入口的电压不同,于是一个I/O口可以识别多个按键。
通过对上面语音信号的采集和数字转换为语音信号的实现过程进行学习,我们对M16C/62单片机的A/D和D/A转换器的功能有了初步了解,而且对该系列单片机的编程也有了基本思路。
在以后的学习中,可以自己动手,编出高质量和实用的应用程序。
七、自动小车应用范例,1、DC电机驱动部分,CPU板与DC电机驱动部分的连接,2、光距离传感器部分,光距离传感器部分的连接,距离与输出电压的关系图,光距离传感器部分电路的基本组成,3、CPU板,4、输入输出口的分配,5、自动小车的构造
(1)DC电机的驱动方法,PWM控制,PWM中定时器模式的设定(TAIMR:
0396H,0397H,0398H,0399H,039AH),光距离数据和A/D的使用方法,参照前面所学A/D的知识,可编写初始化程序如下:
采样和保持选择(ADCON2),A/D控制寄存器的设定(ADCON0),A/D控制寄存器的设定(ADCON1),A/D变换开始(ADCON0),A/D变换结果的读出,转向程序,800HZ脉冲波形输出的程序,THEEND,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 mcu m16c 应用 举例