基于51单片机,五个按钮控制一个四位共阳数码管,一个按钮切换显示电压上下限,一个按钮增加电压上下限的值,一个按钮减小电压上下限的值,一个按钮向左切换数码管位数,一个按钮向右切换数码管的位数,的keil程序

时间: 2024-02-26 18:57:04 浏览: 24
以下是基于51单片机的keil程序,实现了五个按钮控制一个四位共阳数码管,其中一个按钮切换显示电压上下限,一个按钮增加电压上下限的值,一个按钮减小电压上下限的值,一个按钮向左切换数码管位数,一个按钮向右切换数码管的位数。 ```C #include<reg51.h> //定义数码管的共阳端口 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; //定义按钮的输入端口 sbit key1=P1^0; sbit key2=P1^1; sbit key3=P1^2; sbit key4=P1^3; sbit key5=P1^4; //定义电压上下限的初始值 unsigned char vol_min=0x00; unsigned char vol_max=0xff; //定义数码管位数和当前显示的位数 unsigned char digit_num=4; unsigned char digit_pos=0; //定义数码管显示的值 unsigned char code digit[10]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f }; //延时函数,用于消除按键抖动 void delay(unsigned int i){ while(i--); } //按键检测函数,返回按下的按钮编号 unsigned char key_scan(){ unsigned char key_code=0; if(!key1){ delay(1000); //延时消除按键抖动 if(!key1){ key_code=1; } } else if(!key2){ delay(1000); //延时消除按键抖动 if(!key2){ key_code=2; } } else if(!key3){ delay(1000); //延时消除按键抖动 if(!key3){ key_code=3; } } else if(!key4){ delay(1000); //延时消除按键抖动 if(!key4){ key_code=4; } } else if(!key5){ delay(1000); //延时消除按键抖动 if(!key5){ key_code=5; } } return key_code; } //数码管位数切换函数,每次调用向左或向右移动一位 void digit_shift(unsigned char dir){ if(dir==1){ //左移 digit_pos++; if(digit_pos>=digit_num){ digit_pos=0; } } else{ //右移 digit_pos--; if(digit_pos>=digit_num){ digit_pos=digit_num-1; } } } //数码管显示函数,根据当前位数和显示值显示数字 void digit_display(unsigned char num){ switch(digit_pos){ case 0:{ LSA=0;LSB=0;LSC=0;P0=digit[num%10];break; } case 1:{ LSA=1;LSB=0;LSC=0;P0=digit[num/10%10];break; } case 2:{ LSA=0;LSB=1;LSC=0;P0=digit[num/100%10];break; } case 3:{ LSA=1;LSB=1;LSC=0;P0=digit[num/1000%10];break; } } } //电压上下限调节函数,根据按键调节电压上下限的值 void vol_limit_adjust(unsigned char key_code){ switch(key_code){ case 2:{ //按下key2,增加电压上限 vol_max++; break; } case 3:{ //按下key3,减小电压上限 vol_max--; break; } case 4:{ //按下key4,减小电压下限 vol_min--; break; } case 5:{ //按下key5,增加电压下限 vol_min++; break; } } } void main(){ unsigned char key_code=0; unsigned char vol_now=0; //当前电压值 unsigned char vol_flag=0; //电压上下限标志位,0表示显示当前电压,1表示显示电压上限,2表示显示电压下限 while(1){ key_code=key_scan(); //按键检测 if(key_code!=0){ //如果有按键按下 if(key_code==1){ //按下key1,切换电压上下限标志位 vol_flag++; if(vol_flag>2){ vol_flag=0; } } else if(key_code>=2&&key_code<=5){ //按下key2~key5,调节电压上下限 vol_limit_adjust(key_code); } else if(key_code==6){ //按下key6,向左切换数码管位数 digit_shift(1); } else if(key_code==7){ //按下key7,向右切换数码管位数 digit_shift(2); } } //根据电压上下限标志位判断当前显示值 if(vol_flag==0){ //显示当前电压 vol_now++; //模拟电压值变化 if(vol_now>vol_max){ vol_now=vol_min; } digit_display(vol_now); } else if(vol_flag==1){ //显示电压上限 digit_display(vol_max); } else if(vol_flag==2){ //显示电压下限 digit_display(vol_min); } delay(1000); //延时 } } ``` 注意:以上程序仅供参考,具体实现可能需要根据具体硬件和需求进行调整。

相关推荐

最新推荐

recommend-type

基于51单片机DS1302四位数码管可调时钟

基于51单片机DS1302四位数码管可调1时钟设计,含有原理图及配套程序。
recommend-type

99秒马表设计 单片机 汇编 一个键控制 0-99秒显示 开始 暂停 复位

(1. 开始时,显示“00”,第1次按下SP1后就开始计时。 (2. 第2次按SP1后,计时停止。 (3. 第3次按SP1后,计时归零
recommend-type

基于51单片机的数字电压表仿真设计

设计采用AT89C51单片机、A/D转换器ADC0808和共阳极数码管为主要硬件,分析了数字电压表Proteus软件仿真电路设计及编程方法。
recommend-type

一种基于单片机的水位自动控制系统设计

本文介绍了水位自动控制系统工作的基本原理。阐述了一种基于单片机的通用水位控制系统的基本组成,并提出了该系统模块化的硬件和软件设计方法,最后,对该系统的工程应用作了评价和讨论。
recommend-type

单片机控制74HC595动态扫描数码管显示

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。数据在SCK的上升沿输入,在RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。