《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

小小电子闹钟(图+程序)
程序匠人 发表于 2006-4-19 20:30:00  阅读全文 | 回复(4) | 引用通告 | 编辑

 

 

牙齿健康伴侣 发表于 2006-3-24 10:12:29

这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片IC实现。

电路见图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为主程序状态流程。


 

图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为计算机输出的三维仿真印制板。


图4

 


图5

 


图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编写的源程序清单(已由实验板运行通过)

#i nclude <reg51.h>                        /*°üº¬Æ÷¼þÅäÖÃÎļþ*/
#i nclude <stdio.h>
#i nclude <stdlib.h>
sbit  P1_0=P1^0; 
sbit  P1_1=P1^1; 
sbit  P1_2=P1^2; 
sbit  P1_3=P1^3; 
sbit  P1_4=P1^5; 
sbit  P1_5=P1^5; 
sbit  P1_6=P1^6; 
sbit  P1_7=P1^7; 
sbit  P2_0=P1^0; 
sbit  P2_1=P1^1; 
sbit  P2_2=P1^2; 
sbit  P2_3=P1^3; 
sbit  P2_4=P1^5; 
sbit  P2_5=P1^5; 
sbit  P2_6=P1^6; 
sbit  P2_7=P1^7; 
sbit  P3_0=P1^0; 
sbit  P3_1=P1^1; 
sbit  P3_2=P1^2; 
sbit  P3_3=P1^3; 
sbit  P3_4=P1^5; 
sbit  P3_5=P1^5; 
sbit  P3_6=P1^6; 
sbit  P3_7=P1^7;  
#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();                                              /*×ßʱʱ¼äÊä³öÇý¶¯×Óº¯Êý*/

p_out();                                             /*ÅбðÄÖʱµ½·ñ×Óº¯Êý*/

}

 

 

/*¶¨Ê±Æ÷T0  5mS³õʼ»¯*/

void init_timer()

{

TMOD=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TR0=1;

}

 

/*ɨÃè°´¼ü×Óº¯Êý*/

void scan_key()

{

delay(1);

if(P3_4==0)set++;

if(set>=4)set=0;

if(set==1)flag=0x55;

F0:if(P3_4==0)goto F0;                      /*°´¼üδÊÍ·Å£¬Ôڴ˵Ⱥò*/

}

 

 

/*ÑÓʱ×Óº¯Êý*/

void delay(uint k)

{

uint i,j;

for(i=0;i<k;i++)
 for(j=0;j<121;j++);
 
}

 

/*5mS¶¨Ê±ÖжϷþÎñ×Óº¯Êý*/

void zd(void) interrupt 1

{

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

}

 

/*µ÷Õû×ßʱʱ¼ä*/

void time_adj()

{uchar m;

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

       if(P3_5==0)hour++;

       if(hour==24)hour=0;

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

              {

              dirve();

              if(P3_2==0)P1_7=0;

              else P1_7=1;

              delay(1);

              }

             

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

       if(P3_7==0)min++;

       if(min==60)min=0;

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

              {

              dirve();

                     if(P3_2==0)P1_7=0;

              else P1_7=1;

              delay(1);

              }

}

 

 

/*µ÷ÕûÄÖʱʱ¼ä*/

void time1_adj()

{uchar m;

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

       if(P3_5==0)t_hour++;

       if(t_hour==24)t_hour=0;

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

              {

              t_dirve();

              }

      

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

       if(P3_7==0)t_min++;

       if(t_min==60)t_min=0;

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

              {

              t_dirve();

              }

}    

 

/*ʱ¡¢·Ö¡¢Ãëµ¥Ôª¼°×ßʱµ¥Ôª×ª»»*/

void conv()

{

if(deda<=100)d_05s=0;

       else d_05s=1;

if(deda>=200){sec++;deda=0;}

if(sec==60){min++;sec=0;}

if(min==60){hour++;min=0;}

if(hour==24){hour=0;}

}

 

