30秒倒计时器课程设计

作者&投稿:管贷 (若有异议请与网页底部的电邮联系)
30秒倒计时电路的设计?~

首先要有个可以产生1秒的时钟电路,可以通过CD4040加32768HZ的晶镇分频,分频后是2HZ,还要在分一次可以用CD4013之类的双D触发器实现,但我一般1秒的记时喜欢使用家庭的石英钟的电路.他的脉冲的0.5HZ也就是2秒发一次,但需要通过二极管来整出来,因为他的0.5HZ是分别发的然后对地是1赫兹. 然后就是记时电路,可以用2 个CD4028是带有正负记时的十进制记数电路,有进位和借位(在减记数时用到借位)BCD码输出,通过CD4511或CD4543(我比较喜欢CD4543,因为他的6和9显示的比较人性化,而4511显示的6没有最上面的横,和b的样子差不多,9没有下面的一横和q差不多)来进行数码管驱动,而4543的好处是他可以选择共阳极还是共阴数码管.然后把4028设定到负计时方式(通过引脚的电平来控制)然后可以用个电子开关比如CD4066来控制设定的时间这个可以定时到99秒,但要是显示30秒,需要预先设定到3和0十位的3需要先自己做个小脉冲发生器,来进行设定,这个自己就可以设计出电路来了吧~

  【摘 要】篮球比赛30秒钟规则规定:进攻球队在场上控球时必须在30秒钟内投篮出手(NBA比赛为24秒,全美大学体育联合会比赛中为35秒),因此在比赛时裁判既要看比赛又要看秒表计时,而本文介绍的30秒倒计时器可以解决此问题。

  【关键词】AT89C51单片机、30秒倒计时器、LED

  30秒倒计时器的设计和制作有很多方法,本文介绍的30秒倒计时器以AT89C51单片机作为控制单元,采用两个数码管显示时间,用三个按键分别控制计时器的计时开始、复位和暂停。倒计时器初始状态显示“30”,当裁判员按下计时键,30秒倒计时开始,当计时器时间减到0时,计时器发出声光报警,提示裁判计时时间已到。

  一、电路设计

  30秒倒计时器的电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成,30秒倒计时器控制电路如图1所示。


  图1 30秒倒计时器电路原理图

  1、按键输入

  “30秒倒计时器”采用了三个按键来完成计数器的启动计数、复位、暂停/继续计数等功能。

  (1)K1键:启动按钮(P3.2)。

  按下K1键,计数器倒计时开始,数码管显示数字从30开始每秒递减计数,当递减到到零时,报警电路发出声、光报警信号。当计数器处于暂停状态时按下K1键将回到计时状态。

  (2)K2键:复位按钮(P3.3)。

  按下K2键,不管计数器工作于什么状态,计数器立即复位到预置值 “30” ,在报警状态时按下K2键还可取消报警。

  (3)K3键:暂停/计时切换按钮(P3.4)。

  当计数器处于计时状态时按下该键计数器暂停计时,数码管显示数字保持不变;当计数器处于暂停状态按下该键计数器将回到计时状态;初始状态时该键无效。

  2、显示驱动电路

  “30秒倒计时器”用两个共阳数码管来显示时间,数码管显示方式为动态显示。显示驱动电路中,数码管的段码引脚通过470欧的电阻接到单片机的P1口,两个片选引脚各通过一个9012连接到正5V电源,由P3.0和P3.1控制。

  4、报警电路

  计时时间减到0,显示数码管显示“00”时,发光二极管D1由P3.5控制发出光报警,同时蜂鸣器由P3.7控制发出声报警。

  二、软件编程思路

  1、全局变量

  “30秒倒计时器”动作流程主要受三个全局变量控制。首先是bit变量“act”,当“act”为“1”时倒计时开始,为“0”时倒计时停止,“act”初值为“0”,可以由按钮操作将其置“1”或清“0”。第二个全局变量是char变量“time”,存放倒计时的时间,当倒计时时间为0时,发出声光报警。变量“time”的初值为30,定时中断服务程序在“act”为1时,每1s对其进行减1操作,减到0时保持为0,按下“复位键”可将“time”复位为30。第三个全局变量是int变量“t”,记录响应定时中断0的次数。根据初始化定义,定时器0以方式1工作,每1ms发出一次中断请求。控制程序只开放了定时器0中断,因此不会有比定时器0中断更高级的中断被允许,所以每次请求都会立刻被响应。响应后在中断服务程序中将全局变量“t”加1记录响应中断次数,每响应1000次即为1秒钟。变量“t”初值为0,在中断服务程序中加1,当“t”为2000时由中断服务程序清0。在按键驱动程序中,按下启动键、复位键、暂停/启动键时将“t”清0,目的是从0ms开始计时。

  2、控制流程

  主程序主要用来检测全局变量“time”当“time”为0时发出“声光报警”。按键驱动、显示驱动和“time”操作都在定时器0中断服务程序中进行。其控制流程如图2所示。


  图2 控制流程图

  三、软件程序设计

  1、数码管驱动程序

  到计时器的两个数码管以动态显示的方式显示计时时间“time”(全局变量),LED1显示“time”的十位,LED2显示“time”的个位。

  (1)定义段码数据口和片选信号

  根据实际电路,在C51中定义段码的数据口为P1,两个片选信号为P3.0和P3.1。定义如下:

  #define duan P1

  sbit wei1=P3^0;

  sbit wei2=P3^1;

  (2)定义字形码

  LED显示数字0~9以及全灭的字形码表格放在数组zixing[]中。字形码是固定的表格,定义时加上关键字“code” 表示该表格存放在程序存储器中。

  unsigned char code zixing[]=

  {

  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff

  };

  (3)定义数码管LED1和LED2的显示变量

  为了增加驱动程序的可移植性,笔者为数码管LED1和LED2定义了显示变量。显示变量就是本驱动程序的对外接口,外部程序只要改变显示变量的值就可改变数码管显示的数值。定义方式如下:

  unsigned char led_str[2]={10,10};

  led_str[0]直接对应数码管LED1, led_str[1]直接对应数码管LED2。本项目中由专门的子程序将全局变量time计算拆分成led_str[0]和led_str[1]。

  void js()

  {

  led_str[1]=time/10%10;

  led_str[0]=time%10;

  }

  (4)数码管驱动程序

  数码管驱动程序“void chushi(char i)”在定时中断服务程序中被调用执行。根据初始化程序的定义,定时中断服务程序每1ms被执行一次。定时中断服务程序中运用全局变量“t”记录进入该服务程序的次数,“t”计满2000由定时中断服务程序清零。

  数码管驱动程序的参数“char i”是用来确定当前点亮的是LED1还是LED2,当参数为“0”时点亮LED1,参数为“1”时点亮LED2。如果我们希望偶数次进入定时中断服务程序时点亮LED1,奇数次进入定时中断服务程序时点亮LED2,我们可以用程序调用语句“chushi(t%2);”轻松实现。

  进入数码管驱动程序后首先调用子函数js(),计算当前的led_str[0]和led_str[1]。接下来将两个数码管全部熄灭以防止余晖的出现。最后点亮需要点亮的数码管并送出字型码。驱动程序代码如下:

  void chushi(char i)

  {

  js(); //计算显示变量

  duan=0xff; //去余晖

  wei1=i; wei2=!i; //确定片选

  duan=zixing[led_str[i]]; //送字型码

  }

  2、按键驱动程序

  按键驱动程序分为按键识别和按键功能执行两部分。按键功能执行可在按键按下时或按键抬起后执行,文中将其设计在按键抬起后执行。

  (1)定义按键I/O地址

  根据实际电路,三个按键(启动键、复位键、暂停/启动键)分别接在P3口的P3.2,P3.3和P3.4三个引脚上。为了取键值方便还将P3口定义为“iokey”,程序中可作定义如下:

  #define iokey P3

  sbit key1=P3^2;

  sbit key2=P3^3;

  sbit key3=P3^4;

  (2)按键驱动流程

  按键识别的通用流程为:I/O口写“1”→判断有无键按下→延时去抖→确定键值→等待按键抬起→执行按键功能。按键驱动程序中定义了两个静态变量“ts” 和“kv”,分别用来延时去抖和存放键值。

  (3)延时去抖

  静态变量“ts”用来延时去抖。按键驱动程序在定时中断服务程序中每1ms被执行一遍,每检测到有键按下“ts”加1,检测到无键按下“ts”清0。按键连续按下20ms,则连续20次执行按键驱动程序时都检测到有键按下,此时静态变量“ts”累加到20,可确认按键按下有效。

  为防止按键一直按着不放而使“ts”累加到溢出,确认有键按下后可使“ts”的值保持为20,或大于20的某一个值如21。

  (4)取键值

  确认有键按下后即可通过读取按键的I/O口状态来得到键值。为读取P3.2、P3.3和P3.4引脚状态,屏蔽P3口其他引脚的影响,可将读取后的数值按位或上11100011B(0xE3)再送给静态变量“kv”。

  静态变量“kv”存放按键的键值,无键按下或按键抬起后kv的值为0。按下启动键key1时kv=11111011B(0xFB),按下复位键key2时kv=11110111B(0xF7),按下暂停/启动键key3时kv=11101111B(0xEF)。

  (5)执行按键功能

  按键抬起后第一次执行按键驱动程序时,静态变量“kv”任保持着按键按下时最后得到的键值,以该键值作为参数调用按键执行程序“actkey(kv);”即可执行按键功能。调用后kv值立刻清0,确保按一次键执行一次按键功能。驱动程序代码如下:

  void key()

  {

  static unsigned char kv=0;

  static unsigned char ts=0;

  key1=1;key2=1;key3=1;

  if(!(key1&key2&key3))

  {

  ts++;

  if(ts>=20)ts=20; //有键按下

  if(ts==20)

  kv=iokey|0xe3; //取键值

  }

  else

  { //无键按下或按键已抬起

  actkey(kv);

  ts=0;

  kv=0;

  }

  }

  函数actkey(kv)用来根据键值“kv”执行相应操作。当“kv”等于0xFB时代表启动键key1按下,函数actkey(kv)将全局变量act赋值为“1”。当“kv”等于0xF7时代表复位键key2按下,函数actkey(kv)将全局变量“time”复位为“30”。当“kv”等于0xEF时代表暂停/启动键按下,函数actkey(kv)将全局变量act取反。每按一个按钮都有将全局变量“t”清0的操作,目的是每当复位、或启动计时时,进入定时中断的次数都从0开始计算,否则会出现第1秒计时不准确的现象。程序代码如下:

  void actkey(unsigned char k)

  {

  switch(k)

  {

  case 0xfb:act=1;t=0;break;

  case 0xf7:time=30;t=0; break;

  case 0xef:act=~act;t=0; break;

  }

  }

  四、结束语

  本文在编程过程中以面向对象的编程思路封装了两个LED数码管和三个独立按键。当其驱动程序在定时中断服务程序中被调用,编程者只要操作其接口:数组“led_str[2]”和函数“actkey(unsigned char k)”,无需直接对硬件进行编程即可改变功能,增强了软件的通用性和可移植性。

  【摘 要】篮球比赛30秒钟规则规定:进攻球队在场上控球时必须在30秒钟内投篮出手(NBA比赛为24秒,全美大学体育联合会比赛中为35秒),因此在比赛时裁判既要看比赛又要看秒表计时,而本文介绍的30秒倒计时器可以解决此问题。

  【关键词】AT89C51单片机、30秒倒计时器、LED

  30秒倒计时器的设计和制作有很多方法,本文介绍的30秒倒计时器以AT89C51单片机作为控制单元,采用两个数码管显示时间,用三个按键分别控制计时器的计时开始、复位和暂停。倒计时器初始状态显示“30”,当裁判员按下计时键,30秒倒计时开始,当计时器时间减到0时,计时器发出声光报警,提示裁判计时时间已到。

  一、电路设计

  30秒倒计时器的电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成,30秒倒计时器控制电路如图1所示。

  图1 30秒倒计时器电路原理图

  1、按键输入

  “30秒倒计时器”采用了三个按键来完成计数器的启动计数、复位、暂停/继续计数等功能。

  (1)K1键:启动按钮(P3.2)。

  按下K1键,计数器倒计时开始,数码管显示数字从30开始每秒递减计数,当递减到到零时,报警电路发出声、光报警信号。当计数器处于暂停状态时按下K1键将回到计时状态。

  (2)K2键:复位按钮(P3.3)。

  按下K2键,不管计数器工作于什么状态,计数器立即复位到预置值 “30” ,在报警状态时按下K2键还可取消报警。

  (3)K3键:暂停/计时切换按钮(P3.4)。

  当计数器处于计时状态时按下该键计数器暂停计时,数码管显示数字保持不变;当计数器处于暂停状态按下该键计数器将回到计时状态;初始状态时该键无效。

  2、显示驱动电路

  “30秒倒计时器”用两个共阳数码管来显示时间,数码管显示方式为动态显示。显示驱动电路中,数码管的段码引脚通过470欧的电阻接到单片机的P1口,两个片选引脚各通过一个9012连接到正5V电源,由P3.0和P3.1控制。

  4、报警电路

  计时时间减到0,显示数码管显示“00”时,发光二极管D1由P3.5控制发出光报警,同时蜂鸣器由P3.7控制发出声报警。

  二、软件编程思路

  1、全局变量

  “30秒倒计时器”动作流程主要受三个全局变量控制。首先是bit变量“act”,当“act”为“1”时倒计时开始,为“0”时倒计时停止,“act”初值为“0”,可以由按钮操作将其置“1”或清“0”。第二个全局变量是char变量“time”,存放倒计时的时间,当倒计时时间为0时,发出声光报警。变量“time”的初值为30,定时中断服务程序在“act”为1时,每1s对其进行减1操作,减到0时保持为0,按下“复位键”可将“time”复位为30。第三个全局变量是int变量“t”,记录响应定时中断0的次数。根据初始化定义,定时器0以方式1工作,每1ms发出一次中断请求。控制程序只开放了定时器0中断,因此不会有比定时器0中断更高级的中断被允许,所以每次请求都会立刻被响应。响应后在中断服务程序中将全局变量“t”加1记录响应中断次数,每响应1000次即为1秒钟。变量“t”初值为0,在中断服务程序中加1,当“t”为2000时由中断服务程序清0。在按键驱动程序中,按下启动键、复位键、暂停/启动键时将“t”清0,目的是从0ms开始计时。

  2、控制流程

  主程序主要用来检测全局变量“time”当“time”为0时发出“声光报警”。按键驱动、显示驱动和“time”操作都在定时器0中断服务程序中进行。其控制流程如图2所示。

  图2 控制流程图

  三、软件程序设计

  1、数码管驱动程序

  到计时器的两个数码管以动态显示的方式显示计时时间“time”(全局变量),LED1显示“time”的十位,LED2显示“time”的个位。

  (1)定义段码数据口和片选信号

  根据实际电路,在C51中定义段码的数据口为P1,两个片选信号为P3.0和P3.1。定义如下:

  #define duan P1

  sbit wei1=P3^0;

  sbit wei2=P3^1;

  (2)定义字形码

  LED显示数字0~9以及全灭的字形码表格放在数组zixing[]中。字形码是固定的表格,定义时加上关键字“code” 表示该表格存放在程序存储器中。

  unsigned char code zixing[]=

  {

  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff

  };

  (3)定义数码管LED1和LED2的显示变量

  为了增加驱动程序的可移植性,笔者为数码管LED1和LED2定义了显示变量。显示变量就是本驱动程序的对外接口,外部程序只要改变显示变量的值就可改变数码管显示的数值。定义方式如下:

  unsigned char led_str[2]={10,10};

  led_str[0]直接对应数码管LED1, led_str[1]直接对应数码管LED2。本项目中由专门的子程序将全局变量time计算拆分成led_str[0]和led_str[1]。

  void js()

  {

  led_str[1]=time/10%10;

  led_str[0]=time%10;

  }

  (4)数码管驱动程序

  数码管驱动程序“void chushi(char i)”在定时中断服务程序中被调用执行。根据初始化程序的定义,定时中断服务程序每1ms被执行一次。定时中断服务程序中运用全局变量“t”记录进入该服务程序的次数,“t”计满2000由定时中断服务程序清零。

  数码管驱动程序的参数“char i”是用来确定当前点亮的是LED1还是LED2,当参数为“0”时点亮LED1,参数为“1”时点亮LED2。如果我们希望偶数次进入定时中断服务程序时点亮LED1,奇数次进入定时中断服务程序时点亮LED2,我们可以用程序调用语句“chushi(t%2);”轻松实现。

  进入数码管驱动程序后首先调用子函数js(),计算当前的led_str[0]和led_str[1]。接下来将两个数码管全部熄灭以防止余晖的出现。最后点亮需要点亮的数码管并送出字型码。驱动程序代码如下:

  void chushi(char i)

  {

  js(); //计算显示变量

  duan=0xff; //去余晖

  wei1=i; wei2=!i; //确定片选

  duan=zixing[led_str[i]]; //送字型码

  }

  2、按键驱动程序

  按键驱动程序分为按键识别和按键功能执行两部分。按键功能执行可在按键按下时或按键抬起后执行,文中将其设计在按键抬起后执行。

  (1)定义按键I/O地址

  根据实际电路,三个按键(启动键、复位键、暂停/启动键)分别接在P3口的P3.2,P3.3和P3.4三个引脚上。为了取键值方便还将P3口定义为“iokey”,程序中可作定义如下:

  #define iokey P3

  sbit key1=P3^2;

  sbit key2=P3^3;

  sbit key3=P3^4;

  (2)按键驱动流程

  按键识别的通用流程为:I/O口写“1”→判断有无键按下→延时去抖→确定键值→等待按键抬起→执行按键功能。按键驱动程序中定义了两个静态变量“ts” 和“kv”,分别用来延时去抖和存放键值。

  (3)延时去抖

  静态变量“ts”用来延时去抖。按键驱动程序在定时中断服务程序中每1ms被执行一遍,每检测到有键按下“ts”加1,检测到无键按下“ts”清0。按键连续按下20ms,则连续20次执行按键驱动程序时都检测到有键按下,此时静态变量“ts”累加到20,可确认按键按下有效。

  为防止按键一直按着不放而使“ts”累加到溢出,确认有键按下后可使“ts”的值保持为20,或大于20的某一个值如21。

  (4)取键值

  确认有键按下后即可通过读取按键的I/O口状态来得到键值。为读取P3.2、P3.3和P3.4引脚状态,屏蔽P3口其他引脚的影响,可将读取后的数值按位或上11100011B(0xE3)再送给静态变量“kv”。

  静态变量“kv”存放按键的键值,无键按下或按键抬起后kv的值为0。按下启动键key1时kv=11111011B(0xFB),按下复位键key2时kv=11110111B(0xF7),按下暂停/启动键key3时kv=11101111B(0xEF)。

  (5)执行按键功能

  按键抬起后第一次执行按键驱动程序时,静态变量“kv”任保持着按键按下时最后得到的键值,以该键值作为参数调用按键执行程序“actkey(kv);”即可执行按键功能。调用后kv值立刻清0,确保按一次键执行一次按键功能。驱动程序代码如下:

  void key()

  {

  static unsigned char kv=0;

  static unsigned char ts=0;

  key1=1;key2=1;key3=1;

  if(!(key1&key2&key3))

  {

  ts++;

  if(ts>=20)ts=20; //有键按下

  if(ts==20)

  kv=iokey|0xe3; //取键值

  }

  else

  { //无键按下或按键已抬起

  actkey(kv);

  ts=0;

  kv=0;

  }

  }

  函数actkey(kv)用来根据键值“kv”执行相应操作。当“kv”等于0xFB时代表启动键key1按下,函数actkey(kv)将全局变量act赋值为“1”。当“kv”等于0xF7时代表复位键key2按下,函数actkey(kv)将全局变量“time”复位为“30”。当“kv”等于0xEF时代表暂停/启动键按下,函数actkey(kv)将全局变量act取反。每按一个按钮都有将全局变量“t”清0的操作,目的是每当复位、或启动计时时,进入定时中断的次数都从0开始计算,否则会出现第1秒计时不准确的现象。程序代码如下:

  void actkey(unsigned char k)

  {

  switch(k)

  {

  case 0xfb:act=1;t=0;break;

  case 0xf7:time=30;t=0; break;

  case 0xef:act=~act;t=0; break;

  }

  }

  四、结束语

  本文在编程过程中以面向对象的编程思路封装了两个LED数码管和三个独立按键。当其驱动程序在定时中断服务程序中被调用,编程者只要操作其接口:数组“led_str[2]”和函数“actkey(unsigned char k)”,无需直接对硬件进行编程即可改变功能,增强了软件的通用性和可移植性。

  【摘 要】篮球比赛30秒钟规则规定:进攻球队在场上控球时必须在30秒钟内投篮出手(NBA比赛为24秒,全美大学体育联合会比赛中为35秒),因此在比赛时裁判既要看比赛又要看秒表计时,而本文介绍的30秒倒计时器可以解决此问题。

  【关键词】AT89C51单片机、30秒倒计时器、LED

  30秒倒计时器的设计和制作有很多方法,本文介绍的30秒倒计时器以AT89C51单片机作为控制单元,采用两个数码管显示时间,用三个按键分别控制计时器的计时开始、复位和暂停。倒计时器初始状态显示“30”,当裁判员按下计时键,30秒倒计时开始,当计时器时间减到0时,计时器发出声光报警,提示裁判计时时间已到。

  一、电路设计

  30秒倒计时器的电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成,30秒倒计时器控制电路如图1所示。

  图1 30秒倒计时器电路原理图

  1、按键输入

  “30秒倒计时器”采用了三个按键来完成计数器的启动计数、复位、暂停/继续计数等功能。

  (1)K1键:启动按钮(P3.2)。

  按下K1键,计数器倒计时开始,数码管显示数字从30开始每秒递减计数,当递减到到零时,报警电路发出声、光报警信号。当计数器处于暂停状态时按下K1键将回到计时状态。

  (2)K2键:复位按钮(P3.3)。

  按下K2键,不管计数器工作于什么状态,计数器立即复位到预置值 “30” ,在报警状态时按下K2键还可取消报警。

  (3)K3键:暂停/计时切换按钮(P3.4)。

  当计数器处于计时状态时按下该键计数器暂停计时,数码管显示数字保持不变;当计数器处于暂停状态按下该键计数器将回到计时状态;初始状态时该键无效。

  2、显示驱动电路

  “30秒倒计时器”用两个共阳数码管来显示时间,数码管显示方式为动态显示。显示驱动电路中,数码管的段码引脚通过470欧的电阻接到单片机的P1口,两个片选引脚各通过一个9012连接到正5V电源,由P3.0和P3.1控制。

  4、报警电路

  计时时间减到0,显示数码管显示“00”时,发光二极管D1由P3.5控制发出光报警,同时蜂鸣器由P3.7控制发出声报警。

  二、软件编程思路

  1、全局变量

  “30秒倒计时器”动作流程主要受三个全局变量控制。首先是bit变量“act”,当“act”为“1”时倒计时开始,为“0”时倒计时停止,“act”初值为“0”,可以由按钮操作将其置“1”或清“0”。第二个全局变量是char变量“time”,存放倒计时的时间,当倒计时时间为0时,发出声光报警。变量“time”的初值为30,定时中断服务程序在“act”为1时,每1s对其进行减1操作,减到0时保持为0,按下“复位键”可将“time”复位为30。第三个全局变量是int变量“t”,记录响应定时中断0的次数。根据初始化定义,定时器0以方式1工作,每1ms发出一次中断请求。控制程序只开放了定时器0中断,因此不会有比定时器0中断更高级的中断被允许,所以每次请求都会立刻被响应。响应后在中断服务程序中将全局变量“t”加1记录响应中断次数,每响应1000次即为1秒钟。变量“t”初值为0,在中断服务程序中加1,当“t”为2000时由中断服务程序清0。在按键驱动程序中,按下启动键、复位键、暂停/启动键时将“t”清0,目的是从0ms开始计时。

  2、控制流程

  主程序主要用来检测全局变量“time”当“time”为0时发出“声光报警”。按键驱动、显示驱动和“time”操作都在定时器0中断服务程序中进行。其控制流程如图2所示。

  图2 控制流程图

  三、软件程序设计

  1、数码管驱动程序

  到计时器的两个数码管以动态显示的方式显示计时时间“time”(全局变量),LED1显示“time”的十位,LED2显示“time”的个位。

  (1)定义段码数据口和片选信号

  根据实际电路,在C51中定义段码的数据口为P1,两个片选信号为P3.0和P3.1。定义如下:

  #define duan P1

  sbit wei1=P3^0;

  sbit wei2=P3^1;

  (2)定义字形码

  LED显示数字0~9以及全灭的字形码表格放在数组zixing[]中。字形码是固定的表格,定义时加上关键字“code” 表示该表格存放在程序存储器中。

  unsigned char code zixing[]=

  {

  0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff

  };

  (3)定义数码管LED1和LED2的显示变量

  为了增加驱动程序的可移植性,笔者为数码管LED1和LED2定义了显示变量。显示变量就是本驱动程序的对外接口,外部程序只要改变显示变量的值就可改变数码管显示的数值。定义方式如下:

  unsigned char led_str[2]={10,10};

  led_str[0]直接对应数码管LED1, led_str[1]直接对应数码管LED2。本项目中由专门的子程序将全局变量time计算拆分成led_str[0]和led_str[1]。

  void js()

  {

  led_str[1]=time/10%10;

  led_str[0]=time%10;

  }

  (4)数码管驱动程序

  数码管驱动程序“void chushi(char i)”在定时中断服务程序中被调用执行。根据初始化程序的定义,定时中断服务程序每1ms被执行一次。定时中断服务程序中运用全局变量“t”记录进入该服务程序的次数,“t”计满2000由定时中断服务程序清零。

  数码管驱动程序的参数“char i”是用来确定当前点亮的是LED1还是LED2,当参数为“0”时点亮LED1,参数为“1”时点亮LED2。如果我们希望偶数次进入定时中断服务程序时点亮LED1,奇数次进入定时中断服务程序时点亮LED2,我们可以用程序调用语句“chushi(t%2);”轻松实现。

  进入数码管驱动程序后首先调用子函数js(),计算当前的led_str[0]和led_str[1]。接下来将两个数码管全部熄灭以防止余晖的出现。最后点亮需要点亮的数码管并送出字型码。驱动程序代码如下:

  void chushi(char i)

  {

  js(); //计算显示变量

  duan=0xff; //去余晖

  wei1=i; wei2=!i; //确定片选

  duan=zixing[led_str[i]]; //送字型码

  }

  2、按键驱动程序

  按键驱动程序分为按键识别和按键功能执行两部分。按键功能执行可在按键按下时或按键抬起后执行,文中将其设计在按键抬起后执行。

  (1)定义按键I/O地址

  根据实际电路,三个按键(启动键、复位键、暂停/启动键)分别接在P3口的P3.2,P3.3和P3.4三个引脚上。为了取键值方便还将P3口定义为“iokey”,程序中可作定义如下:

  #define iokey P3

  sbit key1=P3^2;

  sbit key2=P3^3;

  sbit key3=P3^4;

  (2)按键驱动流程

  按键识别的通用流程为:I/O口写“1”→判断有无键按下→延时去抖→确定键值→等待按键抬起→执行按键功能。按键驱动程序中定义了两个静态变量“ts” 和“kv”,分别用来延时去抖和存放键值。

  (3)延时去抖

  静态变量“ts”用来延时去抖。按键驱动程序在定时中断服务程序中每1ms被执行一遍,每检测到有键按下“ts”加1,检测到无键按下“ts”清0。按键连续按下20ms,则连续20次执行按键驱动程序时都检测到有键按下,此时静态变量“ts”累加到20,可确认按键按下有效。

  为防止按键一直按着不放而使“ts”累加到溢出,确认有键按下后可使“ts”的值保持为20,或大于20的某一个值如21。

  (4)取键值

  确认有键按下后即可通过读取按键的I/O口状态来得到键值。为读取P3.2、P3.3和P3.4引脚状态,屏蔽P3口其他引脚的影响,可将读取后的数值按位或上11100011B(0xE3)再送给静态变量“kv”。

  静态变量“kv”存放按键的键值,无键按下或按键抬起后kv的值为0。按下启动键key1时kv=11111011B(0xFB),按下复位键key2时kv=11110111B(0xF7),按下暂停/启动键key3时kv=11101111B(0xEF)。

  (5)执行按键功能

  按键抬起后第一次执行按键驱动程序时,静态变量“kv”任保持着按键按下时最后得到的键值,以该键值作为参数调用按键执行程序“actkey(kv);”即可执行按键功能。调用后kv值立刻清0,确保按一次键执行一次按键功能。驱动程序代码如下:

  void key()

  {

  static unsigned char kv=0;

  static unsigned char ts=0;

  key1=1;key2=1;key3=1;

  if(!(key1&key2&key3))

  {

  ts++;

  if(ts>=20)ts=20; //有键按下

  if(ts==20)

  kv=iokey|0xe3; //取键值

  }

  else

  { //无键按下或按键已抬起

  actkey(kv);

  ts=0;

  kv=0;

  }

  }

  函数actkey(kv)用来根据键值“kv”执行相应操作。当“kv”等于0xFB时代表启动键key1按下,函数actkey(kv)将全局变量act赋值为“1”。当“kv”等于0xF7时代表复位键key2按下,函数actkey(kv)将全局变量“time”复位为“30”。当“kv”等于0xEF时代表暂停/启动键按下,函数actkey(kv)将全局变量act取反。每按一个按钮都有将全局变量“t”清0的操作,目的是每当复位、或启动计时时,进入定时中断的次数都从0开始计算,否则会出现第1秒计时不准确的现象。程序代码如下:

  void actkey(unsigned char k)

  {

  switch(k)

  {

  case 0xfb:act=1;t=0;break;

  case 0xf7:time=30;t=0; break;

  case 0xef:act=~act;t=0; break;

  }

  }

  四、结束语

  本文在编程过程中以面向对象的编程思路封装了两个LED数码管和三个独立按键。当其驱动程序在定时中断服务程序中被调用,编程者只要操作其接口:数组“led_str[2]”和函数“actkey(unsigned char k)”,无需直接对硬件进行编程即可改变功能,增强了软件的通用性和可移植性。


