电子记分牌.docx
- 文档编号:24352974
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:13
- 大小:145.23KB
电子记分牌.docx
《电子记分牌.docx》由会员分享,可在线阅读,更多相关《电子记分牌.docx(13页珍藏版)》请在冰豆网上搜索。
电子记分牌
单片机原理与应用
综合实验报告
电子记分牌的设计
专业班级:
电子10-1班
姓名:
学号:
时间:
2012年5月24号
指导老师:
电子记分牌的设计
电子10-1班,尹崇源
基本要求:
1、设计一个比赛记分牌,用4位LED显示比赛两方的分数(每方分数用2位LED表示)。
比赛开始时显示零分。
2、每方都有得分按键和减分按键,得分按键每按一次加一分,减分按键每按一次减一分,并用数码管显示累计的分数。
扩展要求:
3、设置补时按键(例如足球比赛有补时提示)。
补时时间可自己设置,时间方式为分分秒秒(即最大为59.99,最少为1秒)。
设计思路:
整个设计的思路图如下:
因为整个仿真图的线路比较多,所以利用了总线的画法,使整个电路清楚点。
然后因为Proteus仿真,他会自动帮你把51单片机接电源,和接晶振,所以我的仿真电路图就不接了,当然真正的实体电路一定要接的。
设计一个两方的记分牌,每方用2位的LED计分,然后再加一个时间计数器,一共需要8位数码管。
然后数码管的段选输入刚好也是8位,为了节约单片机的IO口,我把数码管的段选和位选都间接连接在单片机的P0口上,就是通过74HC573锁存器连接起来。
然后P0口需要加上拉电阻的:
在键盘上我都是采用独立键盘,一共有8个,其中比赛的两方每方个两个,分别是加分和减分按键。
剩下的4个分别是时钟的启动或暂停按钮,时钟的清零按键,时钟秒位的加1按键,长按可以加得更快,还有一个是时钟分位的加1按键,长按也可以加更快。
下面就是总的设计电路图
下面就到程序了,程序必然是最烦人的,但我们只要每写一部分就仿真一下看能不能实现,这样找错就比较容易。
1.在程序设计中,时钟的计数我采用了单片机内部的定时器0进行计时。
2.当然难点还是在数码管的扫描上,我采用了写一个单一数码管显示的函数,然后在调用函数时只要写上要那个数码管亮的变量,和显示什么数的变量就行了,十分方便。
3.在键盘上我都是采用独立键盘,程序上就采用独立键盘的检测方法,程序上当然还采用了键盘消抖的软件消抖方法。
下面就是我的程序:
#include
#defineuintunsignedint
#defineucharunsignedchar
uintc,a,a1;
uchars1,s2,s3,s4,s5,s6,s7,s8,w,b,js,x,y;
sbitduan=P2^0;//定义段选
sbitwei=P2^1;//定义位选
sbitstart=P2^2;//定义时钟启动位
sbitreset=P2^3;//定义时钟归零位
sbitmiao=P2^4;//定义时钟加秒位
sbitfen=P2^5;//定义时钟加分位
sbitman1=P2^6;//定义正方加1位
sbitman11=P2^7;//定义反方减1位
sbitman2=P3^0;//定义正方加1位
sbitman22=P3^1;//定义反方减1位
voidsm(x,y);//定义数码管扫描函数
ucharcodetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x3f};//数码管编码表
ucharcodetable1[]=
{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//数码管位选表
voidmain()//主函数
{duan=0;
wei=0;
EA=1;//开总中断
ET0=1;//开定时器0
TMOD=0X01;//设定定时器的工作方式
TH0=(65535-50000)/256;//赋初值
TL0=(65535-50000)/256;
while
(1)
{sm(0,s1);//显示第一个数码管的字符
sm(1,s2);
sm(2,s3);
sm(3,s4);
sm(4,s5);
sm(5,s6);
sm(6,s7);
sm(7,s8);//显示第八个数码管的字符
if(start==0)//时钟启动按键检测
{a++;
if(a>180)
{TR0=!
TR0;
a=0;
}
}
if(reset==0)//时钟清零按键检测
{TR0=0;
s5=0;
s6=0;
s7=0;
s8=0;
}
if(fen==0)//时钟分位加1按键检测
{a++;
if(a>150)
{a=0;
s7++;
if(s7==10)
{s7=0;
s8++;
if(s8==6)
s8=0;
}
}
}
if(miao==0)//时钟秒位加1按键检测
{a++;
if(a>150)
{a=0;
s5++;
if(s5==10)
{s5=0;
s6++;
if(s6==6)
s6=0;
}
}
}
if(man1==0)//正方加1按键检测
{a++;
if(a>150)
{a=0;
s3++;
if(s3==10)
{s3=0;
s4++;
}
if(s4==10)
s4=0;
}
}
if(man11==0)//正方减1按键检测
{a++;
if(a>150)
{a=0;
if(s3==0)
{if(s4==0)
{s3=0;
s4=0;
}
else
{s3=9;
s4--;
}
}
else
s3--;
}
}
if(man2==0)//反方加1检测
{a++;
if(a>150)
{a=0;
s1++;
if(s1==10)
{s1=0;
s2++;
}
if(s2==10)
s2=0;
}
}
if(man22==0)//反方减1检测
{a++;
if(a>150)
{a=0;
if(s1==0)
{if(s2==0)
{s1=0;
s2=0;
}
else
{s1=9;
s2--;
}
}
else
s1--;
}
}
if(a>0)
{a1++;
if(a1==220)
{a=0;
a1=0;}
}
}
}
voidds0()interrupt1//定时器0中断函数
{TH0=(65535-50000)/256;
TL0=(65535-50000)/256;
js++;
if(js==20)
{js=0;
if(s5==0&s6==0&s7==0&s8==0)
s8=6;
if(s7==0&s6==0&s5==0)
{s7=10;
s8--;
}
if(s6==0&s5==0)
{s6=6;
s7--;
}
if(s5==0)
{s5=10;
s6--;
}
s5--;
if(s5==0&s6==0&s7==0&s8==0)
TR0=0;
}
}
voidsm(x,y)//数码管扫描函数
{b=5;
P0=table1[x];
wei=1;
wei=0;
P0=table[y];
duan=1;
while(b--);
P0=0x00;
duan=0;
}
心得体会:
通过本次课程设计,让我懂得了很多,很多时候程序需然能看懂,但到要自己写的时候就却就是难上加难了,还有写程序的时候一定要小心谨慎,要不一但出错了,找问题不是那么容易的事,错的往往是一个标点或者一个字符;通过这次课程设计认识到了自己的知识是如此的少,所以以后要加油了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 记分牌