该程序实现了一个基于51单片机的双向计数器系统,通过标志位控制数值增减方向。当DATA_FLAG为1时执行递增操作,为0时执行递减操作。程序包含以下功能:1) 通过DATA_ADD()和DATA_DEC()函数实现正负方向的数值增减;2) 数值在跨越零点时自动切换计数方向;3) 通过P0端口输出当前计数值。系统初始化时设置标志位为1(正向计数),主循环中持续调用递减函数并刷新显示。该设计适用于需要双向计数的编码器应用场景,具有零值边界自动切换功能。
编码器调用加或减仿真 以0为中点,大于0正数值加减,小于0负数值加减
/***数据脉冲编码器归零,正转赋标志1,反转赋0 ***/
/***调用加或减子程序,****************************/
#include <reg52.h> //
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define NOP nop()
int val0,val1,val2; //整型变量a
uchar ldata,mdatd,step; //变量1,变量2,移动步数
bit DATA_FLAG;
/*******************************/
void DATA_ADD()
{
if(DATA_FLAG==1)
{
val1=val1+1;
val0=val1;
}
else
{
val2=val2-1;
if(val2<0)
{
val1=1;
DATA_FLAG=1;
val0=val1;
}
else
{
val0=val2;
}
}
}
/*******************************/
void DATA_DEC()
{
if(DATA_FLAG==1)
{
val1=val1-1;
if(val1<0)
{
val2=1;
DATA_FLAG=0;
val0=val2;
}
else
{
val0=val1;
}
}
else
{
val2=val2+1;
val0=val2;
}
}
void display()
{
P0=val0;
}
/*******************************/
void main()
{ //
P0=0X00; // 变量显示复位
DATA_FLAG=1; //
val1=0; //
while(1) //
{ //
DATA_DEC(); // 调用加或减子程序
display();
}
}