《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月项目6简易数字电子时钟设计★知识目标:1.了解7段LED数码管的结构及其工作原理;2.掌握单片机对数码管的静态、动态显示控制方式;3.应用单片机进行计数控制的原理。★能力目标:1.能根据设计任务要求编制不同进制计数器的程序流程图,理解程序对数字电子时钟的控制原理;2.会利用电路仿真软件绘制简易数字电子时钟的电路原理图;3.会用keilC51软件对源程序进行编译调试及与protues软件联调,实现电路仿真。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月引言•单片机控制实现的数字电子时钟要完成的功能是显示小时、分和秒,是一台按秒计数并显示的计数器。其中小时采用24进制,秒和分采用60进制。•本项目从1位计数器的实现入手,逐步介绍不同进制的多位计数,最终达到设计简易数字电子时钟的目的。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月任务1从0到9的加1计数显示(静态)设计一、知识储备1.1数码管的基本知识数码管是一类显示屏通过对其不同的管脚输入相对的电流使其发亮从而显示出数字。可以显示时间、日期、温度等可以用数字代替的参数。由于它的价格便宜、使用简单,在电器特别是家电领域应用极为广泛,空调、热水器、冰箱等等绝大多数用的都是数码管。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月任务1从0到9的加1计数显示(静态)设计1.1数码管的基本知识LED数码管是一种半导体发光器件,其基本单元是发光二极管,如图6.4。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月任务1从0到9的加1计数显示(静态)设计1.1数码管的基本知识(1)按段数可以分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);(2)按能显示多少个“8”可以分为1位、2位、4位、8位数码管;(3)按发光二极管单元连接方式划分可分为共阳极/共阴极数码管。共阳极数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。当某一字段发光二极管的阴极为低电平时,相应字段就点亮。共阴极数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。当某一字段发光二极管的阳极为高电平时,相应字段就点亮。如图6.4。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月任务1从0到9的加1计数显示(静态)设计1.2LED数码管的静态驱动方式数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。显示数据时,直接将要显示的数字的编码通过单片机送到段码显示端即可。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,而一个AT89S51单片机芯片可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,硬件电路较复杂。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月任务1从0到9的加1计数显示(静态)设计一位计数器是单片机控制数码管计数显示的最简单的例子,本任务采用AT89S51单片机控制数码管静态显示的方式实现从0到9的加1计数显示。1.1提出任务用AT89S51的P2口做输出口,接一位LED数码管,编写程序,使数码管显示从0到9的加1计数,时间间隔为0.5s。即每显示一个数字后,保持0.5s,再显示下一个,显示到数字“9”之后再从“0”开始循环。二、设计示例《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.2分析任务1.硬件电路设计任务1从0到9的加1计数显示(静态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月•电路组成:这里选择具有内部程序存储器的AT89S51单片机作为控制电路(未做特殊说明,则本项目4个任务设计时均采用该单片机芯片),P2口接1个1位共阳数码管,其中P2.0到P2.6分别连接数码管的a~f引脚,P2.7连接小数点h端。硬件电路原理图如图6.1所示。•电路分析:要使LED数码管依次显示数字,则P2口对应输出七段数码管数字显示对应的编码即可。由于流过LED的电流通常较小,为了在仿真实验中让数字显示的更亮一些,所以一般还要在回路中接入合适的限流电阻。一般情况下,根据驱动LED的电流电压计算,在这里取限流电阻为150Ω。当P2.x输出为低电平时,对应的LED亮,输出高电平时,对应的LED不亮。任务1从0到9的加1计数显示(静态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.2分析任务2.软件设计思路任务1从0到9的加1计数显示(静态)设计LED数码管hgfedcbaP2口输出(16进制)功能说明P2口P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0输出电平110000000xc0显示数字“0”111110010xf9显示数字“1”101001000xa4显示数字“2”101100000xb0显示数字“3”100110010x99显示数字“4”100100100x92显示数字“5”100000100x82显示数字“6”111110000xf8显示数字“7”100000000x80显示数字“8”100100000x90显示数字“9”《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.2分析任务2.软件设计思路任务1从0到9的加1计数显示(静态)设计根据前面分析,实现任务的思路是:(1)程序开始时,给数组元素的变量赋初始值0,并将数组中第1个元素送P2端口;(2)延时0.5s后,将变量i加1,并判断是否已读取到第10个元素;(3)如果已经读取完,则对变量i重新赋值0,如果没有,则继续读取数组中第i个元素送到P2端口,依次循环。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月思考与练习任务1从0到9的加1计数显示(静态)设计1.若该从0到9的加1计数显示采用共阴极数码管,则单片机控制的硬件电路及程序如何修改?2.修改程序lsd5-1中显示的数据,使其显示范围扩大到0~F共16个十进制数。《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月一、知识储备1.1LED数码管动态显示驱动方式1.动态驱动是将所有数码管的8个显示笔划a~dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制;2.当单片机输出字形码时,所有数码管都接收到相同的字形码,我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。3.通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。任务2从0到59的加1计数显示(动态)设计数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一;《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.1LED数码管动态显示驱动方式关于视觉暂缓效应:在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,但动态显示更能够节省大量的I/O端口,而且功耗更低。任务2从0到59的加1计数显示(动态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.260进制计数程序设计说明两位数计数函数可以采用一位数的计算方法实现,本任务实现60进制计数即是采用一位计数方法:unsignedchartime=0//定义变量time为计数值,初值为0voidcalc()//计数程序{time[0]++;//计数值加1if(time[0]59)//判断计数是否到59time[0]=0;//到59,则计数从0重新开始}任务2从0到59的加1计数显示(动态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.260进制计数程序设计说明由于数据存储结构的改变,导致计算的数据结构与原有的显示程序数据结构不一致,于是本任务中将计算的数据通过一个数据转换程序后送到原有的数据结构中,实现加1计数并显示。数据转换程序:由于是一位(time)计数,两位(0~59)显示,因此将计数器所计数time转换为数码管显示所需要的十位和个位数值,转换方法是:将计数值time对10去整得到十位,对10求余得到个位。程序如下:voidconvert()//计数转换程序{display_data[0]=time/10;//对计数值取整得到计数的十位display_data[1]=time%10;//对计数值求余得到计数的个位}任务2从0到59的加1计数显示(动态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.260进制计数程序设计说明(2)分别计数方法两位数计数函数的实现方法还可以在原有的加1计算的程序基础上进行改进,即将个位数和十位数分别计数,个位计数每到9(满10),向十位进1,十位就加1,个位再从0开始计数。将计数值从数码管编码表读出且送端口显示数据,并控制个位显示在十位的右边,就完成了两位数的计数显示。其计数程序可以简要写作:inttime[]={0,0}//time[0]用于个位计数,time[1]用于存放十位计数voidcalc()//计算程序{time[0]++;//个位计数,if(time[0]9)//判断是否计数到9{time[0]=0;//若计数到9,则十位加1,个位重新从0开始time[1]++;iftime[1]5;//判断十位是否计数到5{time[1]=0//若十位计数到5,则计数重新开始}}}任务2从0到59的加1计数显示(动态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月在时钟计数时,分和秒计数一般均为60进制,也就是说从0开始到59,之后重复。基于数字电子钟设计由浅入深的原则,在实现一位数计数的基础上,本任务介绍采用AT89S51单片机控制数码管实现两位数计数。主要解决多位数计数以及不同位数的计数显示控制。1.1提出任务用AT89S51的P2口做输出口,接一个8位LED数码管,编写程序,使数码管从0开始计数,到59时复位为0,即一个两位的加法计数器,数字显示时间间隔为0.5s。二、设计示例任务2从0到59的加1计数显示(动态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月1.2分析任务1.硬件电路设计任务2从0到59的加1计数显示(动态)设计《单片机C语言应用技术与实践》张永格何乃味主编北京交通大学出版社2009年6月•电路组成:仍然选用AT89S51单片机作为控制核心,1个8位共阳极数码管作为输出显示端。AT89S51的P0口接数码管的段码控制,其中P0.0~P0.6分别连接数码管的A~G引脚,P0.7连接DP端,低电平有效。P2口接数码管位码选通部分,P2.0口控制第1个数码管,一直到P2.7口控制第8个,高电平有效。硬件电路原理图如图6.5所示,选择8位数码管的前面两位进行计数显示。•电路分析:要使8位数码管显示实现从0到59的动态计数,实际上就是通过P2口输出控制信号轮流选通数码管,共阳型数码管公共端为高电平方可选通,因此要求P2口由P2.7到P2.0依次输出高电平,然后在数码管段码