单片机原理及应用课程设计
单片机课程设计要以89C51的基本知识和方法为基础,通过系统扩展达到应用单片机解决不太复杂的实际问题的目的。1.倒计时器 由单片机接收小键盘阵列设定倒计时时间,倒计时范围最大为60分钟,由LED显示模块显示剩余时间,显示格式为 XX(分):XX(秒).X,精确到0.1s的整数倍。倒计时到,由蜂鸣器发出报警。

求助:课程设计制作秒表
1.秒表由5位七段LED显示器显示,其中一位显示“min”,四位显示“s”,其中显示分辩率为0.01 s,计时范围是0—9分59秒99毫秒;2.具有清零、启动计时、暂停计时及继续计时等控制功能;3.控制开关为两个:启动(继续)\/暂停记时开关和复位开关 三.总体方案及原理:电子秒表要求能够对时间进行精确记时...

两位数的数码管用于显示倒计时,怎么用PLC来实现,求具体解决方案_百度...
课程设计是交通灯的设计,要求显示倒计时,同过三菱PLC实现,两位数的数码管显示,需要怎样连接到PLC中,需要接什么元件或电源之类的东西,... 课程设计是交通灯的设计,要求显示倒计时,同过三菱PLC实现,两位数的数码管显示,需要怎样连接到PLC中,需要接什么元件或电源之类的东西, 展开  我来答 1个回答 #热议# 大...

