IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51单片机独立按键数码管(模块化) -> 正文阅读

[嵌入式]51单片机独立按键数码管(模块化)

51单片机独立按键数码管

基于普中51单片机开发板,运用定时器/计数器0。按键控制数码管,实现60秒计时,数值加减清零。


前言

本程序涉及中断,定时器的配置,数码管动态扫描,独立按键。程序基于模块化编写。详细的注解,适合小白服用。
原文件下载按键控制数码管实现显示数值加减]:按键控制数码管实现显示数值加减
哔哩哔哩演示视频按键+数码管

一、独立按键

在这里插入图片描述
独立按键比较简单,它们各自与独立的输入线相连接。在这里插入图片描述
4 条输入线接到单片机的 I/O 口上,当按键 K1 按下时,+5V 通过电阻 R1 然后再通过按键 K1 最终进入 GND 形成一条通路,那么这条线路的全部电压都加到了 R1 这个电阻上,KeyIn1 这个引脚就是个低电平。当松开按键后,线路断开,就不会有电流通过,那么 KeyIn1和+5V 就应该是等电位,是一个高电平。我们就可以通过 KeyIn1 这个 IO 口的高低电平来判断是否有按键按下。
在这里插入图片描述
在按键被按下的短暂一瞬间,由于硬件上的抖动,往往会产生几毫秒的抖动,在这时候若采集信号,势必导致误操作,甚至系统崩溃;同样,在释放按键的那一刻,硬件上会相应的产生抖动,会产生同样的后果。因此,在模拟或者数字电路中,我们要避免在最不稳定的时候采集信号,进行操作。因此需要对独立按键进行一个消抖处理。

其他相关

有关数码管,可以去看我的另一篇博文51单片机数码管显示60秒倒计时(C语言)
下面咱们直接上代码,我分为主函数部分硬件部分和软件部分代码

二、代码

1.MAIN

#include "hardware.h"
#include "software.h"
void main()
{   
	timing(); //初始化定时函数
	while(1)
	{
	tube();//数码管服务函数(不断对数码管进行扫描)
	KEY();//独立按键服务函数(不断对独立按键进行扫描)
	}
}

2.硬件部分代码

//按键、数码管
#include "hardware.h"
#include "software.h"  //调用此函数的变量(因此包含此文件)
//共阴数码管段码
uchar code block[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //定义无符号字符型类型数组来储存段码
void tube()    //数码管扫描函数
{
  uchar i;  //定义i变量
	for(i=2;i<4;i++)
	{
		switch(i)	
		{														 
		   case(0):			 //位选,第一个数码管	
				LSA=1;
				LSB=1;
				LSC=1;
 			P0 = block[num/1000%10];  //千位数拆分
				 break;
			case(1):          //位选,第一个数码管
				LSA=0;
				LSB=1;
				LSC=1;
 			P0 = block[num/100%10];  //百位数拆分   
				 break;
			case(2):
				LSA=1;
				LSB=0;
				LSC=1;
 			P0 = block[num/10%10];  //十位数拆分
			     break;
			case(3):	
				LSA=0;
				LSB=0;
				LSC=1;
			P0 = block[num/1%10];  //个位数拆分
				 break;
		}
		delayms(5);   //延时一会(视觉残留)
		P0=0x00;      //消影
	}
}
//独立按键
void KEY()
{
	if(K1 == 0)   //判断按键是否按下
	 delayms(5);  //消抖
    if(K1 == 0)	  //确认按键按下,执行
	{
	  num++;
	if(num == 60)
		num = 0;
    while(!K1);	  //检测按键是否松开
	}
	
	if(K2 == 0)  //判断按键是否按下
	 delayms(5); //消抖
    if(K2 == 0)	 //确认按键按下,执行
	{
	  num--;
	if(num == 0)
	num = 60;
    while(!K2);	 //检测按键是否松开
	}
	
	if(K3 == 0)  //判断按键是否按下
	 delayms(5); //消抖
    if(K3 == 0)	 //确认按键按下,执行
	{
	num = 0;
    while(!K3);	 //检测按键是否松开
	}
	
	if(K4 == 0)  //判断按键是否按下
	 delayms(5); //消抖
    if(K4 == 0)	 //确认按键按下,执行
	{
    while(!K4);	 //检测按键是否松开
	TR0=~TR0;
	}
	
}

3.软件部分代码

#include "software.h"
uchar numm;  //定义数据类型为无符号字符型类型
uchar num;   //定义数据类型为无符号字符型类型    

void delayms(uint xms)   //简单延时
{
	uint a , b;
	for(a=xms; a>0; a--)
	 for(b=110; b>0; b--);
}

void timing()  //初始化定时器函数
{
	TMOD = 0X01;
	TH0 = (65536-45872)/256; //装初值,11.0592M晶振,定时50ms,计数个数 N = 45872(在计数时需要预先填装初始计数个数)
	TL0 = (65536-45872)%256;
	EA = 1;
	ET0 = 1;
}

void Timer0_Rountine(void) interrupt 1  //中断号 定时器/计数器0中断  1为定时器/计数器0的中断号(重要)
{
	TH0 = (65536-45872)/256;      //方式1需要重装初值
	TL0 = (65536-45872)%256;
	numm++;      //mun变量自加1
	if(numm == 20)  //判断定时时间是否等于1s 为真之后 LED灯的电平状态转换
	{
		numm = 0;   //清零,好判断下次计时
		LED =~ LED;//电平状态取反
		num++;
		if(num == 60)
		   num = 0;		
	}
}

4.相关H文件程序代码

#ifndef __HARDWARE_H__
#define __HARDWARE_H__

#include <reg51.h>  //51单片机头文件
//数码管    138译码器 
sbit LSA=P2^2;	
sbit LSB=P2^3;	
sbit LSC=P2^4;
//LED灯
sbit LED=P2^0;
//独立按键
sbit K1 =P3^1;  //定义按键1
sbit K2 =P3^0;
sbit K3 =P3^2;
sbit K4 =P3^3;

typedef unsigned int uint;	  // typedef(类型定义) 用来给无符号整型类型数据 unsigned int 定义新名字 uint
typedef unsigned char uchar;  //用来给无符号字符型类型数据 unsigned char 定义新名字 uchar
extern uint;    //声明给外部函数使用
extern uchar;   //声明给外部函数使用
extern void tube(void);    //数码管扫描函数
extern void KEY();
#endif
#ifndef __SOFTWARE_H__
#define __SOFTWARE_H__

#include <hardware.h>  //包含此头文件,以便在此C文件中调用

extern void delayms(uint xms);   //简单延时
extern void timing();  //初始化定时器函数
extern uchar num;  //声明给外部函数使用

#endif
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 21:19:16  更:2021-07-07 21:19:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 16:13:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码