导航:首页 > 操作系统 > 单片机k4仿真

单片机k4仿真

发布时间:2022-12-16 10:25:40

A. 单片机 ,编写k1-k4状态显示。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
//延时
void DelayMS(uint x) //这是一个延时函数,延时毫秒级,后面的参数是几就是几毫秒
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//主程序
void main()
{
P0=0xff; //51单片机为准双向口,读入前先写1
P1=0xff;
while(1)
{
LED1=K1; //前两个键按下则对应的灯亮,松开则灭
LED2=K2;
if(K3==0)
{
while(K3==0); //这一句是等按键释放
LED3=~LED3; //这一句是灯取反,实现按一次键亮再按一次灭依次往复
}
if(K4==0) //同K3
{
while(K4==0);
LED4=~LED4;
}
DelayMS(10); //延时10毫秒,也起到一个去抖动作用
}
}

B. 51单片机独立按键控制LED灯 这个程序按下k4的时候,在按k1,k2并不能实现左右流水怎么改

按K1部分加一行
flag=1;
led=0xfe;//重新赋值
K2部分也加这一行
因按K4后,Ied=led+1;
就不是亮一个啦

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

按照你题目,用了2个2位显示,实际有4位合一起的。

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

计数模式:LED显示计时数字,从0开始计时,直到预置最大值。

预置模式:LED显示当前预置最大值,按k1,k2可对预置值+-操作,长按k1,k2大约2秒,会进入自动加减预置值。直到再次点击k1,k2,k3任意一键停止自动。

k4:在计数模式下使用,每按下一次显示的数字加一(会在正常计时同时额外+1)。

当计数达到预置最大值,会停止计数,LEN闪烁(实际就是交替显示间隔边长),蜂鸣器响。

按键时长、LED动态显示间隔、闪烁间隔、计数速度,均可直接修改常量,需要自己改,我备注写的很详细。

电路基本按照你上图,略有修改。

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

#define an P0

#define on 0

#define off 1

#define SSSPEED 35 //LED交替闪烁间隔时间

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

#define PREESTIME 500//按钮长按时间判定,预设500(大约2秒),需要自改,值越大,长按时间越长

sbit fm=P3^3;

sbit wei1=P3^4;

sbit wei2=P3^5;

sbit wei3=P3^6;

sbit wei4=P3^7;

sbit k1=P1^4;

sbit k2=P1^5;

sbit k3=P1^6;

sbit k4=P1^7;

uint jsSpd=JSPEED;//计时速度,默认1s一次(5000*200us)

uint ssSpd=SSSPEED;//LED交替闪烁速度

//共阳极

int delay(uint xms);

void init();

void jspause();//计数器开启/停止

void setnumYS();//设置预设数值

void numJsChange();//计数模式数字改变

void showLED();

int pressWait(uint btn);

uint g=0;

uint s=0;

uint b=0;

uint q=0;

uint count=0;

uint ispause=1;

uint numYS=0;//预设数值

uint numJS=0;//实际计时的数字

uint isMaxJs=0;//标识:计时达最大。 达最大1,否0

uint isk3press=0;//标识:k3按钮是否被点击。 点击1,否0

uint ispress1=0;//标识:k1被长按

uint ispress2=0;//标识:k2被长按

uint isbtn4=0;//标识:k4被按下

uint btnName=0;//按钮长按计时

void main()

