1、当输入电压VcVR时,COP3输出为高电平,进入延时周期。当A端接“0”电平时,在Tx时间内任何V2的变化都被忽略,直至Tx时间结束,即所谓不可重复触发工作方式。当Tx时间结束时,Vo下跳回低电平,同时启动封锁时间定时器而进入封锁周期Ti。在Ti时间内,任何V2的变化都不能使Vo跳变为有效状态(高电平),可有效抑制负载切换过程中产生的各种干扰。时钟芯片DS12C887特点可作为IBMAT计算机的时钟和日历与MC146818B和DS1287的管脚兼容在没有外部电源的情况下可工作10年自带晶体振荡器及电池可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿用二进制码或BC
2、D码代表日历和闹钟信息有12和24小时两种制式,12小时制时有AM和PM提示可选用夏令时模式可以应用于MOTOROLA和INTEL两种总线数据/地址总线复用内建128字节RAM14字节时钟控制寄存器114字节通用RAM可编程方波输出总线兼容中断(/IRQ)三种可编程中断时间性中断可产生每秒一次直到每天一次中断周期性中断122ms到500ms时钟更新结束中断DS18B20温度传感器DS18B20的主要特征:全数字温度转换及输出。先进的单总线数据通信。最高12位分辨率,精度可达土0.5摄氏度。12位分辨率时的最大工作周期为750毫秒。可选择寄生工作方式。检测温度范围为55C+125C(67F+25
3、7F)内置EEPROM,限温报警功能。64位光刻ROM,内置产品序列号,方便多机挂接。多样封装形式,适应不同硬件系统。三、实现:(一)、硬件部分主体部分:(两条白线为跳线)LED:电流放大电路:PS:单片机IO口电流不够大,无法使灯泡足够亮。按键部分:(二)、软件部分#include#defineucharunsignedchar#defineuintunsignedintsbitds=P24;/温度传感器信号线sbitbeep=P23;/蜂鸣器sbitre=P22; /热释电sbitgm=P27;/光敏sbits0=P13;/智能sbits1=P30;/功能键sbits2=P31;/增加键s
4、bits3=P34;/减小键sbits4=P35;/闹钟查看键sbits5=P36;/调光sbits6=P32;/显示温度sbitrs=P10; /sbitlcden=P12; /液晶sbitwr=P11;sbitled1=P20;sbitled2=P21; /ledsbitled3=P25;sbitled4=P26;sbitrd=P37;sbitdscs=P17;sbitdsas=P16;sbitdsrw=P15; /时钟芯片sbitdsds=P14;sbitdsirq=P33;uinttemp;floatf_temp;uchars5num=0,s0num=0,s6num=0;ucharfl
5、ag1=0,flag_ri;/定义两个位变量ucharcount,s1num,flag=0,t0_num;/其它变量定义ucharmiao,shi,fen,year,month,day,week,amiao,afen,ashi;ucharcodetable=20-;/液晶固定显示内容ucharcodetable1=:ucharcodetable2=WELCOME!voidwrite_ds(uchar,uchar);/函数申明voidset_alarm(uchar,uchar,uchar);voidread_alarm();ucharread_ds(uchar);voidset_time();/
6、*/*led*/voidled(ucharx) switch(x) case0:led1=1;led2=0;led3=1;led4=0;break; case1: led1=0; break; case3:led3=0;led4=1; case2: led1=1;led2=1; case4: /*/voiddelay(uintz)/延时函数 uintx,y; for(x=z;x0;x-) for(y=110;yy-);voiddi()/蜂鸣器报警声音 beep=0; delay(100); beep=1;voidwrite_com(ucharcom)/写液晶命令函数 rs=0; lcden=0
7、; P0=com; delay(3); lcden=1; voidwrite_date(uchardate)/写液晶数据函数 rs=1; P0=date;voidinit()/初始化函数 uchari; EA=1;/打开总中断 EX0=1;/开外部中断1 IT0=1;/设置负跳变沿触发中断 EX1=1; IT1=1; flag1=0;/变量初始化 t0_num=0; s1num=0; week=1; rd=0;/*以下几行在首次设置DS12C887时使用,以后不必再写入 write_ds(0x0A,0x20);/打开振荡器 write_ds(0x0B,0x26);/设置24小时模式,数据二进制
8、格式 /开启闹铃中断 set_time();/设置上电默认时间 -*/ write_com(0x38);/1602液晶初始化 write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); for(i=0;i15;i+)/写入液晶固定部分显示 write_date(tablei); delay(1); write_com(0x80+0x40); for(i=0;16;i+) write_date(table1i);voidwrite_sfm(ucharadd,chardate)/1602液晶刷新时分秒函数4为时,7为分,1
9、0为秒 charshi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge);voidwrite_nyr(ucharadd,chardate)/1602液晶刷新年月日函数3为年,6为分,9为秒 write_com(0x80+add);voidwrite_week(charwe)/写液晶星期显示函数 write_com(0x80+12); switch(we) write_date(M);delay(5); write_date(ON break;TUEWD
10、H case5:FRI case6:SA case7:voidkeyscan() if(flag_ri=1) /这里用来取消闹钟报警,任一键取消报警 if(s1=0)|(s2=0)|(s3=0)|(s4=0) delay(5); if(s1=0)|(s2=0)|(s3=0)|(s4=0) while(!(s1&s2&s3&s4);di(); flag_ri=0;/清除报警标志 if(s1=0)/检测S1 delay(10); if(s1=0) s1num+;/记录按下次数 if(flag1=1) if(s1num=4) s1num=1; flag=1; while(!s1); switch(s
11、1num) /光标闪烁点定位 case1:write_com(0x80+0x40+10); write_com(0x0f); break; case2:write_com(0x80+0x40+7); case3:write_com(0x80+0x40+4); case4:write_com(0x80+12); case5:write_com(0x80+9); case6:write_com(0x80+6); case7:write_com(0x80+3); case8:s1num=0; write_com(0x0c); flag=0; write_ds(0,miao); write_ds(2,
12、fen); write_ds(4,shi); write_ds(6,week); write_ds(7,day); write_ds(8,month); write_ds(9,year); if(s1num!=0)/只有当S1按下后,才检测S2和S3 if(s2=0) delay(10); if(s2=0)s2); switch(s1num) /根据功能键次数调节相应数值 case1: miao+; if(miao=60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); break; case2: fen+; if(fen=60) fe
13、n=0; write_sfm(7,fen); write_com(0x80+0x40+7); case3: shi+; if(shi=24) shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); case4: week+; if(week=8) week=1; write_week(week); write_com(0x80+12); case5: day+; if(day=32) day=1; write_nyr(9,day); write_com(0x80+9); case6: month+; if(month=13) month=1; writ
14、e_nyr(6,month); write_com(0x80+6); case7: year+; if(year=100) year=0; write_nyr(3,year); write_com(0x80+3); if(s3=0) if(s3=0)s3); miao-; if(miao=-1) miao=59; fen-; if(fen=-1) fen=59; shi-; if(shi=-1) shi=23; week-; if(week=0) week=7; day-; if(day=0) day=31; month-; if(month=0) month=12; year-; if(ye
15、ar=-1) year=99; if(s4=0)/检测S4 if(s4=0) flag1=flag1;s4); if(flag1=0) /退出闹钟设置时保存数值 flag=0; write_com(0x80+0x40); write_com(0x0c); write_ds(1,miao); write_ds(3,fen); write_ds(5,shi); else /进入闹钟设置 read_alarm();/读取原始数据 miao=amiao;/重新赋值用以按键调节 fen=afen; shi=ashi;/显示标志i write_com(0x80+0x40+3); write_sfm(4,ashi);/送液晶显示闹钟时间 write_sfm(7,afen); write_sfm(10,amiao); if(s0=0) if(s0=0) di(); s0num+; if(s0num=2) s0num=0; if(s5=0) if(s5=0) s5num+; if(s5num=5) s5num=0; led(s5num);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1