⑴ 单片机定时器的汇编语言程序编程
1、
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV R2,#00H
MOV TMOD,#20H
MOV TH1,#231
MOV TL1,#231
SETB P1.2
SETB TR1
HERE: JNB TF1,HERE
PT_1: CJNE R2,#07H,PT11
SETB P1.2
MOV R2,#00H
CLR TF1
AJMP HERE
PT11: CLR P1.2
INC R2
CLR TF1
AJMP HERE
END
2、
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP IT_0
ORG 001BH
AJMP IT_1
ORG 0100H
MAIN: MOV TMOD,#51H
MOV TH1,#0FCH
MOV TL1,#18H
MOV IE,#10001010B
SETB TR1
SJMP $
IT_1: CLR TR1
MOV TH0,#0FCH
MOV TL0,#18H
SETB TR0
RETI
IT_0: CLR TR0
MOV TH1,#0FCH
MOV TL1,#18H
SETB TR1
RETI
END
⑵ msp430单片机用定时器A测量方波相位差的程序如何编写真的很急!拜托了!
这个简单,把两个方波进行异或,用430单片机的定时器A测量异或后的方波的脉冲宽度,在对测量数据进行简单的计算就可得到相位差。。。具体程序如下:
P1SEL |= BIT2; //设置P1.2端口为功能模块使用
TACTL |=TACLR;
TACTL = TASSEL_2+TAIE+MC1; //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
CCTL1 =CM0+SCS+CAP+CCIE; //输入上升沿捕获,同步,capture模式 CCI0A为捕获信号源,中断使能
//TACCTL1 &=~CCIFG; //清CCR2 的标志位
//中断允许
_EINT();
LPM0;
}
#pragma vector=TIMERA1_VECTOR //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV) //向量查询
{ case 2: //捕获中断
if(CCTL1&CM0) //上升沿
{
CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发
start=TACCR1; //记录初始时间
overflow=0; //溢出计数变量复位
}
else if(CCTL1&CM1) //下降沿
{
CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发
end=TACCR1; //用start,end,overflow计算脉冲宽度
TACTL &=~TAIE; //不使能中断
CCTL1 &=~CCIE;
P1SEL &=~BIT2;
_DINT();
LPM0_EXIT;
}
break;
case 10: //定时器溢出中断
overflow++;
break; //溢出计数加1
default:break;
}
}
然后再对得到的start,end,overflow处理计算即可。。。
⑶ 求一个用MSP430单片机编程的到10秒单片机进入休眠状态,到了20秒后又能唤醒的程序。
/*初始化定时器a*/
main()
{ CCR0 = 32767; //设置定时器A的中断时间为1S
TACTL = TASSEL_1 + MC_1; //计数时钟ACLK, 增计数模式8分频+ID_3
CCTL0 |= CCIE; //使能CCR0比较中断
uchar miao=20;
while(1){
if(miao==10) LPM1;
}
}
/*******************************************
函数名称:_ISR
功 能:定时器A的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
if(miao==0) LPM1_EXIT; //退出低功耗模式
miao--;
}