|
第一次發文 如有冒犯 請見諒!!
目前是使用網路上找到的這個程式碼 並且自己修改以下為程式碼
#include <regx51.h>
unsigned int dutytime=45536; //65536-45536就是責任週期
unsigned int ton=10000; //高電位比例=50%
unsigned int toff=10000; //低電位比例=50%
unsigned int temp; //給計時器工作用
void delay(int); // 宣告延遲函數
void timer0_initialize(void) //初始化計時器0
{
EA=0; //關閉中斷功能(所有中斷副程式失效)
IE|=0x02; //開啟計時器中斷功能
TMOD|=0x01; //設定計時器模式
temp=65536-dutytime; //設定中斷一次的時間(預設是dutytime)
TH0=temp/256; //填入高八位
TL0=temp%256; //填入低八位
TR0=1; //啟動計時器
EA=1; //開啟中斷功能(中斷副程式可以執行)
}
void timer0_isr(void) interrupt TF0_VECTOR using 1 //使用計時器中斷副程式產生PWM
{
if(P2_0==1)
{
TR0=0;
temp=65536-toff;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P2_0=0;
}
else
{
TR0=0;
temp=65536-ton;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P2_0=1;
}
}
void main(void) //主程式開始
{
timer0_initialize(); //呼叫計時器初始化副程式
//主程式中可直接改變ton或toff即可改變高電位跟低電位佔的比例
while(1)
{
if(P1_0==0)ton=2200; //2.2ms 左轉
delay(400); //延遲1秒 //if(P1_1==0)ton=1500; //1.5ms 中間
ton=900; //0.9ms 右轉 角度0.5~2.2之間都可調角度
toff=20000-ton;
}
}
//==副程式=============================================
/* 延遲函數,延遲約x 5ms */
void delay(int x) // 延遲函數開始
{ int i,j; // 宣告整數變數i,j
for (i=0;i<x;i++) // 計數x次,延遲x 5ms
for (j=0;j<600;j++);// 計數600次,延遲5ms
} // 延遲函數結束
但是 我現在想要控制兩顆SERVO
動作方式如下 開關打開 第一顆SERVO轉到2.2MS 停頓約1秒後 第二顆SERVO轉到2.2MS
然後第二顆SERVO轉到2.2MS後馬上回到0.9MS 然後第一顆SERVO關閉
想請教各位先進 8051可以做到這樣的控制嗎?? |
|