标题:
单片机舵机按键控制程序单片机问题
[打印本页]
作者:
J.C.Maxwell
时间:
2018-12-10 10:43
标题:
单片机舵机按键控制程序单片机问题
STC89C52RC单片机控制六路舵机的按键程序怎么写? 是这样吗?
#include <reg52.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar flag1; //舵机按键标志
uchar flag2; //舵机按键标志
uchar flag3; //舵机按键标志
uchar flag4; //舵机按键标志
uchar flag5; //舵机按键标志
uchar flag6; //舵机按键标志
uchar order=0;
sbit KEY1_1=P1^0; //第一路按键1
sbit KEY1_2=P1^1; //第一路按键2
sbit PWM_OUT1=P2^1; //第一路PWM输出口
sbit KEY2_1=P1^2; //第二路按键1
sbit KEY2_2=P1^3; //第二路按键2
sbit PWM_OUT2=P2^2; //第二路PWM输出口
sbit KEY3_1=P1^4; //第三路按键1
sbit KEY3_2=P1^5; //第三路按键2
sbit PWM_OUT3=P2^3; //第三路PWM输出口
sbit KEY4_1=P1^6; //第四路按键1
sbit KEY4_2=P1^7; //第四路按键2
sbit PWM_OUT4=P2^4; //第四路PWM输出口
sbit KEY5_1=P3^2; //第五路按键1
sbit KEY5_2=P3^3; //第五路按键2
sbit PWM_OUT5=P2^5; //第五路PWM输出口
sbit KEY6_1=P3^4; //第六路按键1
sbit KEY6_2=P3^5; //第六路按键2
sbit PWM_OUT6=P2^6; //第六路PWM输出口
uint PWM_Value1; //定义pwm值
uint PWM_Value2;
uint PWM_Value3;
uint PWM_Value4;
uint PWM_Value5;
uint PWM_Value6;
void Delay(unsigned int s) //延迟子函数
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
/*定时器初始化*/
void Init_Timer0()
{
TMOD=0x11;
TH0=(65536-1500)/256;
TL0=(65536-1500)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
PT0=1;
}
/*主函数*/
void main(void)
{
Delay(6000);
PWM_Value1 = 1250; //pwm初值为1500
PWM_Value2 = 1250;
PWM_Value3 = 1250;
PWM_Value4 = 1250;
PWM_Value5 = 1250;
PWM_Value6 = 1250;
Init_Timer0();
while(1)
{
/*第一路*/
if((KEY1_1 ==0 )||(KEY1_2 ==0 )) //按键1或按键2被按下
{
if(KEY1_1 ==0 ) //确认按键1被按下
{
flag1 = 1; //标志位赋值1
}
if(KEY1_2 ==0 ) //确认按键2被按下
{
flag1 = 2; //标志位赋值2
}
}
else
{
flag1 = 0; //否则标志位为0
}
Delay(20); //延时20ms
/*第二路*/
if((KEY2_1 ==0 )||(KEY2_2 ==0 )) //按键1或按键2被按下
{
if(KEY2_1 ==0 ) //确认按键1被按下
{
flag2 = 1; //标志位赋值1
}
if(KEY2_2 ==0 ) //确认按键2被按下
{
flag2 = 2; //标志位赋值2
}
}
else
{
flag2 = 0; //否则标志位为0
}
Delay(20); //延时20ms
/*第三路*/
if((KEY3_1 ==0 )||(KEY3_2 ==0 )) //按键1或按键2被按下
{
if(KEY3_1 ==0 ) //确认按键1被按下
{
flag3 = 1; //标志位赋值1
}
if(KEY3_2 ==0 ) //确认按键2被按下
{
flag3 = 2; //标志位赋值2
}
}
else
{
flag3 = 0; //否则标志位为0
}
Delay(20); //延时20ms
/*第四路*/
if((KEY4_1 ==0 )||(KEY4_2 ==0 )) //按键1或按键2被按下
{
if(KEY4_1 ==0 ) //确认按键1被按下
{
flag4 = 1; //标志位赋值1
}
if(KEY4_2 ==0 ) //确认按键2被按下
{
flag4 = 2; //标志位赋值2
}
}
else
{
flag4 = 0; //否则标志位为0
}
Delay(20); //延时20ms
/*第五路*/
if((KEY5_1 ==0 )||(KEY5_2 ==0 )) //按键1或按键2被按下
{
if(KEY5_1 ==0 ) //确认按键1被按下
{
flag5 = 1; //标志位赋值1
}
if(KEY5_2 ==0 ) //确认按键2被按下
{
flag5 = 2; //标志位赋值2
}
}
else
{
flag5 = 0; //否则标志位为0
}
Delay(20); //延时20ms
/*第六路*/
if((KEY6_1 ==0 )||(KEY6_2 ==0 )) //按键1或按键2被按下
{
if(KEY6_1 ==0 ) //确认按键1被按下
{
flag6 = 1; //标志位赋值1
}
if(KEY6_2 ==0 ) //确认按键2被按下
{
flag6 = 2; //标志位赋值2
}
}
else
{
flag6 = 0; //否则标志位为0
}
Delay(20); //延时20ms
}
}
/*****中断程序*******/
void timer0(void) interrupt 1
{
if(flag1==1) PWM_Value1 += 10; //如果标志位为1时,pwm的值加1
if(flag1==2) PWM_Value1 -= 10; //如果标志位为2时,pwm的值减1
if(PWM_Value1>=2500) //如果pwm的值大于2500
PWM_Value1 = 2500; //则保持在2500
if(PWM_Value1<=500) //如果pwm的值小于500
PWM_Value1=500; //则保持在500
if(flag2==1) PWM_Value2 += 10; //如果标志位为1时,pwm的值加1
if(flag2==2) PWM_Value2 -= 10; //如果标志位为2时,pwm的值减1
if(PWM_Value2>=2500) //如果pwm的值大于2500
PWM_Value2 = 2500; //则保持在2500
if(PWM_Value2<=500) //如果pwm的值小于500
PWM_Value2=500; //则保持在500
if(flag3==1) PWM_Value3 += 10; //如果标志位为1时,pwm的值加1
if(flag3==2) PWM_Value3 -= 10; //如果标志位为2时,pwm的值减1
if(PWM_Value3>=2500) //如果pwm的值大于2500
PWM_Value3 = 2500; //则保持在2500
if(PWM_Value3<=500) //如果pwm的值小于500
PWM_Value3=500; //则保持在500
if(flag4==1) PWM_Value4 += 10; //如果标志位为1时,pwm的值加1
if(flag4==2) PWM_Value4 -= 10; //如果标志位为2时,pwm的值减1
if(PWM_Value4>=2500) //如果pwm的值大于2500
PWM_Value4 = 2500; //则保持在2500
if(PWM_Value4<=500) //如果pwm的值小于500
PWM_Value4=500; //则保持在500
if(flag5==1) PWM_Value5 += 10; //如果标志位为1时,pwm的值加1
if(flag5==2) PWM_Value5 -= 10; //如果标志位为2时,pwm的值减1
if(PWM_Value5>=2500) //如果pwm的值大于2500
PWM_Value5 = 2500; //则保持在2500
if(PWM_Value5<=500) //如果pwm的值小于500
PWM_Value5=500; //则保持在500
if(flag6==1) PWM_Value6 += 10; //如果标志位为1时,pwm的值加1
if(flag6==2) PWM_Value6 -= 10; //如果标志位为2时,pwm的值减1
if(PWM_Value6>=2500) //如果pwm的值大于2500
PWM_Value6 = 2500; //则保持在2500
if(PWM_Value6<=500) //如果pwm的值小于500
PWM_Value6=500; //则保持在500
switch(order)
{
case 1:(PWM_OUT1=1);
TH0=(65536-PWM_Value1)>>8;
TL0=(uchar)(65536-PWM_Value1);
break;
case 2:(PWM_OUT1=0);
TH0=(65536-(5000-PWM_Value1))>>8;
TL0=(uchar)(65536-(5000-PWM_Value1));
break;
case 3:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 4:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
case 5:(PWM_OUT2=1);
TH0=(65536-PWM_Value2)>>8;
TL0=(uchar)(65536-PWM_Value2);
break;
case 6:(PWM_OUT2=0);
TH0=(65536-(5000-PWM_Value2))>>8;
TL0=(uchar)(65536-(5000-PWM_Value2));
break;
case 7:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 8:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
case 9:(PWM_OUT3=1);
TH0=(65536-PWM_Value3)>>8;
TL0=(uchar)(65536-PWM_Value3);
break;
case 10:(PWM_OUT3=0);
TH0=(65536-(5000-PWM_Value3))>>8;
TL0=(uchar)(65536-(5000-PWM_Value3));
break;
case 11:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 12:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
case 13:(PWM_OUT4=1);
TH0=(65536-PWM_Value4)>>8;
TL0=(uchar)(65536-PWM_Value4);
break;
case 14:(PWM_OUT4=0);
TH0=(65536-(5000-PWM_Value4))>>8;
TL0=(uchar)(65536-(5000-PWM_Value4));
break;
case 15:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 16:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
case 17:(PWM_OUT5=1);
TH0=(65536-PWM_Value5)>>8;
TL0=(uchar)(65536-PWM_Value5);
break;
case 18:(PWM_OUT5=0);
TH0=(65536-(5000-PWM_Value5))>>8;
TL0=(uchar)(65536-(5000-PWM_Value5));
break;
case 19:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 20:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
case 21:(PWM_OUT6=1);
TH0=(65536-PWM_Value6)>>8;
TL0=(uchar)(65536-PWM_Value6);
break;
case 22:(PWM_OUT6=0);
TH0=(65536-(5000-PWM_Value6))>>8;
TL0=(uchar)(65536-(5000-PWM_Value6));
break;
case 23:
TH0=60536>>8;
TL0=(uchar)60536;
break;
case 24:
TH0=60536>>8;
TL0=(uchar)60536;
order=0;
break;
default: order=0;
break;
}
order++;
}
复制代码
作者:
1ZAQ
时间:
2024-5-9 14:36
可以,没什么问题
作者:
clclcl123
时间:
2024-5-9 15:54
是这样写的
作者:
Hephaestus
时间:
2024-5-11 22:12
你亲自测试一下不就知道好用不好用了吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1