免费预览已结束,剩余33页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于51单片机和DS12C887时钟芯片的c语言程序代码1:#include#includevoid delay(uint z)/延时函数uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void di() /蜂鸣器报警声音beep=0;delay(100);beep=1;void write_com(uchar com)/写液晶命令函数rs=0;lcden=0;P0=com;delay(3);lcden=1;delay(3);lcden=0;void write_date(uchar date)/写液晶数据函数rs=1;lcden=0;P0=date;delay(3);lcden=1;delay(3);lcden=0;void init()/初始化函数uchar num;EA=1;/打开总中断EX1=1;/开外部中断1IT1=1;/设置负跳变沿触发中断flag1=0;/变量初始化t0_num=0;s1num=0;week=1;dula=0;/关闭数码管显示wela=0;lcden=0;rd=0;/*以下几行在首次设置DS12C887时使用,以后不必再写入write_ds(0x0A,0x20);/打开振荡器write_ds(0x0B,0x26);/设置24小时模式,数据二进制格式/开启闹铃中断set_time();/设置上电默认时间-*/write_com(0x38);/1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num15;num+)/写入液晶固定部分显示write_date(tablenum);delay(1);write_com(0x80+0x40);for(num=0;num11;num+)write_date(table1num);delay(1);void write_sfm(uchar add,char date)/1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void write_nyr(uchar add,char date)/1602液晶刷新年月日函数3为年,6为分,9为秒char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void write_week(char we)/写液晶星期显示函数write_com(0x80+12);switch(we)case 1:write_date(M);delay(5);write_date(O);delay(5);write_date(N);break;case 2:write_date(T);delay(5);write_date(U);delay(5);write_date(E);break;case 3:write_date(W);delay(5);write_date(E);delay(5);write_date(D);break;case 4:write_date(T);delay(5);write_date(H);delay(5);write_date(U);break;case 5:write_date(F);delay(5);write_date(R);delay(5);write_date(I);break;case 6:write_date(S);delay(5);write_date(A);delay(5);write_date(T);break;case 7:write_date(S);delay(5);write_date(U);delay(5);write_date(N);break;void keyscan()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)/检测S1delay(5);if(s1=0)s1num+;/记录按下次数if(flag1=1)if(s1num=4)s1num=1;flag=1;while(!s1);di();switch(s1num)/光标闪烁点定位case 1: write_com(0x80+0x40+10); write_com(0x0f);break;case 2: write_com(0x80+0x40+7);break;case 3: write_com(0x80+0x40+4);break;case 4: write_com(0x80+12);break;case 5: write_com(0x80+9);break;case 6: write_com(0x80+6);break;case 7: write_com(0x80+3);break;case 8: s1num=0;write_com(0x0c);flag=0;write_ds(0,miao);write_ds(2,fen);write_ds(4,shi);write_ds(6,week);write_ds(7,day);write_ds(8,month);write_ds(9,year);break;if(s1num!=0)/只有当S1按下后,才检测S2和S3if(s2=0)delay(1);if(s2=0)while(!s2);di();switch(s1num)/根据功能键次数调节相应数值case 1:miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10); break;case 2:fen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7); break;case 3:shi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4); break;case 4:week+;if(week=8)week=1;write_week(week);write_com(0x80+12);break;case 5:day+;if(day=32)day=1;write_nyr(9,day);write_com(0x80+9);break;case 6:month+;if(month=13)month=1;write_nyr(6,month);write_com(0x80+6);break;case 7:year+;if(year=100)year=0;write_nyr(3,year);write_com(0x80+3);break;if(s3=0)delay(1);if(s3=0)while(!s3);di();switch(s1num)/根据功能键次数调节相应数值case 1:miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);break; case 2:fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3:shi-;if(shi=-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);break;case 4:week-;if(week=0)week=7;write_week(week);write_com(0x80+12);break;case 5:day-;if(day=0)day=31;write_nyr(9,day);write_com(0x80+9);break;case 6:month-;if(month=0)month=12;write_nyr(6,month);write_com(0x80+6);break;case 7:year-;if(year=-1)year=99;write_nyr(3,year);write_com(0x80+3);break;if(s4=0)/检测S4delay(5);if(s4=0)flag1=flag1;while(!s4);di();if(flag1=0)/退出闹钟设置时保存数值flag=0;write_com(0x80+0x40);write_date( );write_date( );write_com(0x0c);write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);else/进入闹钟设置read_alarm();/读取原始数据miao=amiao;/重新赋值用以按键调节fen=afen;shi=ashi;write_com(0x80+0x40);write_date(R);/显示标志write_date(i);write_com(0x80+0x40+3);write_sfm(4,ashi);/送液晶显示闹钟时间write_sfm(7,afen);write_sfm(10,amiao);void write_ds(uchar add,uchar date)/写12C887函数dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;/先写地址dsas=0;dsrw=0;P0=date;/再写数据dsrw=1;dsas=1;dscs=1;uchar read_ds(uchar add)/读12C887函数 uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;/先写地址dsas=0;dsds=0;P0=0xff;ds_date=P0;/再读数据dsds=1;dsas=1;dscs=1;return ds_date;/*-首次操作12C887时给予寄存器初始化-void set_time()/首次上电初始化时间函数write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);-*/void read_alarm()/读取12C887闹钟值amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);void main()/主函数init();/调用初始化函数while(1)keyscan();/按键扫描if(flag_ri=1)/当闹钟中断时进入这里di();delay(100);di();delay(500);if(flag=0&flag1=0)/正常工作时进入这里keyscan();/按键扫描year=read_ds(9);/读取12C887数据month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);write_sfm(10,miao);/送液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_nyr(3,year);write_nyr(6,month);write_nyr(9,day);void exter() interrupt 2/外部中断1服务程序uchar c; /进入中断表示闹钟时间到,flag_ri=1; /设置标志位,用以大程序中报警提示c=read_ds(0x0c);/读取12C887的C寄存器表示响应了中断代码2:#include#includeshijian.h/*模式选择*/void keyscan1()if(s4=0); delay(5); if(s4=0) s4num+;while(!s4);switch(s4num)case 1:flag1=flag1;if(flag1=1) /打铃时间间隔设置标志位(防止在设置时显示时间) /把闹铃的寄存器作为打铃的寄存器使用read_alarm(); /先读取闹铃时间miao=amiao; /在把闹铃值赋给时间值用以调节fen=afen; shi=ashi;write_com(0x80+0x40);write_date(R); /显示标志write_date(i);write_com(0x80+0x40+3);display(0x40+4,ashi); /显示间隔时间display(0x40+7,afen);display(0x40+10,amiao);break;/*/case 2: flag1=flag1;if(flag1=0) /清除标志位flag=0;write_com(0x80+0x40);write_date( );/清除打铃时间间隔标志位write_date( );write_com(0xc0);write_ds(1,miao); /储存间隔时间write_ds(3,fen);write_ds(5,shi);/*/flag_paobiao=flag_paobiao;miao_pb=0;/先把跑表值都赋为0fen_pb=0;tt=0;while(!s2);if(flag_paobiao=1)init_paobiao();/*/break;case 3:flag_paobiao=flag_paobiao;if(flag_paobiao=0)write_com(0x80+0x40);write_date( );write_date( );/*/flag2=flag2;if(flag2=1)miao=miaonz1; /把闹铃值赋给时间值用来调整闹铃fen=fennz1; shi=shinz1;write_com(0x80+0x40);write_date(N);write_date(Z);write_date(1);write_com(0x80+0x40+3);display(0x40+4,shinz1);display(0x40+7,fennz1);display(0x40+10,miaonz1);break;/*/case 4:flag2=flag2;if(flag2=0)miaonz1=miao; /把调整好的时间值赋回给闹铃值(保存闹铃值)fennz1=fen;shinz1=shi;flag=0;write_com(0x80+0x40);write_date( );write_date( );write_date( );/*/flag21=flag21;if(flag21=1)miao=miaonz2; fen=fennz2; shi=shinz2;write_com(0x80+0x40);write_date(N);write_date(Z);write_date(2);write_com(0x80+0x40+3);display(0x40+4,shinz2);display(0x40+7,fennz2);display(0x40+10,miaonz2); delay(5);break;/*/ case 5:flag21=flag21;if(flag21=0)miaonz2=miao;fennz2=fen;shinz2=shi;flag=0;write_com(0x80+0x40);write_date( );write_date( );write_date( ); /*温湿度*/ flag22=flag22; if(flag22=1)write_com(0x80);write_date(W);write_date(:);write_date( );write_date( );write_date(.);write_date( );write_date( );write_date( );write_date(S);write_date(:);write_date( );write_date( );write_date(.); tempval=measure_T(); humival=measure_H(); if(error=0) delayms(500); dis_tempval=c_T(tempval); disply_T(dis_tempval); dis_humival=c_H(dis_tempval,humival); disply_H(dis_humival); break; /*/ case 6:flag22=flag22;if(flag22=0)write_com(0x80);write_date( );write_date(2);write_date(0);write_date( );write_date( );write_date(-);write_date( );write_date( );write_date(-);write_date( );write_date( );write_date( );write_date( );write_date( );write_date( );write_date( );flag23=flag23;if(flag23=1) write_com(0x80);write_date(U);write_date(:);write_date( );write_date(.);write_date( );write_date( );write_date(V);write_date( );write_date(I);write_date(:);write_date( );write_date(.);write_date( );write_date( );write_date(A);write_date( ); adval=ReadADC() ; /读取AD值 disply_Y(adval); /电压值显示 delay(30); / AD_val=255-adval; / disply_L(AD_val); /电压值显示 delay(30); break;case 7:flag23=flag23;if(flag23=0)write_com(0x80);write_date( );write_date(2);write_date(0);write_date( );write_date( );write_date(-);write_date( );write_date( );write_date(-);write_date( );write_date( );write_date( );write_date( );write_date( );write_date( );write_date( );break; case 8:s4num=0;break; /*/if(flag_paobiao=1)if(s2=0)delay(5);if(s2=0)while(!s2);TR0=TR0;display_paobiao();void shijian()uchar miaoy;year=read_ds(9);month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miaoy=miao; /把当前秒赋给miaoy用以判断秒是否变化miao=read_ds(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陈旧性股骨颈骨折的护理课件
- 2026年个人借款担保物紫檀木收藏协议
- 后勤车间综治管理制度(3篇)
- 凳子拓展活动方案策划(3篇)
- 电子元器件安装管理制度(3篇)
- 2026年临床护理服务合同
- 全国基础实验题型分析与答题策略指导
- 后天性颞部缺损的护理查房
- 健康教育学重点知识点精讲
- 智能工厂自动化设备维护操作手册
- 烘干塔买卖合同范本
- 扬修2SA8电动执行器使用维护
- 2025云南省科技投资管理有限公司招聘二次(19人)笔试考试参考试题及答案解析
- 2025中国电信股份有限公司重庆分公司社会成熟人才招聘考试笔试备考试题及答案解析
- 2025年广东省春季高考(学考)英语真题(试题+答案)
- 2025年4月自考03450公共部门人力资源管理试题
- 苏科版七年级数学上册:一元一次方程解应用题常见问题类型归纳
- 创意美术《《千里江山图》》课件
- 大学英语三级词汇表(新版)
- 黄瓜杂交种子生产技术
- 国际海域划界测量技术方法
评论
0/150
提交评论