標(biāo)題:
單片機(jī)模仿舵機(jī)測(cè)試儀 按鍵控制 源程序
[打印本頁(yè)]
作者:
davidxu
時(shí)間:
2021-8-19 22:49
標(biāo)題:
單片機(jī)模仿舵機(jī)測(cè)試儀 按鍵控制 源程序
我想模仿舵機(jī)測(cè)試儀,但是把旋鈕改成按鍵,用按鍵控制檔位, 空檔-1檔-2檔-3檔-空檔 循環(huán)
現(xiàn)在遇到兩個(gè)問題,請(qǐng)教高手:
1。按鍵反應(yīng)不是很靈敏,有時(shí)要按好幾次才有用
2。 從空檔 - 1檔 -2檔 -3檔 切換正常,但從3檔切換到空檔時(shí)切換不到了,會(huì)跳到1檔,不知道是什么問題
單片機(jī)代碼如下:
#include <REG51.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit motor=P3^2; //接舵機(jī)
sbit key=P3^4; //用按鍵控制檔位, 空檔-1檔-2檔-3檔-空檔 循環(huán)
sbit led=P3^3; //led閃動(dòng)幾次表明當(dāng)前檔位
uint a; //轉(zhuǎn)動(dòng)角度
uchar num=1;
uchar dangwei=0; //擋位
int i;
sfr AUXR=0x8E;
void delay(unsigned char z)
{
unsigned char x,y;
for(x=125;x>0;x--)
for(y=z;y>0;y--);
}
//延時(shí)1毫秒
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
//延時(shí)n毫秒函數(shù)
void DelayMs(unsigned int n)
{
do
{
Delay1ms();
}while(n--);
}
void delayms1(void) //延時(shí)函數(shù)
{
unsigned int i;
i = 1000;
while(i--);
}
//閃燈函數(shù) 根據(jù)n確定閃爍間隔毫秒
void Flash(unsigned int n)
{
led=1;
DelayMs(n);
led=0;
DelayMs(n);
}
void T0_time() interrupt 1
{
switch(num)
{
case 0:
TH0=(58300-a*120)/256;
TL0=(58300-a*120)%256;
motor=1;
num=1;
break;
case 1:
TH0=(15800+a*121)/256;
TL0=(15800+a*121)%256;
motor=0;
num=2;
break;
case 2:
TH0=0x27;
TL0=0xc4;
motor=0;
num=3;
break;
case 3:
TH0=0x27;
TL0=0xc4;
motor=0;
num=4;
break;
case 4:
TH0=0x27;
TL0=0xc4;
motor=0;
num=0;
break;
}
}
void T0_init()
{
AUXR=0X80;
TMOD|=0x01;
TH0=0x27;
TL0=0xc4;
EA=1;
ET0=1;
TR0=1;
}
void main(void)
{
T0_init();
key=1;
dangwei=0; //默認(rèn)檔位0,空檔
a=25; //舵機(jī)初始位置
while(1)
{
//a=150; //最高轉(zhuǎn)角,對(duì)比舵機(jī)測(cè)試儀得到
//a=25; //最低轉(zhuǎn)角,對(duì)比舵機(jī)測(cè)試儀得到
if (key==0)
{
DelayMs(3); //按下延時(shí),消抖
if (key==0) {
led = 1;
dangwei = dangwei + 1; //按鍵增加檔位
}
}
if (dangwei > 3) //當(dāng)前檔位是最高檔時(shí),轉(zhuǎn)空檔
{
led = 1;
dangwei = 0; //空檔
a = 25;
}
if (dangwei == 0) { //空檔
a=25; led = 1;
} else if (dangwei ==1) { //低速
a = 70; Flash(200); led=1; DelayMs(1000);
} else if (dangwei == 2) { //中速
a =110; Flash(200);Flash(200); led=1; DelayMs(1000);
} else if (dangwei == 3) { //全速
a=150; Flash(200);Flash(200);Flash(200); led=1; DelayMs(1000);
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1