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=on;
延迟(ssSpd);
wei4=off;
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;
{
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. 例程:
#includesbit 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 }}