关于51单片机旋转编码开关和串口发数据问题

kene_wang 2013-10-22 11:34:40
具体的一部分代码就是这个呢,小弟刚开始学习单片机,问题就是旋转内圈的时候程序会死,比如旋转一下死了,再旋转一下就又好了,如果程序死了外圈的旋转返回的值就一直是0,外圈:turn_key1(),内圈:turn_key2().该怎么解决求大神指点一二,感激不尽。
#include "reg51.h"

bit busy;
typedef unsigned char BYTE;
unsigned char x,y,z;

sfr P4 = 0xC0;
sfr P4SW = 0xBB;

//sbit Y2 = P3^3;
sbit JL1 = P3^6;
sbit JR2 = P3^5;
sbit CC1 = P3^0;
sbit CC2 = P3^1;
sbit CC3 = P4^3;
sbit CC4 = P3^2;

sbit led1 =P1^5;
sbit led2 =P1^4;
sbit led3 =P1^3;
sbit led15=P0^7;
sbit led17=P4^1;
sbit led16=P4^6;
sbit led18=P4^5;
sbit led19=P4^4;

unsigned int time=0;
unsigned int key_code;
unsigned rec;
unsigned int turn_key1();
unsigned int turn_key2();
void delay(unsigned long int N);
void SendString(unsigned char key_code);
void SendData(BYTE dat);
void initTimer0();
void main ()
{
P4SW=0x70;
IP=0x18;
// TCON=0xF0;
SCON=0x50;
PCON=0x00;
// ET1=0; //定时器使能
TMOD=0x20; //满8位自动重装 方式2
TH1=TL1=0xF3; //BAUD=2400 FOSC=12M
TR1=1;
// TF1=1; // 定时器1溢出中断标志响应中断后由处理器清零
EA=1;
ES=1;
REN=1;
initTimer0();

led1 =0;
led2 =0;
led3 =0;
led15=0;
led16=0;
led17=0;
led18=0;
led19=0;
while (1)
{
if(key_code=turn_key1()) //外圈
{
if(key_code==y)
{
return;
}
else
{
SendString(key_code);
led15=1;
delay(1000);
}
led15=0;
}
else if(key_code=turn_key2()) //内圈
{
if(key_code==z)
{
return;
}
else
{
SendString(key_code);
led15=1;
delay(1000);
}
led15=0;
}
}
}


void Uart_Isr() interrupt 4 using 1
{
if (RI)
{
RI = 0;
rec=SBUF;
delay(1000);
}

if (TI)
{
TI = 0;
busy = 0;
led19= 1;
delay(1000);
}
led19= 0;
}

void SendString(unsigned char key_code)

{

SendData(key_code);
led17=1;
}
void SendData(BYTE dat) //发送数据的

{
while(busy);
ACC=dat;
busy=1;
SBUF=ACC;
led18=1;
}


unsigned int turn_key1()
{

if(CC1==0)
{
if(CC2==1&&CC3==1&&CC4==1)
{
delay(2000);
return 31; //-5~-10
while(!CC1);

}
if(CC3==0) //-10~-20
{
delay(2000);
return 32;
while(!CC3);

}
if(CC2==0&&CC3==0) //-20~-30
{
delay(2000);
return 33;
while(!CC2&&!CC3);

}
if(CC2==0) //-30~-40
{
delay(2000);
return 34;
while(!CC2);

}
if(CC2==0&&CC4==0) //-40~-50
{
delay(2000);
return 35;
while(!CC2&&!CC4);

}
if(CC2==0&&CC3==0&&CC4==0) //-50~-60
{
delay(2000);
return 36;
while(!CC2&&!CC3&&!CC4);
}
if(CC3==0&&CC4==0) //-60~-70
{
delay(2000);
return 37;
while(!CC3&&!CC4);

}
if(CC4==0) //-70~-90
{
delay(2000);
return 38;
while(!CC4);
}
}
//****************************************向右
if(CC3==0) //10~20
{
delay(2000);
return 39;
while(!CC3);

}
if(CC2==0&&CC3==0) //20~30
{
delay(2000);
return 40;
while(!CC2&&!CC3);

}
if(CC2==0) //30~40
{
delay(2000);
return 41;
while(!CC2);

}
if(CC2==0&&CC4==0) //40~50
{
delay(2000);
return 42;
while(!CC2&&!CC4);

}
if(CC2==0&&CC3==0&&CC4==0) //50~60
{
delay(2000);
return 43;
while(!CC2&&!CC3&&!CC4);

}
if(CC3==0&&CC4==0) //60~70
{
delay(2000);
return 44;
while(!CC3&&!CC4);

}
if(CC4==0) //70~90
{
delay(2000);
return 45;
while(!CC4);

}

return y;
}


unsigned int turn_key2() //内圈********************************

{
// static unsigned char Aold,Bold;
// static unsigned char st;
unsigned int tmp=0;
unsigned char flag=0;

initTimer0();
if(JL1==0)
{
delay(10);
if(JR2==1)
flag=1; //左旋
while(!JL1);
}
if(JR2==0)
{
delay(10);
if(JL1==1)
flag=2; //右旋
while(!JR2);
}

if(flag==1) //左
{

while(!(JR2&JL1))
{
JL1=~JL1;
delay(10);
if(!JL1)
tmp--;
flag=0;
}
return tmp;

}

else if(flag==2) //右
{
while(!(JL1&JR2))
{
JR2=~JR2;
delay(10);
if(!JR2)
tmp++;
flag=0;
led1=~led1;
}
return tmp;
}

// JL1=JR2=1;
tmp=0;

return z;

//

}

void initTimer0()
{
TMOD|= 0x01; // 50ms 方式1
TH0 = 0x3C;
TL0 = 0x0B0;
// TR0 = 1;
// TF0 = 1;
ET0=1;
// TR0=1;
}
void Timer0(void) interrupt 1 //中断不知道是否合适这样写、
{
TR0=1;
TH0 = 0x3C;
TL0 = 0x0B0;
time++;
if(time>1)
{
if(JL1=~JL1)
{
turn_key2();
time=0;
}
if(JR2=~JR2)
{
turn_key2();
time=0;
}
}
else
{
TR0=0;
initTimer0();
}

}
void delay(unsigned long int N)
{
int i,j;
for (i=N;i>0;i--)
for(j=0;j<110;j++);
}


...全文
180 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kene_wang 2013-10-22
  • 打赏
  • 举报
回复
具体的内圈的波形就是这个呢
kene_wang 2013-10-22
  • 打赏
  • 举报
回复
有人在吗

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