基于51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+设计报告+实物仿真讲解视频)
仿真图proteus8.16(有低版本)
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:P09
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、-1操作。
篮球比赛24秒进攻倒计时功能
(目前仅完全适配普中开发板A234,其他普中开发板型号可能需要做代码修改或接线)
需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。
以下为本设计资料展示图:
讲解视频:
仿真讲解+代码讲解
2.仿真
开始仿真
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。
以上仿真结果均符合设计要求。
3. 程序代码
使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。
主要代码
//延时子函数
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;
RW=0;//写入
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶写数据子函数
void write_date(uchar date)
{
RS=1;
RW=0;//写入
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
LCD1602液晶设置当前行
//void write_sfm(uchar hang,uchar add)
//{
// if(hang==1) //设置当前行
// write_com(0x80+add);
// else
// write_com(0x80+0x40+add);
//}
/********************************************************************
* 名称 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
write_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '�') break;
write_date(*p);
p++;
}
}
//LCD1602液晶初始化子函数
void LCD1602_init()
{
uchar i;
a_team=0; //H.T分数初始化
b_team=0; //R.T分数初始化
time=0;
TMOD=0x10; //定时器1初始化
TL1=0x00;
TH1=0x4c; //设置定时器初值 定时器50ms一次中断
EA=1; //开总中断
ET1=1; //开定时器1
TR1=0; //定时器1不工作
E=0;
miao=0;
fen=12;//默认单节比赛时间(单位分钟)
num=1;
sec_24=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]);
}
}
//分数更新子函数
void point_lcd(uchar add,uchar dat)
{
write_com(0x80); //LCD显示初始化
if(change_flag){
write_string(1,2,"B");
write_string(1,8,"A");
}else{
write_string(1,2,"A");
write_string(1,8,"B");
}
if(change_flag){
if(add == 0x04){
add = 0x0A;
}else if(add == 0x0A){
add = 0x04;
}
}
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()
{
uchar i=0;
i=Matrix_buttons_scan();//按键检测
if(i==1) //A分数加一
{
if(a_team<1000)a_team++;
point_lcd(0x04,a_team);
}
else if(i==2) //A分数加二
{
if(a_team<1000)a_team=a_team+2;
point_lcd(0x04,a_team);
}
else if(i==3) //A分数加三
{
if(a_team<1000)a_team=a_team+3;
point_lcd(0x04,a_team);
}
else if(i==4) //A分数减一
{
if(a_team>=1)a_team=a_team-1;
point_lcd(0x04,a_team);
}
else if(i==5) //B分数加一
{
if(b_team<1000)b_team++;
point_lcd(0x0A,b_team);
}
else if(i==6) //B分数加二
{
if(b_team<1000)b_team=b_team+2;
point_lcd(0x0A,b_team);
}
else if(i==7) //B分数加三
{
if(b_team<1000)b_team=b_team+3;
point_lcd(0x0A,b_team);
}
else if(i==8) //B分数减一
{
if(b_team>=1)b_team=b_team-1;
point_lcd(0x0A,b_team);
}
else if(i==9) //交换
{
if(change_flag){
change_flag = 0;
}else{
change_flag = 1;
}
point_lcd(0x04,a_team);
point_lcd(0x0A,b_team);
}
else if(i==10) //
{
TR1=~TR1; //定时器1工作/暂停
if(TR1==1) //当倒计时工作时,S1按下定时器立即停止工作
{
PT1=0;//取消定时器1优先级最高
}
else //倒计时不工作时,S1按下倒计时立即工作
{
PT1=1;//定时器1优先级最高
}
}
else if(i==11) //
{
sec_24=24;
write_com(0x80+0x4e); //24s倒计时显示
write_date(0x30+sec_24/10); //更新倒计时时间
write_date(0x30+sec_24%10);
write_com(0x80+0x4e);
}
}
//比赛倒计时/24s倒计时
void counter_down()
{
if(time>=20) //每1s倒计时做减一操作
{
miao--;
sec_24--;
write_com(0x80+0x4e); //24s倒计时显示
write_date(0x30+sec_24/10);
write_date(0x30+sec_24%10);
write_com(0x80+0x4e);
if(sec_24==0) //24s结束
{
sec_24=24;
TR1=0; //定时器1暂停
}
if((miao==0)&&(fen==0)) //检测一节比赛是否结束
{
TR1=0; //定时器1暂停
write_com(0x80+0x44);
write_date(0x30);
num++;
sec_24=24; //24s计时复位
write_com(0x80+0x4e); //24s倒计时显示
write_date(0x30+sec_24/10);
write_date(0x30+sec_24%10);
write_com(0x80+0x4e);
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;
}
}
//主函数
void main()
{
LCD1602_init();
while(1)
{
keyscan(); //分数按键检测
}
}
4. 设计报告
9978字设计报告,内容包括摘要,硬件设计、软件设计、软硬件框图、调试、结论等
5. 设计资料内容清单&&下载链接
资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。
0、常见使用问题及解决方法–必读!!!!
1、仿真图
2、程序源码注释
3、功能要求
4、开题报告
5、设计报告
6、软硬件流程框图
7、烧录工具
8、讲解视频
Altium Designer 安装破解
filename.bat
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus安装
Proteus简易使用教程
单片机学习资料
普中-2&普中-3&普中-4开发板原理图.pdf
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url