智能仪表综合课程设计
扫描刷新显示子程序流程图如图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