控制器 晶体管 逻辑门 寄存器 缓存 处理器
主页 正文

51单片机按键计数与显示仿真电路教程

proteus仿真电路图,51单片机按键计数

根据你的问题,使用了两个2位显示,但实际上是4位数字组合在一起。

k3:切换计数模式/预设模式。

计数模式:LED显示时间数字,从0计数到预设的最大值。

预设模式:LED显示当前最大预设值。
直到再次按下k1、k2、k3中的任意键时,才会自动停止。

k4:用于计数模式,每按一次显示数字加1(一般情况下加1)。

当计数达到预设的最大值时,计数停止,LEN闪烁(实际动态显示会话时长)并发出蜂鸣声。

按键持续时间、LED动态显示间隔、闪烁间隔和计数速度都可以直接作为常数更改。

电路基本如上图所示,稍加修改。

#defineuchrunsignedchar

#defineu anP0

#defineon0

#defineoff1

#defineSSSPEED35//LED交替闪烁间隔时间

#defineJSPEED5000//计数模式,速度默认值(5000*200 us=1S) 值越小,倒计时越快。

#definePRESTIME500//定义按钮持续的时间。
默认为500(约2秒)。
值越大,按下时间越长。

sbitfm=P3^3;

sbitwei1=P3^4;

sbitwei3=P3^6;

sbitwei4=P3^7;

sbitk2=P1^5;

sbitk3=P1^6;

sbitk4=P1^7;

uintjsSpd=JSPEED;/ /时间速度,默认1s(5000*200us)

uintssSpd=SSSPEED;//LED可变闪光速度

//通用 阳极

int delay(uintxms);

voidinit();

voidjspause();//启动/停止定时器

voidsetnumYS();//设置默认值

voidnumJsChange();//计数模式numeric 更改

voidshowLED();

intpre ssWait(uintbtn);

uintg=0;

uints=0;

uintb=0;

uintq=0;

uintcount=0;

uintpause=1;

uintnumYS=0 ;//默认 Value

uintnumJS=0;//精确时间数

uintisMaxJs=0;//Id:达到最大值的时间。
最大 1,无 0

uintisk3pre ss=0; 点击1,无0

uintispre ss1=0; // ID:k1长按

uintispre ss2=0; //ID:k2长按 uintisbtn4=0;//标准标识符:k4按下

uintbtnName=0;//按钮长按时间

voidmain()