小学数学教学设计
谈话:新年的钟声将敲响,让我们一起来倒计时。(课件出示钟面,伴随着“滴答”声,让学生共同进行倒计时) 谈话:刚才,我们进行倒计时,像这样计量很短的时间,我们常用比分更小的单位——秒。今天,我们就共同来认识这个新朋友。(板书课题) (二)探究新知 1.认识时间单位“秒” (1)师:你知道怎样计量用“秒”做单位的...

怎样在wps ppt加入倒计时器
1、在计算机桌面的Wps演示图标上双击鼠标左键,将其打开运行。2、在打开的wps演示程序窗口,打开“视图”菜单选项卡,并点击“幻灯片母版”选项。3、点击“幻灯片母版”选项后,这个时候PPT的样式将更换为母版样式。4、接着,打开“插入”菜单选项卡,并点击“Flash”选项命令。5、点击“Flash”选项命令...

数电篮球30秒倒计时器课程设计
长春工业大学课程设计(说明书)篮球竞赛30秒计时器设计设计项目:班级\/学号:学生姓名:指导教师:设计日期:一论证...21.1设计原理1.2设计方案1.3各分电路功能分析1.3.1计数器电路1.3.2脉冲发生电路1.3.3译码显示电路1.3.4控制电路1.4仿真原理图二课程设计总结...三参考文献...附录电子技术课...

