標(biāo)題:
[求助]51單片機(jī)控制舵機(jī)程序
[打印本頁]
作者:
xiaohouzi001
時(shí)間:
2012-5-11 19:44
標(biāo)題:
[求助]51單片機(jī)控制舵機(jī)程序
向各位大俠求助,用51單片機(jī)控制舵機(jī)旋轉(zhuǎn),90度180度都可以,最好將程序略加注釋,感謝!!
作者:
20151470
時(shí)間:
2017-2-12 14:50
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; //定義調(diào)速的按鍵
sbit DC = P1^0; //定義直流電機(jī)的控制端口
uchar CYCLE; //定義周期
uchar PWM; //定義低電平時(shí)間
/*********************************
函數(shù):Delay_1ms()
參數(shù):t
返回:無
功能:延時(shí)子程序,延時(shí)時(shí)間為 1ms * del。
使用晶振是11.0592M。
**********************************/
void Delay_1ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{
for(j=0;j<=100;j++)
{
_nop_();
}
}
}
/*********************************
函數(shù):Time0Init()
參數(shù):無
返回:無
功能:設(shè)置定時(shí)器0的工作方式2定時(shí)時(shí)長(zhǎng)為100微秒,
并打開中斷和啟動(dòng)定時(shí)器。
該例中使用的單片機(jī)晶振為11.0592M。
**********************************/
void Time0Init(void)
{
TMOD = 0x02; //設(shè)定定時(shí)器0工作在方式2模式
TH0 = 0xA3; //定時(shí)時(shí)長(zhǎng)為100微秒的初值自動(dòng)重載
TL0 = 0xA3; //定時(shí)時(shí)長(zhǎng)為100微秒的初值
ET0 = 1; //打開定時(shí)器0中斷
EA = 1; //打開總中斷
TR0 = 1; //啟動(dòng)定時(shí)器
}
/*********************************
函數(shù):Time0Int()
參數(shù):無
返回:無
說明:定時(shí)器0中斷函數(shù)。用于處理PWM的信號(hào)。
**********************************/
void Time0Int(void) interrupt 1 using 1
{
static uchar Count; //當(dāng)前處于周期的什么時(shí)刻
if(Count == PWM) //判斷低電平時(shí)間是否結(jié)束
{
DC = 1; //直流電機(jī)轉(zhuǎn)
}
Count++;
if(Count == CYCLE) //一個(gè)周期結(jié)束
{
Count=0;
if(PWM != 0) //如果左右時(shí)間是0 保持原來狀態(tài)
{
DC = 0; //直流電機(jī)不轉(zhuǎn)
}
}
}
/*********************************
函數(shù):Key()
參數(shù):無
返回:無
功能:判斷KEY1是否按下并讓數(shù)碼管顯示和給PWM提供低電平時(shí)長(zhǎng)。
**********************************/
void Key(void)
{
static uchar Number = 1; //定義檔位,初始化為1檔
if(KEY1 == 0) // 判斷是否有按鍵按下
{
Delay_1ms(15); //延時(shí)抗干擾信號(hào)
if(KEY1 == 0) //再次判斷是否有按鍵按下
{
Number++; //按一下P3.2口,就給直流電機(jī)換一個(gè)檔位
if(Number == 6) //等于6時(shí),給檔位重新賦值1
{
Number = 1;
}
switch(Number)
{
case 1:
{
P0=0x06; //數(shù)碼管顯示1
PWM=175; //高電平2.5毫秒,舵機(jī)旋轉(zhuǎn)到右極限(為+90度)
break;
}
case 2:
{
P0=0x5B; //數(shù)碼管顯示2
PWM=180; //高電平2毫秒,舵機(jī)旋轉(zhuǎn)角度為+45度
break;
}
case 3:
{
P0=0x4F; //數(shù)碼管顯示3
PWM=185; //高電平1.5毫秒,舵機(jī)旋轉(zhuǎn)角度為0度
break;
}
case 4:
{
P0=0x66; //數(shù)碼管顯示4
PWM=190; //高電平1毫秒,舵機(jī)旋轉(zhuǎn)角度為-45度
break;
}
case 5:
{
P0=0x6d; //數(shù)碼管顯示5
PWM=195; //高電平0.5毫秒,舵機(jī)旋轉(zhuǎn)角度為-90度
break;
}
default:
break;
}
while(1) //按鍵釋放
{
if(KEY1 == 1) //判斷是否釋放
{
break;
}
}
}
}
}
/*********************************
函數(shù):Main()
參數(shù):無
返回:無
功能:主函數(shù)
**********************************/
void main(void)
{
Time0Init(); //定時(shí)器0初始化
CYCLE = 200; //定義PWM周期為20毫秒
P2 = 0xfe; //數(shù)碼管最后一位亮
while(1)
{
Key();
}
}
作者:
LEMONLEMON
時(shí)間:
2018-12-18 23:40
#include <reg52.h>
unsigned char count; //0.5ms次數(shù)標(biāo)識(shí)
sbit pwm=P1^0; //信號(hào)輸出
sbit jia=P1^1; //角度增加按鍵
sbit jan=P1^2; //角度減小按鍵
char jd; //角度標(biāo)識(shí)
void delay(unsigned int i)
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void Time0_init() //定時(shí)器初始化
{
TMOD=0x01;
IE=0x82;
TH0=0xff;
TL0=0x19; //12晶振,0.25ms
TR0=1; //定時(shí)器開始
}
void Time0_int() interrupt 1 //中斷程序
{
TH0=0xff;
TL0=0x19;
if(count<jd) //輸出count個(gè)高電平
pwm=1;
else
pwm=0; //其余輸出低電平
count++;
count=count%40; //時(shí)鐘保持40個(gè)count 即20ms
}
void keyscan() //按鍵掃描
{
if(jia==0) //角度增加鍵是否按下
{
delay(50); //按下延時(shí),消抖
if(jia==0)
{
jd++; //角度標(biāo)識(shí)加1
count=0; //按鍵按下,則20ms周期重新開始
if(jd==50)
jd=9; //已經(jīng)是180°則保持
while(jia==0); //等待按鍵放開
}
}
if(jan==0) //角度減小鍵是否按下
{
delay(10);
if(jd==0);
{
jd--; //角度標(biāo)識(shí)減1
count=0;
if(jd==0)
jd=1;
while(jan==0);
}
}
}
void main()
{
jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
// display();
}
}
作者:
qqj
時(shí)間:
2025-3-28 23:15
20151470 發(fā)表于 2017-2-12 14:50
#include
#include
#define uchar unsigned char
請(qǐng)問大佬有這個(gè)proteus的仿真連線圖嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1