/*×ßʱʱ¼äÊä³öÇý¶¯×Óº¯Êý*/

void dirve()

{

P1=DATA_7SEG[hour/10];P3=0xf7;delay(1);

P1=DATA_7SEG[hour%10];P3=0xfb;delay(1);

if(d_05s==1){if(P3_2==0)P1_7=0;else P1_7=1;}

delay(1);

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

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

P1=DATA_7SEG[min%10];P3=0xfe;delay(1);

}

 

/*ÄÖʱʱ¼äÊä³öÇý¶¯×Óº¯Êý*/

void t_dirve()

{

P1=DATA_7SEG[t_hour/10];P3=0xf7;delay(1);

if(P3_3==0)P1_7=0;else P1_7=1;

delay(1);

P1=DATA_7SEG[t_hour%10];P3=0xfb;delay(1);

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

P1=DATA_7SEG[t_min%10];P3=0xfe;delay(1);

}

 

 

/*ÅбðÄÖʱµ½·ñ×Óº¯Êý*/

void p_out()

{

if(o_f==1){

       if(t_hour==hour){if(t_min==min)

              if(P3_0==0){P1_7=0;delay(1);}

              else P1_7=1;

                                   }

              }

}

 

/*Ö÷º¯Êý*/

void main()

{

       init_timer();                       /*¶¨Ê±Æ÷T0³õʼ»¯*/

       while(1)                                     /*ÎÞÏÞÑ­»·*/

       {

       if(P3_4==0)scan_key();               /*Óа´¼ü£¬µ÷Óð´¼üɨÃè×Óº¯Êý*/

switch(set)                                        /*¸ù¾Ýset¼üֵɢת*/

{

case 0:time();break;                                   /*×ßʱʱ¼ä³ÌÐò*/

case 1:time1_adj();break;                     /*ÄÖʱʱ¼äµ÷Õû*/

case 2:time_adj();break;                      /*×ßʱʱ¼äµ÷Õû*/

case 3:time1_of();break;                      /*Æô/Í£ÄÖʱ*/

default:break;                                     /*ÆäËüÍ˳ö*/

}

       if(flag!=0x55)                             /*Åжϵôµç±êÖ¾*/

       {for(m=0;m<100;m++)               /*µãÁÁËĸö8×Ö400mS*/

              {

              P1=0x80;P3=0xf7;delay(1);

              P1=0x80;P3=0xfb;delay(1);

              P1=0x80;P3=0xfd;delay(1);

              P1=0x80;P3=0xfe;delay(1);

              }

             

              P1=0xff;P3=0xff;delay(400); /*ϨÃðËĸö8×Ö400mS*/

       }

       }

}

看《匠人手记》,与匠人同行!北航出版,正在热卖!

机芯
af88403(游客)发表评论于2007-2-28 13:14:00  个人主页 | 引用 | 返回 | 删除 | 回复

af88403(游客)你们可以生产出定时不少于3个时段的机芯吗,我的邮箱         af88403@163.com    谢谢请与我联系,我的电话013655606100      固定电话0551--5212285谢谢了

看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:小小电子闹钟(图+程序)
af88403发表评论于2007-2-28 13:07:00  个人主页 | 引用 | 返回 | 删除 | 回复

af88403你们可以生产出,可以定不少于3个时段的机心吗?

看《匠人手记》,与匠人同行!北航出版,正在热卖!

不懂请问
飞儿(游客)发表评论于2006-4-26 9:53:00  个人主页 | 引用 | 返回 | 删除 | 回复

飞儿(游客)这是否是一个基于I~2C总线方式控制的呢?若不是,应该怎样修改为基于~2C总线方式控制的呢?

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:小小电子闹钟(图+程序)
mon51(游客)发表评论于2006-4-22 22:01:00  个人主页 | 引用 | 返回 | 删除 | 回复

mon51(游客)可以到HttP://Mon51.nease.net 看看,更简单!

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!