求助!数字电路课程设计——倒计时器
介绍了RTX51嵌入式实时操作系统在交通信号自适应倒计时器设计中的应用情况,基于RTX51的系统软件设计方法,并给出了在实际中运行已通过的部分源程序代码和硬件电路原理图。传统的微控制嵌入式应用大都采用结构化编程思想,对于单任务控制能很好地达到编程简单、思路清晰、开发周期短的要求,但面对任务较多、控制...

30秒倒计时器课程设计
倒计时器初始状态显示“30”,当裁判员按下计时键,30秒倒计时开始,当计时器时间减到0时,计时器发出声光报警,提示裁判计时时间已到。 一、电路设计 30秒倒计时器的电路主要由电源电路、单片机最小系统、按键输入、显示驱动电路、报警电路组成,30秒倒计时器控制电路如图1所示。 图1 30秒倒计时器电路原理图 1、...

ppt怎样插入倒计时
ppt插入倒计时的具体步骤如下:我们需要准备的材料分别是:电脑、PPT幻灯片。1、首先我们打开需要编辑的PPT幻灯片,点击选择文件中的“选项”。2、然后我们在弹出来的窗口中点击打开信任中心的“信任中心设置”。3、然后我们在弹出来的窗口中点击选择“启用所有宏”。4、然后我们在弹出来的窗口中点击插入...

