proteus按键计数器电路图[proteus中计算器键盘] 您所在的位置:网站首页 和平精英中的语音包怎么设置声音 proteus按键计数器电路图[proteus中计算器键盘]

proteus按键计数器电路图[proteus中计算器键盘]

2023-04-12 01:47| 来源: 网络整理| 查看: 265

用C语言编写单片机AT89C51《进出人数计数器》代码,电路图,proteus仿真可以通过

这个简单,利用红外线就要以搞定,硬件的话,需要一个红外线发器和接收器(日常生活中最赏用的就是遥控器上面的发射管),利用高低电平来判断.你想一下,应该就懂了.至于软件就更简单了,循环检测两个脚的电平,哪个先有跳变,就可判断出是进还是出.同时计数器加(进)/减(出)1就OK了.

proteusstm32利用独立按键数码管显示数字

proteusstm32利用独立按键数码管显示数字

实验环境

本次实验是通过Proteus+MDK一起模拟完成的。Proteus模拟实际电路,MDK编译代码。Proteus版本是8.13,MDK版本是5.21。需要注意的是,Proteus需要安装8.8以上版本,器件库里面要支持STM32F103C6。

• 实验目的

通过一个按键控制数码管0~9循环显示,并且把对应数字发给串口。通过接收串口数据,控制数码管0~9循环显示。实验目的,学会按键检测方法,这边用的是开源库multi_button,学会串口怎么用。

Proteus硬件电路

虚拟串口示意

• 主控:

STM32F103C6(本来想用C8的,但是Proteus只有C6,本质上只有Flash和SRAM大小的区别,所以没有必要纠结)

• 时钟:

没有用外部晶振,因为Proteus只支持一种时钟树,所以这里采用内部晶振,做实验够了,内部晶振配置为40MHz。

• 复位电路:

复位电路如图,包含了上电复位电路一个10K电阻(图上用的是100K实际应该都是可以的)+一个100nF电容。按键复位电路,包含了一个自复位按键,按下后,RST管脚就会短路到GND,MCU就会复位。

•电路上还要接一个Proteus虚拟串口,在自己电脑上也要用虚拟串口软件虚拟一对串口出来,上图所示,PC端我们用的是COM5,那么Proteus端我们用COM4。

• IO说明:

→ 我们利用PA0~PA6来控制7段数码管,高电平点亮;

→PB0用作LED的控制,指示程序状态;

→PB4作为按键输入状态读取;

→PA9,PA10是串口输入输出;

2.代码概述

目录结构

• 代码目录概述:

→APP文件夹:主要包含应用函数的.C文件。

→BSP文件夹:主要包含底层硬件驱动的.C文件。

→MDK-ARM文件夹:主要包含STM32的启动的.S文件。

→StdPeriph_Driver文件夹:主要包含ST官方提供的标准外设驱动.C文件(不是HAL库哦)。

→CMSIS文件夹:系统内核配置文件,标准库自带的。

→按键驱动使用的是multi_button。

→串口接收0x09这个代码1次就会反转数码管1次,0~9循环。

→按键按1次就会反转数码管1次,0~9循环。

→按键按下LED灯亮,松开灭。

【不用开发板学习STM32】串口收发+按键控制数码管显示(文末获取代码及工程文件)

[img]2个74ls192和一个74ls00怎么构成24进制计数器(有原理图)

用proteus仿真图为:

在proteus中,各个元件名为:计数器:74ls192,与非门:74ls00,七段数码管:7seg-bcd,··

前面为低位,后面为高位,上面实现是24进制加计数器,下面的图为24进制减计数器。

Proteus怎么用74LS192做60进制的加法计数器

要用74LS192制作60进制的加法计算器如下图所示

Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具。

虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐

扩展资料:

功能特点

Proteus软件具有其它EDA工具软件(例:multisim)的功能。这些功能是:

1.原理布图

2.PCB自动或人工布线

3.SPICE电路仿真

革命性的特点

1.互动的电路仿真

用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。

2.仿真处理器及其外围电路

可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境

参考资料来源:百度百科-proteus

利用Proteus仿真软件设计一个具有按键清零功能的计时00-59的两位秒表时间的显示电路。利用两位LED数码管

#include reg51.H

sbit P3_5 =P3^5;

unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};

unsigned char second;

unsigned char keycnt;

unsigned int tcnt;

void main(void)

{

unsigned char i,j;

TMOD=0x02;

ET0=1;

EA=1;

second=0;

P1=dispcode[second/10];

P2=dispcode[second%10];

while(1)

{

if(P3_5==0)

{

for(i=20;i0;i--)

for(j=248;j0;j--);

if(P3_5==0)

{

keycnt++;

switch(keycnt)

{

case 1:

TH0=0x06;

TL0=0x06;

TR0=1;

break;

case 2:

TR0=0;

break;

case 3:

keycnt=0;

second=0;

P1=dispcode[second/10];

P2=dispcode[second%10];

break;

}

while(P3_5==0);

}

}

}

}

void t0(void) interrupt 1 using 0

{

tcnt++;

if(tcnt==4000)

{

tcnt=0;

second++;

if(second==100)

{

second=0;

}

P1=dispcode[second/10];

P2=dispcode[second%10];

}

}

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 duan 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 numYS9999) //预置模式下,k1已长按,自动增

{

numYS++;

setnumYS();

}

if(ispause==1 ispress2==1 numYS0)  //预置模式下,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) //k1\k2\k3任意一个按钮被按下,停止预置数自动增长

{

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(numYS9999)

{

numYS++;

setnumYS();

}

}

}

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

{

delay(10);

if(k2==0)

{

btnName=2;

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

{

while(k2==0);

ispress2=1;

}

else if(numYS0)

{

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)

{

duan=nums[g];

wei4=on;

delay(ssSpd);

wei4=off;

}

if(s0 || (s==0 b0))

{

duan=nums[s];

wei3=on;

delay(ssSpd);

wei3=off;

}

if(b0 || (b==0 q0))

{

duan=nums[b];

wei2=on;

delay(ssSpd);

wei2=off;

}

if(q0)

{

duan=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(countjsSpd)

count++;

else

{

count=0;

numJsChange();

numJS++;

}

if(isbtn4==1)

{

isbtn4=0;

numJsChange();

numJS++;

}

}

int pressWait(uint btn)

{

uint i,j;

for(i=PREESTIME;i0;i--)

for(j=110;j0;j--)

{

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

return 0;

}

return 1;

}

int delay(uint xms)

{

uint i,j;

for(i=xms;i0;i--)

for(j=110;j0;j--)

{

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

return 1;

}

return 0;

}

proteus按键计数器电路图的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于proteus中计算器键盘、proteus按键计数器电路图的信息别忘了在本站进行查找喔。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有