关于51单片机旋转编码开关和串口发数据问题
具体的一部分代码就是这个呢,小弟刚开始学习单片机,问题就是旋转内圈的时候程序会死,比如旋转一下死了,再旋转一下就又好了,如果程序死了外圈的旋转返回的值就一直是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++);
}
#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++);
}
...全文
相关推荐
51单片机按键通过串口发送字符串
串口通信是设备间进行数据交换的重要方式,特别是在嵌入式系统和计算机之间,常用于调试、数据传输等场景。首先,我们需要理解51单片机的串口工作原理。
51单片机旋转报警器设计:编码器测速与阈值报警实现
旋转机械在传送带、风机、搅拌机等设备中广泛运行,其转速是否正常直接关系到设备安全与生产效率。转速监测的基本原理是将机械旋转转化为电脉冲信号,再通过微控制器对脉冲进行计数与换算,从而得到实时转速。增量式编码器因输出脉冲频率与转速成正比,成为测速传感器的主流选择。在嵌入式系统中,利用外部中断捕捉脉冲边沿,结合定时器实现固定窗口计数,即可完成高性价比的转速测量。当转速超出预设范围时,系统可驱动蜂鸣器和指示灯分级报警,并支持现场设定阈值。这类设计在工业设备状态监测、电机保护、自动化产线等场景中具有实用价值。本文围绕
51单片机利用串口发送汉字
其中,AT89X52是51系列单片机的一种型号,具有更多的中断源和定时器等资源。#### 串口通信的基础理论串口通信是一种常见的数据传输方式,常用于不同设备之间的简单数据交换。
51单片机串口发送汉字显示乱码问题
二、51单片机串口发送汉字显示乱码问题在使用51单片机进行串口通信时,发送汉字时常出现乱码问题。这种问题的出现是由于编译器的BUG造成的。
旋转编码器测试代码_编码器_51单片机_旋转编码器_
51单片机是微控制器的一种,常用于嵌入式系统设计,因其丰富的资源和易用性而在各种电子项目中得到广泛应用。本篇文章将深入探讨如何在51单片机上实现旋转编码器的测试代码。


单片机/工控