找份定时器课程设计
1.数字定时器总体方框图 2.单元电路设计 (1)秒脉冲产生电路 用NE555集成电路,调节几个相关电阻容量使其在脉冲输出端的输出为1HZ即可,震荡频率的计算公式为 (2)定时电路及数码管显示电路 要想实现倒计时定时必须使用减法计数器。我们在这个课程设计中采用的是74LS192集成电路。74LS192是双时钟方式...

朝阳市13079121049: 利用单片机设计一个30秒计时器程序 -
励傅脑得: P1 段码 P2 位选 p2.0(个位) p2.1(十位) P3.0 按键 启动 0时表示按下 P3.1 按键 停止 P3.2 按键 重置 12M 晶振 FLAG EQU 30H ; =0 停止 =1开始 =2重置 TIME EQU 31H ; 每过一秒 置1 ,通过主程序对其清0 计时 CON EQU 32H ; 记录当前...

朝阳市13079121049: 高分求篮球计时器设计 -
励傅脑得: MAX PLUS II 主要是提供你的一些器件提取 你只要自己找到连接的电路图就能用了 MAX PLUS II的基础操作还是很简单的 在篮球比赛中,规定了球员的持球时间不能超过30秒,否则就犯规了.本课程设计的“篮球竞赛30秒计时器”,可用于篮...

