1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,3.6,电子表程序设计,电子表是单片机简单系统最典型的项目,本节学习使用动态扫描的方式实现,6,位数码管组成的电子钟的设计方法,主要目的是让读者掌握结构化程序设计方法,了解利用数组变量实现数码管数字显示技巧;并熟练掌握键盘的控制编程方式。,本案例设计分阶段进行,首先使用定时器的中断实现时钟的显示,按键程序实现时间调整,并通过定时器中断实现调整时数字的闪烁。,3.6.1,设计任务,电子表使用,6,位数码管显示时分秒,每个占用两个数码管。使用,4,个键控制,采用的电路见图,3.6.1,所示。六位数码管的
2、段选连接在单片机的,P0,口,位选连接在单片机的,P2,口,从右至左分别从,P2.0,到,P2.5,。键盘连接在,P3.2,到,P3.5,口。蜂鸣器连接在单片机的,P1.7,口。,图,3-6-1,硬件电路图,3.6.2,系统功能分析,一、键盘控制,键盘控制是本设计中的重要部分,在键盘上实现全部的功能的调整,首先需要定义各个按键的主要功能,功能如表,2-6-1,所示。,KEY1,键负责调整模式的选择,带有去抖功能,每按下一次,改变一次状态,共有四种状态,启动默认进入正常状态,其后依次为调秒,调分,调时状态。,KEY2,、,KEY3,在对应的模式下进行加或者减,也带有去抖功能。,KEY4,键为快速
3、返回按钮,按下此键后,立刻从其他状态进入正常状态。,二、显示时间输出,显示终端为,6,位数码管,从左到右分别显示时分秒,小时、分钟和秒各占,2,位数码管共,6,位。在调整过程中,要求对应的调整位置以,0.5,的速度进行闪烁,以示区别,3.6.3,实例代码,/*/,#include,#define,uchar,unsigned char,uchar,i=0,j=0,k,flash,flash=0 x00;,char,sec,min,hou,;,uchar,key1_down,key2_down,key3_down,key4_down,key1_mode;,code,uchar,seven_seg
4、0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;,code,uchar,seven_bit,=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf;,sbit,key1=P32;,sbit,key2=P33;,sbit,key3=P34;,sbit,key4=P35;,void delay(,uchar,x)/,延迟函数,while(x,-);,void,key_scan(void,)/,按键扫描函数,if(key1=0)/,按键,1,key1=1;,delay(3000);,if(key1=0)ke
5、y1_down=1;,if(key1=1&key1_down=1),key1_mode+;,key1_down=0;,if(key1_mode=4)key1_mode=1;,if(key2=0)/,按键,2,key2=1;,delay(3000);,if(key2=0)key2_down=1;,if(key2=1&key2_down=1&key1_mode=1),key2_down=0;,sec+;,if(key2=1&key2_down=1&key1_mode=2),key2_down=0;,min+;,if(key2=1&key2_down=1&key1_mode=3),key2_down
6、0;,hou,+;,if(key3=0)/,按键,3,key3=1;,delay(3000);,if(key3=0)key3_down=1;,if(key3=1&key3_down=1&key1_mode=1),key3_down=0;,sec-;,if(sec 0),sec=59;,if(key2=1&key2_down=1&key1_mode=2),key3_down=0;,min-;,if(min 0),min=59;,if(key2=1&key2_down=1&key1_mode=3),key3_down=0;,hou,-;,if(,hou,=100)/,半秒,flash=flash
7、k+;,i=0;,if(k,=2)/,刚好,1,秒,k=0;,sec+;,if(sec,=60),sec=0;,min+;,if(min,=60),min=0;,hou,+;,P2=1;,if(key1_mode=0)/,正常显示,switch(j,),case 0:P0=seven_segsec%10;break;,case 1:P0=seven_segsec/10;break;,case 2:P0=seven_segmin%10,case 3:P0=seven_segmin/10;break;,case 4:P0=seven_seghou%10,case 5:P0=seven_segh
8、ou/10;break;,P2=,seven_bitj,;,j+;,if(j,=6)j=0;,if(key1_mode=1)/,选定秒,k=0;,switch(j,),case 0:P0=seven_segsec%10|,flash;break,;,case 1:P0=seven_segsec/10|,flash;break,;,case 2:P0=seven_segmin%10,case 3:P0=seven_segmin/10;break;,case 4:P0=seven_seghou%10,case 5:P0=seven_seghou/10;break;,P2=,seven_bitj,;
9、j+;,if(j,=6)j=0;,if(key1_mode=2)/,选定分,switch(j,),case 0:P0=seven_segsec%10;break;,case 1:P0=seven_segsec/10;break;,case 2:P0=seven_segmin%10,case 3:P0=seven_segmin/10|,flash;break,;,case 4:P0=seven_seghou%10,case 5:P0=seven_seghou/10;break;,P2=,seven_bitj,;,j+;,if(j,=6)j=0;,if(key1_mode=3)/,选定时,swi
10、tch(j,),case 0:P0=seven_segsec%10;break;,case 1:P0=seven_segsec/10;break;,case 2:P0=seven_segmin%10,case 3:P0=seven_segmin/10;break;,case 4:P0=seven_seghou%10,case 5:P0=seven_seghou/10|,flash;break,;,P2=,seven_bitj,;,j+;,if(j,=6)j=0;,void,main(void,),sec=55;,min=59;,hou,=10;,timer0_init();,while(1),
11、key_scan,();,/*/,思考题:,3-1,电路见题图,3-1,所示,完成程序设计并在,Proteus,中设计电路,仿真实现,LED,闪烁。,题图,3-1,3-2,跑马灯又叫流水灯,能够达到明灭交替顺序显示的效果,利用单片机的,P0,口驱动,8,只,LED,可以实现跑马灯效果,程序中可以先让,P0=0 x01,,再加入延时,然后让,P0,左移一位,依次循环,并判断如果,P0,为,0,时,从新赋值,0 x01,。请你完成这个程序的设计,并在,Proteus,中设计电路仿真实现。,3-3,请你列出单片机内部所有特殊功能的寄存器名。,3-4,分别写出外部中断、定时器中断、定时器中断和串行中断
12、的步骤。,3-5,简述定时器中断初始化步骤,如果定时器,timer0,、,timer1,都产生中断,优先级如何设定?,3-6,为了用药安全,病人打点滴的液体滴注速度在根据不同用药都有限制,但医生还在人工数说的方法测量滴注速度,请你设计电路,并利用定时器的,3-7,采用外部中断实现,4,个按键输入,用一个数码管显示按键编号,请画出电路并设计程序,3-8,在,44,键盘矩阵中,没有按键按下数码管会显示,88,,现在要求没有按键按下时,显示,NO,,请在原来程序的基础上更改实现。,3-9,找一个电子手表,了解电表的功能并仔细观察按键控制方式。,3-10,请你把电子表程序的各个模块组合在一起,设计电子表的完整程序,并利用,Proteus,软件进行仿真。,3-11 6,位动态显示没有采用,switch-case,语句,而是采用数组变量的形式,请你叙述这种现实方式的基本原理。,






