基于单片机的篮球计时计分器设计(C语言编程、含proteus仿真图) 下载本文

生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

程序部分由主程序、T0中断程序、扫描显示子程序、计时加(减)1秒的子程序、暂停子程序、快表和回表子程序、延时子程序等组成。 3.2.1延时模块设计

void delay(int t) 调用该子程序能实现延时功能 { 通过参数t,可以调成延时时间 while(t--) {

unsigned int i; 设置变量i的变化范围,能调整延时的单位时间 for(i=0;i<200;i++); 长度,i越小,延时的单位时间越短,精度越高 } }

3.2.2 数码管动态刷新显示程序

void display(int i,int j,int x,int y) 变量i,j,x,y分别为分,秒,A分数,B分数 {

if(jie==1&&bujin!=2) 当中间变量jie==1时,为上半场,此时对P1赋值

P1=0xbf; 使P1=0xbf, 即P1=1011 1111B,上半场指示灯对应点亮

P2=0xfe;

数码管动态刷新显示程序 P2=1111 1110, i为分钟

P0=seg[i0/10]; P2=0xfe,所以刷新显示时间的分钟十位,调用延时程序, delay(1); 延时数码管的点亮 P2=0xff; P0=0;

P2=0xfd; 同理,动态刷新时分钟个位并延时点亮 P0=seg[i]; delay(1); P2=0xff; P0=0;

12

P2=0xfb; 同理,动态刷新时秒钟十位并延时点亮 P0=seg[j0/10]; delay(1); P0=0; P2=0xff;

P2=0xf7; P0=seg[j]; delay(1); P0=0; P2=0xff;

P2=0xef;

P0=seg[x0/10]; delay(1); P2=0xff; P0=0;

P2=0xdf; P0=seg[x]; delay(1); P2=0xff; P0=0;

P2=0xbf;

P0=seg[y0/10];

delay(1); P0=0; P2=0xff;

同理,动态刷新时秒钟个位并延时点亮 同理,动态刷新A分数十位并延时点亮

同理,动态刷新A分数个位并延时点亮 同理,动态刷新B分数十位并延时点亮 13

P2=0x7f; 同理,动态刷新B分数十位并延时点亮

P0=seg[y]; delay(1); P0=0; P2=0xff; }

本设计中各个数码管采用动态驱动,使各位数码管逐个轮流受控显示,由于扫描速度极快(本实验中大约每20毫秒刷新一次),所以显示效果与静态驱动相同。

3.2.3 T0中断程序

void t0(void) interrupt 1 {

TH0=0xb1; 对定时器T0送入计数初值,由于TH0=0xb; TL0=0x10; TL0=0x10 故定时器定时为20毫秒,即每 if(n==0)

20毫秒调用一次void t0(void) interrupt 1

本设计调用定时器T0,计时单位为一秒

{ n=60;

m--; } i++; if(i==50)

{ 令i值为50 50*20毫秒=1秒,来实现计时 n--; 单位为一秒 i=0; }

display(m,n-1,x,y); 调用动态刷新显示程序,即每20毫秒刷新一 } 次数码管

14

3.2.4 加分子程序 void keyjiafen1()

{ 当检测到RXD按键按下时,调用延时子程序 if(RXD==0) 实现消除按键抖动功能,即,当 delay(1);,

{ 检测到按键按下时候,延时,按键仍按下,说明 if(RXD==0) { while(RXD==0); x++;

}

}

if(TXD==0) {

delay(1); if(TXD==0) {

while(TXD==0); y++;

}

} }

3.2.5减分子程序 void keyjianfen1()

{ if(WR==0) {

按键确实按下,非抖动,A对应加分 检测TXD加分按键时候按下,B加分

减分按键检测子程序,其基本算法及功能与加分

相同 15