{

init();

while(1)

{

if(ispause==1 && ispress1==1 && numYS<9999) //预置模式下,k1已长按,自动增

{

numYS++;

setnumYS();

}

if(ispause==1 && ispress2==1 && numYS>0) //预置模式下,k2已长按,自动减

{

numYS--;

setnumYS();

}

if(isMaxJs==0 && numJS>=numYS && ispause==0) //计时模式下达最大值

{

fm=on;

ssSpd=1000;//增加LED交替间隔,实现数字闪烁

isMaxJs=1;

EA=0;

setnumYS();

numJS=0;

}

if(k1==0 ||k2==0|| k3==0) //k1k2k3任意一个按钮被按下,停止预置数自动增长

{

ispress1=0;

ispress2=0;

}

if(k1==0 && ispause==1)//预置模式下+

{

delay(10);

if(k1==0)

{

btnName=1;

if(pressWait(btnName))//判断连按

{

while(k1==0);

ispress1=1;

}

else if(numYS<9999)

{

numYS++;

setnumYS();

}

}

}

if(k2==0 && ispause==1)//预置模式下-

{

delay(10);

if(k2==0)

{

btnName=2;

if(pressWait(btnName))//判断连按

{

while(k2==0);

ispress2=1;

}

else if(numYS>0)

{

numYS--;

setnumYS();

}

}

}

if(k3==0)

{

delay(10);

if(k3==0)

{

while(k3==0);

fm=off;

jspause();

}

}

if(k4==0 && ispause==0)//计数模式下按下k4,k4的防抖写在中断中

{

delay(10);

if(k4==0)

{

while(k4==0);

isbtn4=1;

}

}

showLED();

}

}

void showLED()

{

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

if(g>=0)

{

an=nums[g];

wei4=on;

delay(ssSpd);

wei4=off;

}

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

{

an=nums[s];

wei3=on;

delay(ssSpd);

wei3=off;

}

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

{

an=nums[b];

wei2=on;

delay(ssSpd);

wei2=off;

}

if(q>0)

{

an=nums[q];

wei1=on;

delay(ssSpd);

wei1=off;

}

}

void setnumYS()//设置预设数值

{

q=numYS/1000;

b=(numYS%1000)/100;

s=(numYS%100)/10;

g=numYS%10;

}

void jspause()

{

if(ispause==0 || isMaxJs==1)//关闭计时模式 / 启动预置模式

{

EA=0;

isMaxJs=0;

ispause=1;

ssSpd=SSSPEED;

ispress1=0;

ispress2=0;

setnumYS();

}

else if(ispause==1) //启动计时模式 / 关闭预置模式

{

ispause=0;

q=b=s=g=0;

numJS=0;

ssSpd=SSSPEED;

EA=1;

}

}

void init()

{

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

TH0=0x38;

TL0=0x38;

EA=0;

ET0=1;

TR0=1;

wei1=off;

wei2=off;

wei3=off;

wei4=off;

}

void numJsChange()//计数模式数字改变

{

if(g==9)

{

g=0;

if(s==9)

{

s=0;

if(b==9)

{

b=0;

if(q==9)

{

q=0;

}

else

q++;

}

else

b++;

}

else

s++;

}

else

g++;

}

void ct() interrupt 1 //一次中断200us

{

if(count<jsSpd)

count++;

else

{

count=0;

numJsChange();

numJS++;

}

if(isbtn4==1)

{

isbtn4=0;

numJsChange();

numJS++;

}

}

int pressWait(uint btn)

{

uint i,j;

for(i=PREESTIME;i>0;i--)

for(j=110;j>0;j--)

{

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

return 0;

}

return 1;

}

int delay(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--)

{

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

return 1;

}

return 0;

}

D. 编写程序单片机

这个程序网上应该有的是吧

E. 用51单片机写程序,4个按键灯控制8个彩灯切换九种灯光效果

P1口接8个LED灯,P3口接4个按键K1~K4,用于控制流水灯的四种效果,仿真图如下。

阅读全文

与单片机k4仿真相关的资料

热点内容
win7美化命令行终端 浏览:797
免加密狗图片 浏览:485
一只透明的鸟是什么app 浏览:817
空气压缩机油批发商 浏览:69
linuxifexist 浏览:4
加密tf卡拷入文件 浏览:399
山西php工资 浏览:673
福州看病预约用什么小程序app 浏览:238
php保留两位小数不四舍五入 浏览:292
黑马程序员路径大全 浏览:1000
saas平台PHP 浏览:333
云服务器科学计算配置怎么选 浏览:649
jar解压命令 浏览:609
php正则问号 浏览:299
无线已加密不可上网是怎么了 浏览:464
什么app可以免费做手机 浏览:376
异性下载什么app 浏览:680
51单片机程序单步视频 浏览:241
家庭宽带如何连接服务器 浏览:122
汽车高压泵解压 浏览:772