Bootstrap

基于AT89C51单片机篮球计时计分器的设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机篮球计时计分器的设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

目录

绪论

原理图

​编辑

仿真图

系统总体设计图

代码实现

系统论文

资源下载


绪论

本次设计用由AT89C51编程控制LCD1602作显示的球赛计时计分系统。该系统具有赛程定时设置、赛程时间暂停、及时刷新甲乙双方的成绩等功能。它具有价格低廉、性能稳定、操作方便并且易于携带等特点,广泛适合各类学校或者小型团体作为赛程计时计分。

原理图


仿真图


 系统总体设计图


代码实现(部分)


include<reg51.h>//51单片机头文件
typedef unsigned char uchar;
typedef unsigned int  uint;
sbit K1=P3^2;//比赛倒计时开始/暂停
sbit K2=P3^3;//24s倒计时重新开始
sbit K3=P1^3;//乙队+1按键
sbit K4=P1^2;//乙队+2按键
sbit K5=P1^1;//甲队+1按键
sbit K6=P1^0;//甲队+2按键
sbit K7=P1^4;//甲队+3按键
sbit K8=P1^5;//乙队+3按键
sbit beep=P2^0;//蜂鸣器接口  
sbit RS=P2^7;
sbit E=P2^5;
char miao,fen,num,time,aa;
uchar bb,cc;
uchar code table1[]={"H.T 000:000 R.T "};
uchar code table2[]={"12:00  SEC-1  24"};
//延时子函数
void delay(uint z)  
{
	uint x;
	uchar y;
	for(x=z;x>0;x--)
  		for(y=110;y>0;y--);
}
//LCD1602液晶写指令子函数
void write_com(uchar com)
{
	RS=0;
	P0=com;
	delay(5);
	E=1;
	delay(5);
	E=0;
}
//LCD1602液晶写数据子函数
void write_date(uchar date)
{
	RS=1;
	P0=date;
	delay(5);
	E=1;
	delay(5);
	E=0;
}
//LCD1602液晶初始化子函数
void LCD1602_init()
{
	uchar i;
	bb=0;    //H.T分数初始化
	cc=0;    //R.T分数初始化
	time=0;
	TMOD=0x10;    //定时器1初始化
	TL1=0x00;
	TH1=0x4c;
	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;
	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]);
	}
}
//分数更新子函数
void point_lcd(uchar add,uchar dat)
{
	write_com(0x80+add);
	write_date(0x30+dat/100);
	write_date(0x30+(dat%100)/10);
	write_date(0x30+dat%10);
	write_com(0x80+add);
}
//按键扫描子函数
void keyscan()
{
	if(K3==0)     //K3按下H.T分数加一
	{
  		while(K3==0);
		bb++;
  		point_lcd(0x04,bb);  //分数显示更新
  		if(K3==0)    //松手检测
  		{
   			while(K3==0);
   			delay(20);
  		}
	}
	else if(K4==0)    //S4按下H.T分数加二
	{
  		while(K4==0);
		bb=bb+2;
  		point_lcd(0x04,bb);
  		if(K4==0)
  		{
   			while(K4==0);
   			delay(20);
  		}
	}
	else if(K7==0)    //S4按下H.T分数加二
	{
  		while(K7==0);
		bb=bb+3;
  		point_lcd(0x04,bb);
  		if(K7==0)
  		{
   			while(K7==0);
   			delay(20);
  		}
	}
	else if(K5==0)    //S5按下R.T分数加一
	{
  		while(K5==0);
		cc++;
  		point_lcd(0x08,cc);
  		if(K5==0)
  		{
   			while(K5==0);
   			delay(20);
  		}
	}
	else if(K6==0)    //S6按下R.T分数加2
	{
  		while(K6==0);
		cc=cc+2;
  		point_lcd(0x08,cc);
  		if(K6==0)
  		{
   			while(K6==0);
   			delay(20);
  		}
	}
	else if(K8==0)    //S6按下R.T分数加2
	{
  		while(K8==0);
		cc=cc+3;
  		point_lcd(0x08,cc);
  		if(K8==0)
  		{
   			while(K8==0);
   			delay(20);
  		}
	}
}
//比赛倒计时/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结束发出3s连续报警
  		{
   			beep=1;
  		 	delay(3000);
   			beep=0;
   			aa=24;
  		}
  		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)    //每节结束蜂鸣器发出8s的间断报警
   			{
    			for(i=80;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;
	}
}
//主函数

系统论文(在这里只介绍部分)


3 系统调试

3.1初始状态显示

3.2甲队加分显示

3.3 乙队加分显示

3.4 倒计时显示

4  总结

本设计报告介绍了一种基于AT89S51单片机的交通灯的设计方法,本论文完成了系统的硬件设计与制作,详细介绍了系统硬件设计的过程,并结合软件系统完成了整个系统的软、硬件联调,系统工作良好,实现了基本功能。

这次课设是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助以及经过自己在图书馆和网上查资料才逐一克服了难题,学习到了不少的专业知识。在整个设计过程之前,我已经在网上找了相关方面的资料,在图书馆也借了许多书,万事开始难,在这次课设中,我掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。

5 参考文献

[1] 徐惠民, 安德宁. 单片微型计算机原理接口及应用. (第二版) 北京:北京邮电大学出版社. 2000:23-38

[2] 唐俊翟. 单片机原理与应用. 北京:冶金工业出版社, 2003. 8

[3] 丁明亮, 唐前辉.  51单片机应用设计与仿真-基于Keil C和Proteus .  北京: 北京航空航天大学出版社,  2009

[4 ]彭为. 黄科, 雷道仲. 单片机典型系统设计实例精讲. 北京:电子工业出版社. 2006:247-273

[5] 潘永雄. 新编单片机原理与应用.  西安:西安电子科技大学出版社. 2003 [6] 求是科技. 单片机典型模块设计实例导航.  北京:人民邮电出版社, 2004

[7] 李广弟. 单片机基础. 北京:北京航空航天大学出版社, 2001. 7:63-65

[8] 余发山. 单片机原理及应用技术. 徐州:中国矿业大学出版社, 2003.

[9] 马家辰, 孙玉德, 张颖等. MCS-51单片机原理及接口技术.哈尔滨:哈尔滨工业大学出版社, 1997:178-179

[10] 崔华, 蔡炎光 . 单片机实用技术. 北京:清华大学出版社, 2001.

[11] 周润景,张丽娜. 基于PROTEUS的电路及单片机系统设计及仿真. 北京:北京航空航天大学出版社,2006. 5:3-19

[12] 宋凤娟, 廉文利, 付云强. 单片机89C51在调速系统中的应用. 微计算机信息, 2007, 12(6):113-114

[13] 求是科技. 单片机应用系统开发实例导航. 北京:人民邮电出版社, 2004

[14] 何立民.  单片机应用技术选编.  北京:北京航空航天大学出版社, 2002

[15] 电子世界.  2005年9月刊. 国内邮发代号:2-892

[16] 蒋辉平, 周国雄. 基于PROTEUS 的单片机系统设计与仿真实例. 北京: 机械工业出版社,  2009

[17] 李东生. Protel99 SE电路设计技术入门与应用. 第一版. 北京:电子工业出版社. 2002

[18] 罗伯特森. PCB设计基础. 北京:机械工业出版社.2007.5:15-20

[19] 金素华, 张尉. 单片机调试方法的讨论. 电子世界, 2004, 25(4):34-65


资源下载


如果有需要这个系统的源码、仿真、论文等资源的可以私信我获取。感谢你的阅读~

;