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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于AT89C52单片机简易篮球计分器设计 -> 正文阅读

[嵌入式]基于AT89C52单片机简易篮球计分器设计

前言
学无止境,日常上来分享一些自己的一些小心得,虽然不是什么高尖端的技术,但是重在学习。
本设计主要讲解一个关于篮球计分器的简易系统设计及编程思路。
主要分两大部分进行阐述:电路部分和程序部分。
电路设计
简易电路设计总体来说还是比较简单的,需要的耗材也不是很多,At89C52单片机一个,两个LED,一个74LS138译码器,一个八位的数码管显示器和六个不带自锁的按键。下图所示是作者在proteus软件设计的一个仿真电路。
在这里插入图片描述
工作原理
将编写好的单片机程序下载到到单片机后,系统上电数码管会显示六个0,左边三位于右边两位,中间两位不显示,用来区分两队的分值,当左边队伍进球得分后按选择计分队伍的按键,左边LED指示灯 D1 会亮,然后根据进球分数按相应的加分按键,加一、加二或者加三分,如果不小心将分值加错的情况下可以按减一分按键减掉所加的分,当需要对的分队伍的分值进行清理的时候可以按下单队清零按键进行分值清除。右边计分方法跟左边一样,只需要将加分队伍切换到右边即可。

程序编写
程序编写主要可分两个部分,按键处理部分和数码管显示部分。

主程序如下所示

#include <stc15.h>

typedef unsigned int uint;
typedef unsigned char uchar;

#define smgduan P0    //数码管段定义
//声明按键与数码管的子程序
void key_dis();
void key_display();
void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5);
/*数码管位定义74hs138*/
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
sbit G2A=P1^3;
/*led定义,用于区别加分边,led0左边,led1右边*/
sbit led0=P1^4;
sbit led1=P1^5;
/*按键定义*/
sbit key0=P3^0;     //加分区别按键,未按下为左边,按下为右边
sbit key1=P3^1;     //加一分按键
sbit key2=P3^2;     //加两分按键
sbit key3=P3^3;     //加三分按键
sbit key4=P3^4;     //减一分按键
sbit key5=P3^5;     //复位清零按键
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

uchar fen0,fen1;       //两队得分累计标志
uchar flag0;      //模式选择标志
uchar bai0,bai1,shi0,shi1,ge0,ge1;       //数据处理标志

void delay(uint i)   //软件延时函数
{
	while(i--);
}

void main()     //主函数
{
	while(1)
	{
		key_display();
		shujuchili();
		display(ge1,shi1,bai1,ge0,shi0,bai0);
	}
}	

按键处理程序如下

void key_dis()    //加分队伍选择,flag0等于1时,左边队伍,flag0=2时,右边队伍
{
	P1=0xff;
	if(key0==0)
	{
		delay(100);
		if(key0==0)
		{
			while(!key0);
			flag0++;
			if(flag0==3)
			{
				flag0=1;
			}
		}
	}
}

void key_display()     //加减分按键处理函数
{
	key_dis();    //调用选择加分队伍子程序
	if(flag0==1)    //左边队伍
	{
		led1=1;
		led0=0;
		if(key1==0)    //加1分
		{
			delay(100);
			if(key1==0)
			{
				while(!key1);
				fen0=fen0+1;
			}
		}
		
		if(key2==0)    //加两分
		{
			delay(100);
			if(key2==0)
			{
				while(!key2);
				fen0=fen0+2;
			}
		}
		
		if(key3==0)     //加三分
		{
			delay(100);
			if(key3==0)
			{
				while(!key3);
				fen0=fen0+3;
			}
		}
		
		if(key4==0)     //减一分
		{
			delay(100);
			if(key4==0)
			{
				while(!key4);
				fen0=fen0-1;
			}
		}
		
		if(key5==0)     //清零
		{
			delay(100);
			if(key5==0)
			{
				while(!key5);
				fen0=0;
			}
		}
	}
	else if(flag0==2)     //右边队伍
	{
		led1=0;
		led0=1;    //右边队伍指示灯
		if(key1==0)    //加1分
		{
			delay(100);
			if(key1==0)
			{
				while(!key1);
				fen1=fen1+1;
			}
		}
		
		if(key2==0)    //加两分
		{
			delay(100);
			if(key2==0)
			{
				while(!key2);
				fen1=fen1+2;
			}
		}
		
		if(key3==0)     //加三分
		{
			delay(100);
			if(key3==0)
			{
				while(!key3);
				fen1=fen1+3;
			}
		}
		
		if(key4==0)     //减一分
		{
			delay(100);
			if(key4==0)
			{
				while(!key4);
				fen1=fen1-1;
			}
		}
		
		if(key5==0)     //清零
		{
			delay(100);
			if(key5==0)
			{
				while(!key5);
				fen1=0;
			}
		}
	}
}

数码管显示程序

/*将计分的存储变量进行处理,取出对应数码管所要显示的数值,个十百三位数*/
void shujuchili()     //数据处理函数
{
	//左边数码管数据处理
	bai0=fen0/100;
	shi0=fen0%100/10;
	ge0=fen0%10;
	  //右边计分队伍数据处理
	bai1=fen1/100;     //取百位
	shi1=fen1%100/10;   //取十位
	ge1=fen1%10;      //取个位
}
/*数码管显示74LS138译码器驱动程序*/
void display(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5)     //数码管显示函数
{
	uchar jj;
	G2A=0;
	for(jj=0;jj<8;jj++)   /*case0到case2为右边三位数码管,case5到case7为左边三位数码管,中间两位不进行显示,用以区分*/
	{
		switch(jj)
		{
			case 0:
				LSA=0;LSB=0;LSC=0;smgduan=duan[a5];break;
			case 1:
				LSA=1;LSB=0;LSC=0;smgduan=duan[a4];break;
			case 2:
				LSA=0;LSB=1;LSC=0;smgduan=duan[a3];break;
			case 3:
				LSA=1;LSB=1;LSC=0;smgduan=0x00;break;
			case 4:
				LSA=0;LSB=0;LSC=1;smgduan=0x00;break;
			case 5:
				LSA=1;LSB=0;LSC=1;smgduan=duan[a2];break;
			case 6:
				LSA=0;LSB=1;LSC=1;smgduan=duan[a1];break;
			case 7:
				LSA=1;LSB=1;LSC=1;smgduan=duan[a0];break;
		}
		delay(50);
		smgduan=0x00;     //消隐
	}
}

以上就是所有关于简易篮球计分器设计所有过程与程序了,写的不是很好,还望读者能给些建议或者自己能将其完善的更加完美。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:04:06  更:2021-10-24 15:05:01 
 
开发: 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年11日历 -2024/11/26 6:48:47-

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