⑴ 單片機定時器的匯編語言程序編程
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--;
}