标题:
为什么我用单片机操作SG90时,单片机会复位
[打印本页]
作者:
完后余生9375
时间:
2020-4-2 13:35
标题:
为什么我用单片机操作SG90时,单片机会复位
我的单片机和SG90 9g舵机是用的一个电源。信号线接在了P1^0上面。但是我用按键控制舵机方向的时候。遇到了以下问题。困扰许久,还请51黑的大神不吝赐教。
我在程序里采用count来定时。每0.5ms进入一次中断。count == 40为一个周期20ms。用PWM_count 控制方向。初始值为1(转向0度)。2(转向45度)3转向90度。分别用s2 s3 s4按钮对其PWM_count进行修改。但是我在使用中发现。我按下s4后舵机会正常的转到90度,然后会自己又转回到单片机初始值的设置值1也就是0度。按下s3也是转45度又回到0度。通过调试发现是PWM_count的值自动变为了1造成的。这种情况是单片机复位造成的吗?
一个星期了,还是没有解决。下面是程序,大佬们帮看看。
#include<reg52.h>
sbit SG_PWM=P1^0;
unsigned char count=0;
unsigned char PWM_count=1; //初始值 1--0度,2--45度,3--90
unsigned char a=0;
sbit s2 = P3^0;
sbit s3 = P3^1;
sbit s4 = P3^2;
sbit led1 = P1^2;
sbit led2 = P1^3;
void Timer_Init()
{
TMOD=0X01; //T0定时方式1
TH0=0xfe;
TL0=0x33; //计数初值设置为0.5ms
ET0=1; //打开定时器0的中断
TR0=1; //打开定时器0
EA=1; //开总中断
}
/**
* 延时函数
**/
void delay(unsigned int i)
{
unsigned int x,y;
for(x = i; x > 0; x--)
for(y = 120; y > 0 ; y--);
}
void Timer() interrupt 1 //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
TR0=0;
TH0=0xfe;
TL0=0x33; //重新赋计数初值为0.5ms
if(count<=PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
count++;
if(count>=40)
{
count=0;
a++;
}
TR0=1;
}
void main()
{
Timer_Init();
while(1){
if(s2 == 0){
delay(100);
if(s2 == 0){
count = 0;
PWM_count = 1;
}
}
if(s3 == 0){
delay(100);
if(s3 == 0){
count = 0;
PWM_count = 2;
}
}
if(s4 == 0){
delay(100);
if(s4 == 0){
count = 0;
PWM_count = 3;
}
}
if(PWM_count == 1){
led1 = 0;
led2 = 1;
}
if(PWM_count == 3){
led1 = 1;
led2 = 0;
}
}
}
复制代码
作者:
王天星
时间:
2020-4-2 18:24
从代码上看没什么异常,你判断是单片机复位导致的,你可以在单片机上电时串口发送一个数据,如果舵机旋转过程中出现单片机复位,那一定会有串口数据。你这种情况导致单片机复位的可能性是有的。舵机使用外接5V电压和单片机共地就可以解决。
作者:
完后余生9375
时间:
2020-4-8 15:29
王天星 发表于 2020-4-2 18:24
从代码上看没什么异常,你判断是单片机复位导致的,你可以在单片机上电时串口发送一个数据,如果舵机旋转过 ...
感谢!确实是舵机和单片机共用电源所致。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1