
SIMULATOR仿真,
调用delay1ms(1);
查看调用该函数启始时的CPU register中的cyclecounter的差值,乘以MCLK时钟周期 ,就是精确的延时时间。
要求没中断,若函数运行时有中断产生,要加上中断时间。
没用过这款单片机,但是大致代码如下
定义一个按键key 控制倍数
char beishu=1;
if(key被按下)//倍数选择 共1 2 3三档 最好加个按键防抖程序
{
if(beishu=4)
beishu=1;
beishu++;
}
然后延时程序这样写
for(j=1500000beishu;j>0;j--)
32768和500的最大公约数是4,所以将定时器设为计数4次中断一次,同时在中断里把一个计数用的全局变量加1当这个变量增加到125,将其清零同时执行你想以2ms周期执行的任务。中断服务如下
int cnt=0;
void interrupt_hadler(void){
cnt++;
if(cnt>125){
cnt=0;
do_your_task();
}
}
虽然程序很简短,但问题还真多!
1 最严重的问题,请不要在中断程序用使用外部延时函数,很危险也不效率,失去了定时器本身的作用。
2 在表示I/O端口某位的时候,最好用BIT0BIT7。
3 判断P21是否为1应该写成 if ((key & BIT1) != 0)。
4 CCR0不是计数器,是PWM或者捕获用的,只需要设置一次就行了。建议用TIME溢出中断,并每次更新TA0R和手动清除中断标志位。
void delay(void)
{
uchar i;
for(i=0;i<100;i++)
{
_nop_();_nop_();//6MHZ下一个NOP是20us,4ms就是200个NOP
}
}
如果FOSC=12MHZ单片机,那么一个机器周期为12/12M=1us
如果是汇编语言的话:
L1:MOV R7,#100
L2:MOV R6,#100
L3:MOV R5,#50
DJNZ R5,$;此句两个机器周期也就是2T
DJNZ R6,L3
DJNZ R7,L2
RET
2T50100100=1,000,000us(共一秒),这是粗略算法,有误差,但不是太大。
以上就是关于msp430如何用iar软件 仿真精确的延时时间,急需,,谢谢。。。全部的内容,包括:msp430如何用iar软件 仿真精确的延时时间,急需,,谢谢。。。、求完善一个延时时间可调的C语言控制程序、跪求MSP430单片机在32768晶振下的精准延时2ms的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)