手工焊接实物图
4.操作说明
如上图实物图所示,按下
电源开关后,电源指示灯亮,数码管从
00.00.00开始走秒显示;按下单片机右边的上方自锁开关,时钟进入时间校准状态,通过第一个按钮开关切换秒、分、时部分的设置,中间按钮开关对相应部分进行加1调整,右边按钮开关对相应部分进行减1调整,设置完后将自锁式开关按起,回到正常的工作状态;同理,按下下方的自锁式开关,时钟进入时间校准状态。5.基本原理
本次
电子时钟项目设计对单片机定时器
0装初值,使其初值对应50ms,定时器0的中断次数达到20次酒钢好为1s,当秒部分计数到60时置零,并向分部分进一;当分部分计数到60时置零,并向时部分进一,当时部分计数到24时置零,从而满足时钟的正常工作。 本次设计设置
5个键依次对其进行时间校准设置、定时设置、秒分时切换、加1调整、减1调整。当时间校准设置键被按下,关闭T0定时器,时钟停止工作,此时数码管显示的即为当前时间校准设置的界面,设置好后,打开T0定时器,时钟在设置好的时刻上继续走秒工作;当定时设置键被按下,将当前的时刻赋给定时前的时分秒时刻变量,并将数码管显示切换到定时设置界面进行设置(此时的时钟仍在继续正常工作,只是在定时设置时没病显示出来罢了),当设置好后,记下要定时的时刻,数码管显示又还原到时钟正常工作的界面;当正常工作的时钟时刻到达了预置的定时时刻,蜂鸣器发声警报。6.元器件介绍
相信你们对这上面的元器件都了解,我就不再赘述,主要讲一下就是74HC245芯片,
总线收发器(
bus transceiver),典型的CMOS型三态缓冲门电路。 由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。另外,也可以使用74HC244等其他电路,
74HC244比74HC245多了锁存器。
74HC245实物图:
[url=http://baike.baidu.com/albums/2532160/2532160/0/0.html#0$29790130906035a0a9018edb]
引脚定义:
第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚“A”信号输入输出端,A0=B0、、、、、、A7=B7,A0与B0是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。
第11~18脚“B”信号输入输出端,功能与“A”端一样,不再描述。 第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
第10脚GND,电源地。
第20脚VCC,电源正极。
TRUTH TABLE真值表
H=高电平 L=低电平 ×=不定
Absolute Maximum Ra
tings
绝对最大额定值 Supply Voltage电源电压(VCC)
-0.5 to -7.0V
DC Input Voltage DIR and G pins (VIN) 直流输入电压方向和G引脚(输入电压)
-1.5 to VCC -1.5V
DC Input/Output Voltage (VIN, VOUT)直流输入/输出电压
-0.5 to VCC -0.5V
Clamp Diode Current 钳位二极管电流(ICD)
±20 mA
DC Output Current直流输出电流,每个引脚(输出)
±35 mA
DC VCC or GND Current, per pin (ICC)
±70 mA
Storage Temperature Range 储存温度范围(TSTG)
-65℃ to -150℃
Power Dissipation (PD)功耗
(Note 3)
600 mW
S.O. Package only
500 mW
Lead Temperature (TL) (Soldering 10 seconds)
260℃
74HC245的作用:信号功率放大。
第1脚DIR,为输入输出端口转换用, DIR=“1”高电平时信号由“A”端输入“B”端输出, DIR=“0”低电平时信号由“B”端输入“A”端输出。第2~9脚“A”信号输入输出端,A1=B1﹑﹑﹑﹑﹑﹑A8=B8,A1与B1是一组,如果 DIR=“1”G=“0”则A1输入B1输出,其它类同。如果DIR=“0”G=“0”则B1输入A1输出,其它类同。 第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。第19脚G,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B 端才被启用,该脚也就是起到开关的作用 第10脚GND,电源地。第20脚VCC,电源正极。
7.程序代码
/***************************************************
具有闹钟功能的电子时钟程序设计,晶振为11.0592M
***************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
***it s1=P2^0; //数码管位选控制端
***it s2=P2^1;
***it s3=P2^2;
***it s4=P2^3;
***it s5=P2^4;
***it s6=P2^5;
***it s7=P2^6;
/*k1设置时间,k2定时。k1,k2使用不自动弹起按键。
k3时分秒选择,k4加数字,k5减数字。*/
***it k1=P1^0;
***it k2=P1^1;
***it k3=P1^2;
***it k4=P1^3;
***it k5=P1^4;
uchar count=0,sec,min,hour,ss=0;s=60,m=60,h=24;
uchar code mum[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0-9编码
void delayms(uint k) //延时函数
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
/*通过count获得hour,min,sec变量值 */
void timecontrol()
{
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
hour=0;
}
}
}
void display(uchar zs,uchar zm, uchar zh) //数码管显示函数
{
s1=1;
P0=mum[zh/10];
delayms(5);
s1=0;
s2=1;
P0=mum[zh%10]&0x7f; // 时的个位加上小数点
delayms(5);
s2=0;
s3=1;
P0=mum[zm/10];
delayms(5);
s3=0;
s4=1;
P0=mum[zm%10]&0x7f; //分的个位加上小数点
delayms(5);
s4=0;
s5=1;
P0=mum[zs/10];
delayms(5);
s5=0;
s6=1;
P0=mum[zs%10];
delayms(5);
s6=0;
}
void keyscan_settime() //时间设置模块
{
uchar st,mt,ht;
if(k1==0)
{
delayms(10);
if(k1==0)
{
st=sec,mt=min,ht=hour;
TR0=0; //关闭定时器
while(k1==0) //等待用户按键
{
display(st,mt,ht);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通过ss选择时分秒设置*/
if(k4==0) //加数
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:st++;if(st==60)st=0;break;
case 1:mt++;if(mt==60)mt=0;break;
case 2:ht++;if(ht==24)ht=0;break;
default :;
}
}
}
if(k5==0) //减数
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(st>0)st--;
else st=0;break;
case 1:if(mt>0)mt--;
else mt=0;break;
case 2:if(ht>0)ht--;
else ht=0;break;
default : ;
}
}
}
}
TR0=1;
sec=st,min=mt,hour=ht;
}
}
display(sec,min,hour);
}
void keyscan_time() //用户定时模块
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
s=sec;m=min;h=hour;
while(k2==0) //开始定时设置
{
display(s,m,h);
if(k3==0)
{
delayms(10);
if(k3==0)
{
while(!k3);
ss++;
if(ss==3) ss=0;
}
}
/*通过ss选择时分秒设置*/
if(k4==0) //加数
{
delayms(10);
if(k4==0)
{
while(!k4);
switch(ss)
{
case 0:s++;if(s==60)s=0;break;
case 1:m++;if(m==60)m=0;break;
case 2:h++;if(h==24)h=0;break;
default :;
}
}
}
if(k5==0) //减数
{
delayms(10);
if(k5==0)
{
while(!k5);
switch(ss)
{
case 0:if(s>0)s--;
else s=0;break;
case 1:if(m>0)m--;
else m=0;break;
case 2:if(h>0)h--;
else h=0;break;
default : ;
} }
}
}
}
}
}
void buz()
{
if((hour==h)&&(min==m)&&(sec==s))
{
s7=0;
delayms(20);
s7=1;
}
}
void main()
{
TMOD=0x01; //定时器0工作在方式1
TH0=(65536-45872)/256; //装初值,50ms
TL0=(65536-45872)%256;
EA=1; //总中断允许
ET0=1; //T0中断允许
TR0=1; //开定时器0
while(1)
{
keyscan_settime();
keyscan_time();
buz();
}
}
void T0_ms() interrupt 1 //中断入口程序
{
TH0=(65536-45872)/256; //重新装初值
TL0=(65536-45872)%256;
count++;
if(count==20) //判定1s时间是否已到
{
count=0;
timecontrol();
}
}