- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
t++;
TFLG2|=0x80;//定时器器溢出标志位置位
if(t==5)
{
t=0;
PORTB=~PORTB;
EnableInterrupts;
}
}
这个程序让我知道了定时器溢出中断的使用方法,为我今后进行别的模块的学习打下了好的基础,也使我更加有信心!!
7.所谓输入捕捉功能
在输入捕捉模式下,相应的输入捕捉通道通过捕捉该管教上的电平变化发出锁存信号,将该时刻计数器的值锁存到捕捉寄存器中,通过连续的测量,记录下每次锁存的值就可以计算出脉冲的宽度或者周期信息。
TCTL3=0x03;//设置通道4为上升下降沿都捕捉
TIE=0x10;//使能通道4捕捉中断
EnableInterrupts;//使能全局中断
}
中断服务程序也很重要,最主要就是不能少了两个标志位清零的语句,示例如下:
#pragma CODE_SEG NON_BANKED
void interrupt 12 catch_in4_()
6.定时器溢出中断的使用
下面简单介绍一下使用中学到的,首先锁相环程序的首次使用成功
例如:
void clock_init()//24M锁相环时钟
{
uchar m=0;
CLKSEL=0x00;//时钟选择寄存器清零,不使能锁相环时钟
PLLCTL|=0x40;//锁相环控制寄存器第6位置1,允许使用锁相环
10.脉冲累加器A的使用
首先是初始化
控制寄存器:使能16位脉冲累加器,选择工作模式(用到编码器上,则是用事件计数模式),有效边沿设定,时钟选择。
脉冲累加计数寄存器:这个用于记录事件计数的个数,溢出时能够产生中断。
下面给出使用的初始化程序:
2.SPI总线接口
SPI是一种高速高效的同步串行接口,这种接口主要用于MCU与外部的接口芯片交换数据,只要有SPI口的芯片都可以与单片机相连形成主从机系统进行数据的传递,比如SPI用于移位寄存器74HC164,这是个串入并出的芯片这样可以实现扩展IO口。还有AD转换芯片AD7793,可以实现数模转换,还有飞思卡尔公司的电源管理芯片MC33389。
1.对IO口输入输出操作程序举例:A口接流水灯并实现闪烁
void main(void) {
while(1)
{
DDRA=0xff;
delay(500);
PORTA=0xff;
delay(500);
PORTA=0;
}
另外,B、E口的IO功能操作也是一样的,因为位数一样寄存器一样,其他口的寄存器就不太一样了!J,P,M,T,S这五个口除具有数据寄存器外,他们都另外多出另一个端口输入寄存器(该寄存器功能我未知)!
9.PWM
初始化程序流程是
允许PWM——选择PWM时钟——选择极性 对齐方式——选择周期脉宽占空比——计数器清零 开始计数
PWM的应用,把初始化程序都写好后,把占空比的值设置为一个变量赋予的形式,这样每次需要调速的时候只用调用这个函数,改变一下占空比就行啦!
舵机的调速要实现平滑就要在调速的时候给定量一点一点变化!这个有待调试!!
如果配合输出比较功能,还可以产生一段时间的延迟,例如:当需要在一个外部事件发生一定时刻后,单片机产生一个输出信号来控制某个操作。这既可以利用输入捕捉来记录外部事件发生的时刻,把这个时间加上一定的延时值送到输出比较寄存器,并允许输出比较功能就可以达到延迟目的!!
首先介绍不带缓冲的输入捕捉通道:
HCS2增强型定时器中共有8个输入捕捉通道,其中4个(PT4~PT7)和普通的输入捕捉通道一样,带有一个捕捉寄存器用来记录管教上的电平变化时自由计数器的锁存值。当ICOVW寄存器的NOVWx位清零时,每发生一次输入捕捉,新的计数器的值就会覆盖原来的输入捕捉寄存器的内容;当该位置1时,除非输入捕捉寄存器为空,否则新的值不能写入(使输入捕捉寄存器为空的方法就是读取该寄存器)。这样就避免了新的计数值覆盖旧的计数值。
因设备有限此功能待以后调试!
3.SCI总线接口
MC9S12DG128单片机有两个SCI模块,可以选用其中任何一个。他的使用有8个相应寄存器共设置,其中有波特率设置寄存器SCIBDH,SCIBDL,还有控制寄存器SCICR1,SCICR2,状态寄存器SCISR1,SCISR2,数据寄存器SCIDRH,SCIDRL;
举个例子:
设置总线频率为24MHz
CLKSEL=0x00;
PLLCTL|=0x40;
SYNR=2;
REFDV=1;
Delawenku.baidu.com();
While(!(CRGFLG_LOCK==1)) ;或while(!(CRGFLG&0x08==0x08));
CLKSEL|=0x80;
这样一个锁相环程序就完成了,设置的总线频率为24M;
SYNR=2;
REFDV=1;
m++;//延时以使锁相环时钟稳定
m++;
m++;
while(CRGFLG&0x08==0x08)
CLKSEL|=0x80;//当判断时钟稳定时,时钟选择器第7位置1,使能锁相环时钟
}
下面介绍定时器溢出使用的初始化程序
例如:
void timerout_init()//定时器初始化
带缓冲的输入捕捉通道:
另外4个带缓冲的输入捕捉通道(PT0~PT3),除了带有捕捉寄存器之外,还有一个保持寄存器,可以在不产生中断的条件下连续记录两次自由计数器的值。他有两种工作方式,锁存方式:当模数计数器减为0,向模数计数器写入“$0000”或写强制锁存位ICLAT时,输入捕捉计数器 值将锁存到相应的通道的保持寄存器中,并将输入捕捉计数器清零。当ICOVW寄存器的NOVWx位清零时,每次发生输入捕捉事件时,新的计数值将覆盖旧的输入捕捉寄存器值,如果是锁存方式,则保持寄存器中的内容将被更新。
例如下面的程序:
#include <hidef.h>
#include "derivative.h"
void TimerOverflow()
{
unsigned char i=1,j=0x80;
while((i!=0)&&(j!=0))
{
PORTB=~(i|j);
i<<=1;//B口实现流水的移位操作
j>>=1;
while(TCNT!=0x0000);//对比定时器寄存器
while(TCNT==0x0000);
}
}
void main(void)
{
EnableInterrupts;
TSCR1=0x80;//定时器使能
TSCR2=0x06;//设置时钟预分频为64
DDRB=0xff;
PORTB=0xff;
for(;;)
{
TimerOverflow();
}
}
5.系统时钟锁相环
锁相环的初始化比较麻烦,与此相关的控制寄存器有:
锁相环控制寄存器PLLCTL
时钟合成寄存器SYNR,有效值为0-63
时钟分频寄存器REFDV,有效值为0-15
时钟产生模块的标志寄存器ORGFLG
时钟选择寄存器CLKSEL
锁相环初始化的步骤为:时钟选择寄存器清零(不使能锁相环,该功能有CLKSEL的最高位控制,即CLKSEL=0x00)——锁相环电路允许设置(该功能由PLLCTL的第6位控制,将其置1即可,注意该寄存器的设置必须进行位操作)——然后就是对SYNR和REFFV进行赋值,根据公式设定总线时钟fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)——然后延时几个总线周期以等待时钟频率稳定——判断时钟频率是否稳定(该功能与ORGFLG有关,当该寄存器的LOCK位,第3位为1时表明频率已经稳定,故该处用一判断语句设置)——最后就是允许锁相环时钟作为系统时钟了(该功能由CLKSEL的最高位控制,置1即选定)
{
TSCR1|=0x80;//定时器允许工作
TSCR2|=0x80;//定时器溢出中断允许
TSCR2|=0X07;//时钟128分频
EnableInterrupts;//使能中断
}
还有相应的中断服务程序
例如:
#pragma CODE_SEG NON_BANKED
void interrupt 16 timeout_int()
当该位置1时,除非输入捕捉寄存器或是保持寄存器为空,否则新的计数器的值将不能写入。队列方式:当ICOVW寄存器的NOCWx位清零时,每发生输入捕捉事件,输入捕捉寄存器的值将被写入保持寄存器中,新的计数器的值将记录在输入捕捉寄存器中。当该位置1时,除非输入捕捉寄存器或是保持寄存器为空,否则新的计数值竟不能写入。
{}
SCIDRL=C;//C代表需要传送的数据
4.有关定时器TCNT
TCNT是芯片内部的16位主定时器,他不停地对内部时钟信号进行计数,从0x0000直到0xffff,计满后溢出又返回到0x0000,程序随时可以读取,但在普通模式下禁止写入。TCNT应该按字访问,分别访问高低字节将出现错误!
可以直接利用它的来实现一些延时的功能!
{
TFLG2=0x80;//指示中断发生时刻的中断标志位清零
TFLG1=0x10;//指示中断发生通道标志位清零------这两个标志寄存器不一样
t++;
if(t==5)
{
t=0;
PORTA|=0x55;
PORTB=~PORTB;
delay();
}
EnableInterrupts;
}
就这样吧,一个简单的输入捕捉的程序就完整了!
简单讲SCI的使用就是寄存器初始化,数据传送方式设置,下面举个初始化使用的简单例子:SCICR2=0x08;//发送使能设置
SCIBDH=0x00;//波特率设置为9600
SCIBDL=0x9c;
就是这样这个是简单实用时的设置,发送函数如下:
While(!(SCISR1&0x40))//检测是否发送完毕,一旦发送完毕就进入到死循环里边
8.输入捕捉使用总结。
测试了一下通道4的输入捕捉功能,但最终还是多方了解资料才最终得以成功!
主要是初始化程序,示例如下:
void catch_in4_init()//不带缓冲输入捕捉初始化
{
TIOS=0x00;//设置通道为输入捕捉方式
TSCR1=0x80;//使能定时计数器工作
TSCR2=0x07;//设置时钟128分频