朝阳市13079121049: 数字电路课程设计求题目 -
励傅脑得: 技术要求: 1 要求电路能够检测纯净水的温度T 2 要求电路能够通过两跟电阻丝实现对加热的控制,具体情况如下: * T* 50度<T<100度 只有一跟电阻丝工作,电路处在保温状态; * T>100度 两跟电阻丝都不工作,电路完成加热 3 要求电路设置...

朝阳市13079121049: 设计篮球竞赛30秒计时器 -
励傅脑得: 三、单元译码显示电路——可以用74LS48和共阴极七段LED显示器组成.四、控制电路——完成计数器的直接清零、启动计数、暂停/继续计数、译码显示电路的显示与灭灯、定时时间到报警等功能.五、电路报警电路——可以用发光二极管组...

朝阳市13079121049: EDA课程设计篮球30秒可控计时器设计,就剩这么点了.. -
励傅脑得: 你好!可控计时器设计,可正计时,也可倒仅代表个人观点,不喜勿喷,谢谢.

朝阳市13079121049: 篮球30s计时器课程怎么仿真 -
励傅脑得: 单片机?做一个30S倒计时报警装置;同时具备重置功能就够了

朝阳市13079121049: 微机原理与接口技术课程设计之数字显示倒计时器 -
励傅脑得: DATAS SEGMENT sec db 24 ;倒数的秒数,可以随意更改 osec db 0 startmsg db "Counting down .... press [p] to puase, [c] to continue, [s] to stop",13,10,"$" timesup db 13,10,"Times up!" endmsg db 13,10,"Thanks for using, bye~$" ...

朝阳市13079121049: 求助:课程设计制作秒表 -
励傅脑得: 数字电子技术基础课程设计(一)——电子钟 数字电子技术基础 课程设计 电子秒表 一.设计目的: 1、了解计时器主体电路的组成及工作原理; 2、熟悉集成电路及有关电子元器件的使用; 3、学习数字电路中基本RS触发器、时钟发生器及计数...

朝阳市13079121049: 多功能计时器的论文 -
励傅脑得: [资料介绍] 根据实验要求,该多功能数字计时器整个系统由五部分功能电路组成,为:脉冲发生电路,计时电路,校分电路,清零电路和报时电路.本设计报告对每部分电路的原理图,功能描述,工作原理及所用的器件都作了详细叙述.该系统...

朝阳市13079121049: 数字电路设计 - --30秒倒计时器 -
励傅脑得: 题目中没有信号源,用555可以产生矩形脉冲!这部分我会,希望高手指点下,怎样设计暂停和停止的开关,怎样接,接在芯片的什么广角上!还有就是那个发光二极管应该接在哪里啊,,我是没有一点思路啊!!!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网