51单片机可调时钟

    xiaoxiao2021-03-25  103

    1.元件清单 1.STC89C52单片机一块、直插DIP-40插座 2.三位七段共阳数码管LG3631BH型号两块 3.12M晶振一枚 4.蜂鸣器一只 5.S85501PNP三极管一个 6.9脚排阻10K一个 7.1k电阻两个 8.6脚自锁式开关3个、4脚按钮开关3个 9.2个3V纽扣电池及其电池座两个 10.发光二极管1支 11.瓷片电容30pf两片 12.芯片74HC245两片 2.电路图 file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-3244.png Proteus仿真图 3.实物图 file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-29706.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-32753.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-5034.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-31203.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-19450.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-19622.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-5693.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-1365.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-2150.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-12882.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-28323.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-20768.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-21068.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-18446.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-24933.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-12860.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-783.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-14528.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-2202.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-18933.png file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-10267.pngfile:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-18488.png file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-5291.png 手工焊接实物图 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多了锁存器。 file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-21407.png    74HC245实物图: file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-27079.png 引脚定义: 第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真值表 file:///C:\Users\TSUI\AppData\Local\Temp\ksohtml\wps_clip_image-11896.png H=高电平 L=低电平 ×=不定 Absolute Maximum Ratings绝对最大额定值 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.程序代码 /***************************************** 东方智达科技www.east027.com 淘宝店铺:http://east027.taobao.com 具有闹钟功能的电子时钟程序设计,晶振为11.0592M *****************************************/

    include

    define uchar unsigned char

    define uint unsigned int

    sbit s1=P2^0; //数码管位选控制端 sbit s2=P2^1; sbit s3=P2^2; sbit s4=P2^3; sbit s5=P2^4; sbit s6=P2^5; sbit s7=P2^6; /*k1设置时间,k2定时。k1,k2使用不自动弹起按键。 k3时分秒选择,k4加数字,k5减数字。*/ sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; sbit 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]&0x7f; // 时的个位加上小数点 delayms(5); s2=0;

    s3=1; P0=mum[zm/10]; delayms(5); s3=0;

    s4=1; P0=mum[zm]&0x7f; //分的个位加上小数点 delayms(5); s4=0;

    s5=1; P0=mum[zs/10]; delayms(5); s5=0;

    s6=1; P0=mum[zs]; 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)%6; 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)%6; count++; if(count==20) //判定1s时间是否已到 { count=0; timecontrol(); } }

    转载请注明原文地址: https://ju.6miu.com/read-35657.html

    最新回复(0)