您的位置 首页 嵌入式

根据单片机AT89C2051的电子钟设计方案

电路见图1.一片20引脚的单片机AT89C2051为电子钟主体,其显示数据从P1口分时输出,P3.0~3.3则输出对应的位选通信号。由于LED数码管点亮时耗电较大,故使用了四只PNP型晶体管VT1~V

 电路见图1.

  一片20引脚的单片机AT89C2051为电子钟主体,其显现数据从P1口分时输出,P3.0~3.3则输出对应的位选通信号。因为LED数码管点亮时耗电较大,故使用了四只PNP型晶体管VT1~VT4进行扩大。原本笔者还有一种更简的规划方案(见图2),可省去VT1~VT4及R1~R4八个元件,但这种规划因为单片机输出口的灌入电流有限(约20mA),数码管亮度较暗而不向读者介绍,除非你选用了高亮度的发光数码管。

  P3.4、P3.5、3.7外接了三个轻触式按键,这儿咱们别离命名为:形式设定键set(P3.4)、时调整键hour(P3.5)、分调整键min(P3.7)。C1、R13组成上电复位电路。VT5及蜂鸣器Bz为闹时讯响电路。三端稳压器7805输出的5V电压供整个体系作业。此电子钟可与任何9~20V/100mA的交直流电源适配器合作作业,习惯性强。

  电子钟功用

  1.走时:经过形式设定键set挑选为走时,U1、U2显现小时,U3、U4显现分。U2的小数点为秒点,每秒闪耀一次。

  2.走时调整:经过形式设定键set挑选为走时调整,按下hour键对U1、U2的走时“时”显现进行调整(每0.2秒递加1)。按下min键对U3、U4的走时“分”显现进行调整(每0.2秒递加1)。

  3.闹时调整:经过形式设定键set挑选为闹时调整,按下hour键对U1、U2的闹时“时”显现进行调整(每0.2秒递加1)。按下min键对U3、U4的闹时“分”显现进行调整(每0.2秒递加1)。

  4.闹时启/停设定:经过形式设定键set挑选为闹时启/停设定,按下min键U3的小数点点亮,闹时功用发动;按下hour键U3的小数点平息,闹时功用关停。

  因为电路规划得极端简略,因而丰厚的功用只能由软件完结,这儿软件规划成为了要害。下面介绍软件规划关键。

  图3为主程序状况流程。

  运转时树立的首要状况标志如下:

  flag-掉电标志。掉电后,flag内为一随机数;从头设守时刻后flag内写入标志数55H.

  set-作业形式设定标志。

  hour-走时“时”单元。

  min-走时“分”单元。

  sec-走时“秒”单元。

  dEDA-走时5mS计数单元

  t_hour-闹时“时”单元。

  t_min-闹时“分”单元。

  d_05s-0.5秒位标志。每秒钟的前0.5秒置1,后0.5秒置0,以使秒点闪耀。

  o_f-闹时启/停位标志。闹时发动置1,闹时关停置0.

  别的将守时器T0设定为5mS的守时中止。这儿晶振频率为12MHz,因而5mS的初值为-5000,但实际上程序还要作其它运算,使得时刻偏长,经调整为-4800后试验刚好。计时单元deda每次中止均加1.走时函数判别deda>=200时即令秒单元sec加1.同理秒单元sec满60后令分单元min加1.分单元min满60后令时单元hour加1.时单元hour满24后清0.

  上电后,首要进行初始化,对各状况标志、输入输出口及守时器T0进行初始化作业,以习惯后边程序的要求。

  随后程序判别有无set键按下,如按下,则set键值从0起加1.set键值只能从0加到3,然后又回到0.

  接下来,依据键值进行散转。若set=0,运转走时程序;若set=1,进入调整闹不时刻程序;若set=2,进入调整走不时刻程序;若set=3,显现已调好的闹不时刻,一起进入启/停闹时程序。

  散转完后,进行判别掉电标志flag是否等于55H.若不等,阐明刚开机上电或运转过程中掉过电,这时四个数码管以1Hz的频率闪耀四个8字,提示时刻禁绝;若持平,阐明未掉电,RAM区内容未改变,时刻精确。

  再下来程序又转回到初始化之后进行循环运转。

  因为使用了四只数码管密布摆放,因而只能选用双面印刷板规划,图4、5别离为正面(元件面)、不和的印板图。尺度3000milx4000mil(7.62cmx10.16cm)。图6为计算机输出的三维仿真印制板。

  元件选用

  为了走时精确,晶振X最好选用温漂小的。四个数码管U1~U4可选用发绿光的,这样光泽较柔软。蜂鸣器Bz要购买绕线型的电动式蜂鸣器(商场上有一种加电压即作业的蜂鸣器这儿不适用),因驱动信号为脉冲信号。其它元件一般无特殊要求。

  使用方法

  上电后,四个LED数码管闪耀四个8字。

  按一下set键,闪耀现象消失(此时set=1),U1的小数点亮,阐明此时能够调整闹不时刻。按下hour键,U1、U2作加法;按下min键,U3、U4作加法。这些调整好的数据被一起送入RAM区的闹时回忆“时”单元t_hour和闹时回忆“分”单元t_min.

  再按一下set键,set=2,U2的小数点亮,此时能够调整走不时刻。按下hour键,U1、U2作加法;按下min键,U3、U4作加法。这些调整好的数据也被同步送入RAM区的“时”回忆单元hour和“分”回忆单元min.

  再按一下set键,set=3,显现方才调整的闹不时刻,此时能够挑选发动/关停闹时。按下min键,o_f位标志置1,U3的小数点亮,闹时发动;按下hour键,o_f位标志置0,U3的小数点灭,闹时封闭。

  若再按一下set键,set=0,电路进入走时状况,U1、U2显现小时,U3、U4显现分。U2的小数点作秒点闪耀。

  在闹时发动的情况下,走时抵达设定闹时,则蜂鸣器Bz鸣响一分钟进行提示。

  附:用C51编写的源程序清单(已由试验板运转经过)

  #include /*包括器材配置文件*/

  #define uchar unsigned char

  #define uint unsigned int

  char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

  0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/

  uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/

  uchar deda=0; /*5mS计数单元清零*/

  uchar t_hour=0,t_min=0; /*闹不时、分单元清零*/

  bit d_05s=0; /*0.5秒标志*/

  bit o_f=0; /*闹时启/停标志*/

  uchar set=0; /*形式设定标志*/

  uchar m=0;

  uchar flag=0; /*RAM掉电标志*/

  void delay(uint k); /*延时子函数*/

  void conv(); /*走时单元转化*/

  void p_out(); /*判别闹时到否子函数*/

  void dirve(); /*走不时刻输出驱动子函数*/

  void t_dirve(); /*闹不时刻输出驱动子函数*/

  /*闹时启/停子函数*/

  void time1_of()

  {uchar m;

  if(P3_7==0)delay(1);

  if(P3_7==0)o_f=1;

  for(m=0;m<30;m++)<>

  {

  t_dirve();

  P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1);

  if(P3_1==0){if(o_f==1)P1_7=0;}else P1_7=1;

  delay(1);

  }

  if(P3_5==0)delay(1);

  if(P3_5==0) o_f=0;

  for(m=0;m<30;m++)<>

  {

  t_dirve();

  P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1);

  if(P3_1==0){if(o_f==1)P1_7=0;else P1_7=1;}

  delay(1);

  }

  }

  /*走时函数*/

  void time()

  {

  conv(); /*走时单元转化*/

  dirve(); /*走不时刻输出驱动子函数*/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/239312.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部