1. 单片机电子钟原理图,帮我大概解释一下这个图的工作原理就可以了,谢谢。带图!5分
本电子钟采用PIC16C55单片机控制,适于温室的定时恒温或自来水的定时定压控制等。PIC16C55单片机工作电压为2.5~6.25V,功耗低、驱动能力强。本电子钟可以控制一路负载在24小时内的3次开/关;一个双限触发的定时输出口,既可接传统的功率保持型继电器,也可接脉冲继电器。本机用四位LED数码管扫描式显示,还有消隐(省电)工作方式,使用起来非常灵活、方便。
一、 电子钟工作原理
电子钟电路见图1。RB7口是定时指示端,在定时开期间输出高电平,驱动V1发光,该口也可经缓冲作定时输出口;RB6是双限触发控制的定时输出口,其工作方式是:在RB7高电平期间,若RB1为高电平,则RB6输出高电平;若RB0为高电平,RB6输出低电平;若RB1、RB0同为低电平,RB6保持原态; 同为高电平时,RB6输出低电平。RB5、RB4用于驱动脉冲继电器,RB6上升沿触发RB5输出高电平开脉冲;在RB6下降沿触发RB4时,RB4端输出高电平关脉冲,开/关脉冲的持续时间均为125ms。
图 1
RB3是消隐控制器,接高电平(即SK1闭合)时,显示屏及秒闪正常;否则,显示消隐。显示消隐时,时钟及各控制逻辑都正常运行,如忽略RB4至RB7各口的驱动电流,则在3V供电时,整机电流不足20μA,即两节5号电池可用数月!RB2选择数码管极性,RB2为低电平,使用共阴LED;RB2为高电平,则用共阳LED。数码管的极性是在上电初始化时,根据 RB2口状态确定的,工作过程中改变RB2的电平则不起作用。
本机设S1~S4四个按键,S1是功能选择键,S2是小时增量调整,S3是分钟增量,S4用于分钟减量调节,其使用方法为:
上电时,RB5至RB7均为低电平,RB4端送出一个关脉冲,使SK1闭合,整机正常显示、工作,RC7口送出秒闪脉冲,RC6~RC0送字段码。RA3~RA0分别为10时、时、10分、分位的位码输出。这时,按一下S2或S3(时增量/ 分增量键),可使RB7端置位或复位。
在正常走时期间,秒闪正常;在校对或设置定时时,秒停闪。例如:在正常走时期间,按一下S1键,秒闪停止,屏幕显示J-,表示可以校对时间。这时再按S2~S4中任一键,屏幕显示现在时间,但秒不闪,此刻可按S2~S4校对时钟。再次按S1,屏幕显示 1∪,表示可以设定第一次开时间,此时按S2~S4对时间进行查看及设置。继续按S1,系统显示1∩,表示可设置第一次关时间……依次进行。设置好系统及 3次开关时间后,整机回到正常显示状态,秒闪恢复。
如欲取消某次开/关定时,只需把该次的开与关时间设置成相同值即可。
笔者曾把该时钟用于定时定压供水控制系统,RB6端用于驱动继电器(也可用RB5与RB4两端驱动脉冲继电器),RB1端接水压(水位)的低限输入,RB0 端接高限输入,设置好定时,一个简易的定时定压自动供水系统即告完成。
二、 编程技巧
PIC16C55单片机程序存储器只有512字节,加上采用外接32768Hz晶体振荡方式,时钟速度较低,因此,统筹好系统的工作时序与人机界面之间的关系是软件设计成败的关键。本机编程采用如下方案:软件工作流程见附图2。
图 2
PIC16C55单片机的一个机器周期是4个时钟周期,不难算出,本系统中每秒有8192个机器周期。在编制软件时,先设定单片机内部定时计数器F1的计数方式为机器周期的64分频。这样,每当F1溢出时,系统递加2秒。平时,系统每128个机器周期内用RC口与RA口驱动扫描一次显示屏,可保证每秒内扫描64次显示屏,基本上无闪烁感。而 128个机器周期正是F1的第0位(为便于叙述以下简记为F1?0)每次下降沿的间隔时间,我们可以编一段程序,当F1?0的下降沿到来时,扫描一次显示屏,每当F1的低4位为全0时(125ms一次)使系统检测一次RB口与按键状态,并进行相关处理,部分相关程序如下:
WAIT BTFSC 1,0 ;等待F1?0的下降沿,编程时
GOTO WAIT ;要保证每次下降沿前到此
MOVFW 1
SKPNZ
GOTO CLOCK ;F1=0,满2秒,转时钟处理
ANDLW 0FH ;屏蔽F1高4位
SKPZ
GOTO DISPLAY;F1低4位不为0,转显示
MOVLW 0C0H ;满125mS,使RB口脉冲复位
ANDWF 6,1
MOVLW 0FH ;检测按键
TRIS 7
MOVFW 7
ANDLW 0FH ;保留按键数据
SKPZ
GOTO AN;有键值,转按键处理
DISPLAY …… ;显示扫描,定时管理RB口
CLOCK …… ;时钟,定时处理程序
AN …… ;按键管理程序
2. 51单片机做数字电子钟
这么复杂的东西给这么少分 晕死了 你也太小气了吧,分多的话还可能帮你动动脑
3. 用51单片机设计一个电子钟
巧了,国亲无聊做了一个玩玩,给你看看把,其实电子钟挺简单的,下面是程序:
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitch=P3^2;
sbitkey=P3^5;
sbitkey1=P3^4;
uchart0,numn,numy,numr,nums,numf,numm,sw,w,q,b,s,g,sw1,w1,q1,b1,s1,g1,rq,temp,x;
uintu;
voidinit();
voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=70;y>0;y--);
}
voidmain()
{
init();
while(1)
{
if(rq==1)
{
if(rq==1)
display(sw,w,q,b,s,g);
}
elseif(rq==2)
{
if(rq==2)
display(sw1,w1,q1,b1,s1,g1);
}
elseif(rq==3)
{
if(rq==3)
display(w,w,w,w,w,w);
}
elseif(rq==4)
{
uchari;
temp=0x01;
for(i=0;i<8;i++)
{
P1=~temp;
delay(100);
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++)
{
P1=~temp;
delay(100);
temp>>=1;
}
temp=0x01;
for(i=0;i<8;i++)
{
P1=temp;
delay(100);
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++)
{
P1=temp;
delay(100);
temp>>=1;
}
}
else
rq=1;
}
}
voidinit()
{
rq=1;
x=1;
nums=22;
numf=0;
numm=0;
numn=9;
numy=10;
numr=15;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IT0=1;
IT0=2;
EA=1;
EX0=1;
EX1=1;
ET0=1;
TR0=1;
ET1=1;//IE=0x82//CPU开中断,CT0开中断
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(key==0)
{
delay(50);
if(key==0)
{
x++;
while(key==0);
}
}
if(x==2&rq==1)
{
//P0=0xf3;
if(key1==0)
{
numf++;
while(key1==0);
}
}
elseif(x==3&rq==1)
{
//P0=0xfc;
if(key1==0)
{
nums++;
while(key1==0);
}
}
elseif(x==2&rq==2)
{
//P0=0xcf;
if(key1==0)
{
numr++;
while(key1==0);
}
}
elseif(x==3&rq==2)
{
//P0=0xf3;
if(key1==0)
{
numy++;
while(key1==0);
}
}
elseif(x==4&rq==2)
{
//P0=0xfc;
if(key1==0)
{
numn++;
while(key1==0);
}
}
else
{
x=1;
}
if(t0==20)
{
t0=0;
numm++;
}
if(numm==60)
{
numm=0;
numf++;
}
if(numf==60)
{
for(u=500;u>0;u--)
{
bell=0;
delay(1);
bell=1;
delay(1);
}
numf=0;
nums++;
}
if(nums==24)
{
nums=0;
numr++;
}
if(numr==30)
{
numr=0;
numy++;
}
if(numy==12)
{
numy=0;
numn++;
}
if(numn==100)
{
numn=0;
}
g=numm%10;
s=numm/10;
b=numf%10;
q=numf/10;
w=nums%10;
sw=nums/10;
g1=numr%10;
s1=numr/10;
b1=numy%10;
q1=numy/10;
w1=numn%10;
sw1=numn/10;
}
voidexert0()interrupt0
{
delay(50);
rq++;
while(ch==0);
}
voidt0int()interrupt3
{
TR1=0;
bell=!bell;
TH1=timer0h;
TL1=timer0l;
TR1=1;
}
voidexert1()interrupt2
{
rq=100;
}
voiddisplay(ucharsw,ucharw,ucharq,ucharb,uchars,ucharg)
{
P2=tab[sw];
P0=tabwe[0];
delay(5);
P0=0xff;
P2=tab[w];
P0=tabwe[1];
delay(5);
P0=0xff;
P2=tab[q];
P0=tabwe[2];
delay(5);
P0=0xff;
P2=tab[b];
P0=tabwe[3];
delay(5);
P0=0xff;
P2=tab[s];
P0=tabwe[4];
delay(5);
P0=0xff;
P2=tab[g];
P0=tabwe[5];
delay(5);
P0=0xff;
}
下面这个是电路图,图我没有画啊,不过我用仿真去做,应该跟电路图差不多了,你可以参考下,可以实现流水灯,闹铃,日期,时间,等功能,上面给你的是按照你的要求,另外我懒得改了所以多了个功能就是可以看日期,你看上面的程序,第一个按钮ch,按一下查看日期,再按一下查看温度(被删了,随机现在是随机显示一个数字),再按一下是流水灯,再按一下又回到时间,另外两个键key/key1;按key是选择锁定分还是时,如果你当前显示的是日期的话就是顺序锁定日,月,年,按key1调整,图上显示的是22点00分09秒,就这样了
设计方案的话..........呵呵,AT89S52+6个数码管+11.0592晶振+2个30P电容+3个按钮+1个10UF电容如图连接,你自己去写方案把,分数给那么少,就只帮你那么多了