{

init( );

while (1)

{

if(ispause==1&&ispre ss1==1&&numYS<9999)//预设模式下k1长按会自动递增

{

numYS ++;

setnumYS();

0) //预设模式下,k2长 按下,自动缩小

{

numYS--;

setnumYS();

=numYS&&ispause = =0)//定时模式下最大值

{

fm=on;

ssSpd=1000;//数字闪烁的LED可变间隔Add

isMaxJs=1;

EA=0;

setnumYS();

numJS=0;

}

if(k1==0||k2== 0||k3==0)//按下任意k1\k2\k3键时停止,这样优先级数字就不会自动递增 结束

{

ispre ss1=0;

ispre ss2=0;

}

if(k1= =0&&ispause==1)//预设模式 continue+

{

delay(10);

if(k1==0)

{

btnName=1;

if(pre ssWait(btnNa I)) // 点击判断两次

{

ispre ss1=1;

}

elseif(numYS<9999)

{

numYS++;

setnumYS();

}

}

>

if(k2==0&&ispause==1) //预设模式下一个-

{

delay(10);

if( k2 ==0)

{

btnName=2;

if(pre ssWait(btnNam e)) // 判断点击两次

{

while (k2==0);

ispre ss2=1;

}

0)

{< /p>

numYS--;

setnumYS();

if(k3==0)

{

延迟(1 0);

if(k3==0)

>

{

其中 (k3==0);

fm=off ;

jspause();

if(k4==0&&ispause==0)//当k4加载时计数模式 k4防抖是用break写的

{

delay(10);

if (k4==0)

{

if(k4==0);

isbtn4=1;

}

}

显示 LED()

}

完成灯光p>

{

uchar 数字[10]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98};

> 0)

{

duan=nums[g];

wei4=o​​n;

延迟(ssSpd);

wei4=o​​ff;

0||(s=0&b>0))

duan=nums[s];

wei3=on;

延迟(ssSpd);

wei3=off;

}

0||(b==0&&q>0))

{

duan=nums[b];

wei2=on;

延迟(ssSpd);

wei2=off;

}

0)

{

duane=nums[q] ;

wei1=on;

延迟(ssSpd);

wei1=off;

}

}

voidsetnumYS()//设置默认值

{

q=numYS/1000;

b=(numYS% 100 0)/100;

s=(numYS%100)/10;

g=numYS%10;

}

voidjspause()

{

if(ispause==0||isMaxJs==1)//关闭定时器模式/启动预设模式

{

EA=0;

isMaxJs=0;

ispause=1;

ispre ss1=0;

ispre ss2=0;

setnumYS();

else if( ispause==1) //启动定时器模式/禁用预设模式

{

ispause=0;

q=b=s=g =0;

numJS=0;

ssSpd=SSSPEED;

EA=1;

}

>>

vo idinit()

{

TMOD=0x02;//T0工作模式2自动加载8位200us

TH0=0x38;

TL0=0x38;

EA=0;

ET0=1;

TR0=1;

wei1=关闭;

wei2=关闭;

wei3=关闭;

wei4=关闭;

}

voidnumJsChange ()//计数模式数 更改

{

if(g==9)

{

g=0;

( s==9)

{

s=0;

if(b==9)

{

b=0;

if (q==9)

q=0;

}

q++;

其他

b++;

其他

s++;

其他

g++;

voidct() break 1 // 中断一次,花费 200 US

{

if ( count

count++;

else

{

count=0;

numJsChange ( );

numJS++;

}

if(isbtn4==1)

{

isbtn4=0;

n umJsChange();

numJS++;

}

}

intpre ssWait(uintbtn)

{

uinti,j;

0;i--)

0;j- -)

{

if((k1==1&&btn==1)||(k2==1&&btn==2))

返回 0;

U inti,j;

0;i--)

0;j--)

{

if(k1==0||k2==0||k3==0)

return1;

}

return0;

51单片机使用T0和T1外部脉冲计数,C语言如何编程?

1. 使用外部脉冲计数T0和T1来控制两个电机。
当达到 1700 个脉冲时电机将停止:计算脉冲数最好使用外部中断。
--T0 和 T1 保留供常规使用。
使用四个按钮进行控制,按钮1控制电机正转,按钮2控制电机反转,按钮3控制电机1正转,按钮4控制电机2正转。

2. 例程:

#include sbit k1 = ?;  //自定义 sbit k2 = ?sbit k3 = ?sbit k4 = ?sbit DIAN 1 = ?sbit DIAN2 = ?sbit DIAN3 = ?sbit DIAN4 = ?sbit SEN1 = ?sbit SEN2 = ?empty delay(unsigned int x){ unsigned整数 m,n;   或(m = x; m > 0; m--) for(n = 115; n > 0; n--);}void main(void){ TMOD = 0x55 IE = 0x8a;  (!k1) { 延迟(10);   if (!k1) { while(!k1);  TH0 = (65536 - 1700) / TL0 = (65536 - 1700) % 256 DIAN1 = 0;   R0=1;  } } if (!k2) { 延迟(10);  if (!k2) { 而 TH0 = (65536 - 1700) / 256 TL0 = (65536 - 1700) % 256;  = 0;   DIAN1=1;  DIAN2=0;  TR0=1;  } } if (!k3) { 延迟(10);  while(!k3);  ;TL1 = (65536 - 1700)% 256;  DIAN3=0;  DIAN4 = 1 TR1 = 1;  !k4);  TH1 = (65536 - 1700) / 256;
                        
                        
                        

51单片机 按键按下去 计数一次 程序应该怎么写?

按钮按下后,使用循环语句等待电梯计数器

if (button Pressed) { Delay if (button Pressed) { while (钥匙未释放);  //如果按键没有松开,程序会停在这里 count++ //按键松开后,程序会执行到这里,count值会加1 }}

热门资讯
时钟表盘时间表达的深层含义
redis集群查询key命令
基于Redis的缓存策略应用解析
麒麟系统安装指南:从官网下载到成功安装的详细步骤
内存(内存条)
cpu的时钟频率怎么算
中标麒麟查看系统信息
主频3.1GHz性能表现解析