基于51单片机的篮球记分牌设计 下载本文

智能仪表综合课程设计

扫描刷新显示子程序流程图如图10所示:

图10扫描刷新显示子程序流程图

4.2 软件设计具体过程

软件设计部分采用模块化程序设计,用C语言编写。Keil是美国Keil Software

公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标

13

智能仪表综合课程设计

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

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

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

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

4.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);

14

智能仪表综合课程设计

P2=0xff; P0=0;

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);

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

A分数个位并延时点亮 B分数十位并延时点亮 15

同理,动态刷新同理,动态刷新智能仪表综合课程设计

P0=0; P2=0xff;

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

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

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

16