proteus按键计数器电路图[proteus中计算器键盘] | 您所在的位置:网站首页 › 和平精英中的语音包怎么设置声音 › proteus按键计数器电路图[proteus中计算器键盘] |
用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 实验室设备网 版权所有 |