• 51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)


    基于51单片机的篮球计分器液晶LCD1602显示

    ( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)

    仿真图proteus7.8及以上

    程序编译器:keil 4/keil 5

    编程语言:C语言

    设计编号:S0058

    📑1.主要功能:

    基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用)

    基于51单片机的篮球计分器液晶LCD1602显示

    设计内容:

    1、设计LCD显示篮球比赛计时计分牌。

    2、通过加分按钮可以给A队或B队加分。

    3、设计对调功能,A队和B队分数互换,意味着中场交换场地。

    4、显示比赛倒计时功能。

    5、创新内容:

    如显示第几小节。

    单节比赛或全场比赛结束后有蜂鸣器提醒。

    可以通过按键完成+1、+2、+3操作。

    篮球比赛24秒进攻倒计时功能

    需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

    📑讲解视频:

    仿真讲解+代码讲解

    51单片机篮球计分器LCD1602液晶(仿真+代码+报告+原理图+PCB+讲解)

    📑2.仿真

    开始仿真

    打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

    img

    📑3. 程序代码

    使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。

    img

    ⚓️LCD1602液晶初始化子函数:

    //LCD1602液晶初始化子函数
    void LCD1602_init()
    {
    	uchar i;
    	bb=0;    //H.T分数初始化
    	cc=0;    //R.T分数初始化
    	time=0;
    	TMOD=0x10;    //定时器1初始化 
    	TL1=0x00;
    	TH1=0x4c;  //设置定时器初值 定时器50ms一次中断
    	EA=1;     //开总中断
    	ET1=1;     //开定时器1
    	TR1=0;     //定时器1不工作
    	EX0=1;     //开中断0
    	EX1=1;     //开中断1
    	IT0=1;     //中断0为边沿触发
    	IT1=1;     //中断1为边沿触发
    	E=0; 
    	beep=0;
    	miao=0;
    	fen=12;//默认单节比赛时间(单位分钟)
    	num=1;
    	aa=24;
    	change_flag = 0;
    	write_com(0x38);  //LCD设置初始化
    	write_com(0x0c);
    	write_com(0x06);
    	write_com(0x01);
    	write_com(0x80);  //LCD显示初始化
    	for(i=0;i<16;i++)
    	{
    	  	write_date(table1[i]);
    	}
    	write_com(0x80+0x40);
    	for(i=0;i<16;i++)
    	{
    	  	write_date(table2[i]);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    ⚓️ 按键处理函数

    //按键扫描子函数
    void keyscan()
    {
    	if(K3==0)     //K3按下A分数加一
    	{
      		while(K3==0);
    		bb++;
      		point_lcd(0x04,bb);  
    		
      		if(K3==0)    //松手检测
      		{
       			while(K3==0);
       			delay(20);
      		}
    	}
    	else if(K4==0)    //S4按下A分数加二
    	{
      		while(K4==0);
    		bb=bb+2;
      		point_lcd(0x04,bb);
      		if(K4==0)
      		{
       			while(K4==0);
       			delay(20);
      		}
    	}
    	else if(K7==0)    //S4按下A分数加二
    	{
      		while(K7==0);
    		bb=bb+3;
      		point_lcd(0x04,bb);
      		if(K7==0)
      		{
       			while(K7==0);
       			delay(20);
      		}
    	}
    	else if(K5==0)    //S5按下B分数加一
    	{
      		while(K5==0);
    		cc++;
      		point_lcd(0x0A,cc);
      		if(K5==0)
      		{
       			while(K5==0);
       			delay(20);
      		}
    	}
    	else if(K6==0)    //S6按下B分数加2
    	{
      		while(K6==0);
    		cc=cc+2;
      		point_lcd(0x0A,cc);
      		if(K6==0)
      		{
       			while(K6==0);
       			delay(20);
      		}
    	}
    	else if(K8==0)    //S6按下B分数加2
    	{
      		while(K8==0);
    		cc=cc+3;
      		point_lcd(0x0A,cc);
      		if(K8==0)
      		{
       			while(K8==0);
       			delay(20);
      		}
    	}
    	else if(K9==0)    //S6按下B分数加2
    	{
      		while(K9==0);
    		if(change_flag){
    			change_flag = 0;
    		}else{
    			change_flag = 1;
    		}
    		point_lcd(0x04,bb);
    		point_lcd(0x0A,cc);		
      		if(K9==0)
      		{
       			while(K9==0);
       			delay(20);
      		}
    	}	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    ⚓️ 比赛计时部分函数

    //比赛倒计时/24s倒计时
    void counter_down()
    {
    	uchar i;
    	if(time>=20)     //每1s倒计时做减一操作
    	{
      		miao--;
      		aa--;
      		write_com(0x80+0x4e);  //24s倒计时显示
      		write_date(0x30+aa/10);
      		write_date(0x30+aa%10);
    		write_com(0x80+0x4e);
      		if(aa==0)    //24s结束发出报警
      		{
       			beep=1;
      		 	delay(3000);
       			beep=0;
       			aa=24;
    			TR1=0;     //定时器1暂停
      		}
      		if((miao==0)&&(fen==0))  //检测一节比赛是否结束
      		{
       			TR1=0;     //定时器1暂停
       			write_com(0x80+0x44);
       			write_date(0x30);
       			num++;
       			aa=24;    //24s计时复位
       			write_com(0x80+0x4e);  //24s倒计时显示
       			write_date(0x30+aa/10);
       			write_date(0x30+aa%10);
    			write_com(0x80+0x4e);
       			if(num<5)    //每节结束蜂鸣器发出4s的间断报警
       			{
        			for(i=40;i>0;i--)
        			{
         				beep=1;
         				delay(500);
         				beep=0;
         				delay(500);
        			}
       			}
       			if(num==5)    //终场结束,蜂鸣器发出10s的连续警报声
       			{
         			beep=1;
         			delay(10000);
         			num=0;
       			}	
       			beep=0;     //蜂鸣器关闭
    			write_com(0x80+0x4b); //更新"SEC-?"
    			write_date(0x30+num);
    			write_com(0x80+0x4b);
    			miao=0;     //倒计时复位
    			fen=12;
      		}
      		if(miao==-1)
      		{
       			miao=59;
       			fen--;
      		}
      		write_com(0x80+0x40);  //更新倒计时显示
      		write_date(0x30+fen/10);
      		write_date(0x30+fen%10);
      		write_com(0x80+0x43);
      		write_date(0x30+miao/10);
      		write_date(0x30+miao%10);
    		write_com(0x80+0x43);
      		time=0;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    📑4. 原理图

    原理图使用AD绘制,可供实物参考。

    img

    Proteus仿真和实物作品的区别:

    1.运行环境:Proteus仿真是在计算机上运行的,而实物则是在硬件电路板上运行。

    2.调试方式:在Proteus仿真中,可以方便地进行单步调试和观察变量值的变化,而在实物中则需要通过调试器或者串口输出等方式进行调试。

    电路连接方式:在Proteus仿真中,可以通过软件设置进行电路连接的修改,而在实物中则需要通过硬件电路板和连接线进行修改。

    3.运行速度:Proteus仿真通常比实物运行速度快,因为仿真是基于计算机运行的,而实物则需要考虑电路板上的物理限制和器件的响应时间等因素。

    4.功能实现:在Proteus仿真中,可以通过软件设置实现不同的功能,而在实物中则需要根据电路设计和器件的性能进行实现。

    📑5. PCB图

    img

    📑6. 设计报告

    10112字设计报告,内容包括摘要,硬件设计、软件设计、软硬件框图、调试、结论等

    img

    📑7. 设计资料内容清单&&下载链接

    资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

    资料下载链接:

    0、常见使用问题及解决方法–必读!!!!

    1、仿真图

    2、程序源码

    3、开题报告

    3、原理图

    5、功能要求

    6、元器件清单

    7、设计报告

    8、软硬件流程框图

    9、讲解视频

    Altium Designer 软件资料

    KEIL软件资料

    Proteus软件资料

    单片机学习资料

    答辩技巧

    设计报告常用描述

    鼠标双击打开查找更多51 STM32单片机课程毕业设计.url

    img

  • 相关阅读:
    LintCode 3209: Moving fruit 堆典型题
    JPA 中 LazyInitializationException 解决方案
    HDMI接口类型种类区分图(高清图)
    超详细的网络抓包神器 tcpdump 使用指南
    Flutter-自定义可展开文本控件
    【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路
    关于使用命令行打开wps word文件
    大数据实战之HDFS单机配置
    Windows 获取打印机及端口号方法 (C#)
    GBASE 8s 如何并行执行update statistics
  • 原文地址:https://blog.csdn.net/weixin_52733843/article/details/134251852