假設(shè)左轉(zhuǎn)90度和右轉(zhuǎn)90度對應(yīng)的脈沖寬度1ms、PWM信號的周期為20ms,步驟:設(shè)置PWM信號的周期;根據(jù)所需的角度,設(shè)置PWM信號的高電平時間。
- ORG 0000H ; 程序起始地址
- LJMP START ; 跳轉(zhuǎn)到程序開始處
- ORG 000BH ; 定時器0中斷向量地址
- LJMP TIMER0_ISR ; 跳轉(zhuǎn)到定時器0中斷服務(wù)程序
- START:
- MOV TMOD, #01H ; 設(shè)置定時器0為模式1(16位定時器)
- MOV TH0, #0FCH ; 定時器0高8位初值(假設(shè)周期為20ms)
- MOV TL0, #66H ; 定時器0低8位初值
- SETB ET0 ; 使能定時器0中斷
- SETB TR0 ; 啟動定時器0
- CLR P1.0 ; 假設(shè)P1.0連接舵機控制信號; 左轉(zhuǎn)90度,輸出1ms脈沖
- MOV R0, #1000 ; 假設(shè)1ms需要1000個機器周期(具體根據(jù)單片機時鐘頻率算)
- LCALL DELAY_MS
- SETB P1.0 ; 設(shè)置P1.0為高電平
- MOV R0, #9999 ; 20ms - 1ms = 19ms,假設(shè)需要9999個機器周期
- LCALL DELAY_MS
- CLR P1.0 ; 清除P1.0為高電平; 右轉(zhuǎn)90度,輸出1.5ms脈沖
- MOV R0, #1500 ; 假設(shè)1.5ms需要1500個機器周期
- LCALL DELAY_MS
- SETB P1.0 ; 設(shè)置P1.0為高電平
- MOV R0, #9400 ; 20ms - 1.5ms = 18.5ms,假設(shè)需要9400個機器周期
- LCALL DELAY_MS
- CLR P1.0 ; 清除P1.0為高電平
- SJMP $ ; 無限循環(huán)
- DELAY_MS:
- MOV R1, R0 ; 將延時計數(shù)值存入R1
- DJNZ R1, $ ; 延時循環(huán)
- RET
復(fù)制代碼 |