51时钟(含闹钟)是我做的第一个小东西,包括焊版,包括写代码,完了以后虽然觉得没什么,但是过程还是很享受的,下一个小东西是集成12864,红外,18B20和DS12C887来做个可以显示万年历和温度并且用红外来选择功能的小东西。下面是时钟的代码:

#include<reg52.h>
#include<define.h>
/*延时函数,毫秒级*/
void delay(uint z)
{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
/*闹铃响函数*/
void music()
{beep=0;delay(50);beep=1;delay(100);beep=0;delay(100);beep=1;
}
/*写命令函数,1604液晶*/
void write_com(uchar com)
{rs=0;wr=0;P1=com;lcden=0;delay(10);lcden=1;delay(10);lcden=0;
}
/*写数据函数,1604液晶*/
void write_date(uchar date)
{rs=1;wr=0;P1=date;lcden=0;delay(10);lcden=1;delay(10);lcden=0;
}
/*初始化函数*/
void init()
{uchar num;EA=1;EX0=1;IT0=1;lcden=0;//write_ds(0x0A,0x20);//打开振荡器read_ds(0x0c);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}
}
/*写时间函数*/
void write_sfm(uchar add,uchar date)
{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);
}
/*写年月日函数*/
void write_ymd(uchar add,uint num)
{write_com(0x80+add);temp=num/10;write_date(0x30+temp);temp=num%10;write_date(0x30+temp);}
/*写星期函数*/
void write_week()
{write_com(0x80+0x0d);switch(week){case 1:write_date('M');write_date('O');write_date('N');break;case 2:write_date('T');write_date('U');write_date('E');break;case 3:write_date('W');write_date('E');write_date('D');break;case 4:write_date('T');write_date('H');write_date('U');break;case 5:write_date('F');write_date('R');write_date('I');break;case 6:write_date('S');write_date('A');write_date('T');break;case 7:write_date(0x53);write_date('U');write_date('N');break;}
}
/*键盘扫描函数*/
void keyscan()
{/*若是功能键被按下*/   if(s1==0) {delay(5);if(s1==0){  s1num++;flag=1;while(!s1);if(s1num==1)//秒{write_com(0x80+0x40+10);write_com(0x0f);}if(s1num==2)//分{write_com(0x80+0x40+7);}if(s1num==3)//时{write_com(0x80+0x40+4);}if(flag1==1)s1num=8;//若是设置闹铃,则跳过年月日的设置if(s1num==4)//星期{write_com(0x80+0x0D);}if(s1num==5)//天{write_com(0x80+0x0a);}if(s1num==6)//月{write_com(0x80+0x07);}if(s1num==7)//年{write_com(0x80+0x04);}if(s1num==8)//退出{s1num=0;write_com(0x0c);flag=0;//退出功能键if(flag1==0)//若不是设置闹铃{lcd_reset();init();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);}else//若是闹铃设置,则将设定的时间付给闹铃时间变量,回到初始化界面{write_ds(1,miao);//写入闹铃单元write_ds(3,fen);write_ds(5,shi);lcd_reset();init();}}}//if(s2==0)     }//if(s2==0)if(s1num!=0){//增加键if(s2==0){delay(1);if(s2==0){while(!s2);if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);}if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);}if(s1num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);}if(s1num==4){week++;if(week==8)week=1;write_week();write_com(0x80+0x0D);}if(s1num==5)//日{day++;if(day==31)day=1;write_ymd(0x0a,day);write_com(0x80+0x0a);}if(s1num==6)//月{month++;if(month==12)month=1;write_ymd(7,month);write_com(0x80+0x07);}if(s1num==7)//年{year++;if(year==100)year=0;write_ymd(4,year);write_com(0x80+0x04);}}//if(s2==0)}//if(s2==0)//减少键if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){if(miao==0){miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);}miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);}if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);}if(s1num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);}if(s1num==4)//{week--;if(week==-1)week=7;write_week();write_com(0x80+0x0C);}if(s1num==5)//日{day--;if(day==-1)day=31;write_ymd(0x0a,day);write_com(0x80+0x0a);}if(s1num==6)//月{month--;if(month==-1)month=12;write_ymd(7,month);write_com(0x80+0x07);}if(s1num==7)//年{year--;if(year==-1)year=99;write_ymd(4,year);write_com(0x80+0x04);}}//if(s3==0)}//if(s3==0)//闹铃键if(s4==0){delay(5);if(s4==0){flag1=1;//闹铃设置开启while(!s4);/*在液晶上显示设置闹铃的界面*/lcd_reset();write_com(0x80);while(table2[i]!='\0'){write_date(table2[i]);i++;}i=0;write_com(0x80+0x40);while(table1[i]!='\0'){write_date(table1[i]);i++;}write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);/*显示出光标*/write_com(0x80+0x40+10);write_com(0x0f);i=0;}//if(s4==0)}//if(s4==0)}//if(s1num!=0)/*若闹铃响则按下闹铃键取消*/if(flag2) {if(s4==0){delay(5);if(s4==0){while(!s4);flag2=0;}}}
}
/*写数据函数*/
void write_ds(uchar add,uchar date)
{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)
{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;
}
/*液晶初始化函数*/
void lcd_reset()
{delay(15);write_com(0x38);delay(5);write_com(0x38);delay(5);write_com(0x38);delay(5);write_com(0x08);write_com(0x01);write_com(0x06);write_com(0x0c);
}
/*主函数*/
void main()
{lcd_reset();init();while(1){keyscan();asec=read_ds(1);//读出闹铃时间amin=read_ds(3);ahour=read_ds(5);if(flag==0)//若是功能键未被按下,则运行时钟{miao=read_ds(0);  fen=read_ds(2);shi=read_ds(4);week=read_ds(6);day=read_ds(7);month=read_ds(8);year=read_ds(9);if(asec==miao&&amin==fen&&ahour==shi)flag2=1;//闹铃标志write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);write_week();write_ymd(0x0a,day);write_ymd(7,month);write_ymd(4,year);}if(flag2)music();//闹铃响}
}
/*外部中断函数*/
void exter() interrupt 0
{   uchar c;c=read_ds(0x0c);
}

51时钟含闹钟(可按键设置)相关推荐

  1. 关于用51单片机内部定时器实现时钟和闹钟功能的概述

    关于用51单片机内部定时器实现时钟和闹钟功能的概述 仅个人观点,欢迎大家相互学习和讨论 STC89C52单片机,内部配置了三个定时器,T0\T1\T2,其中T2定时器我们几乎不用,或者说很少用到.我们 ...

  2. 【Proteus仿真】LCD1602+DS1307按键设置简易时钟

    [Proteus仿真]LCD1602+DS1307按键设置简易时钟 Proteus仿真演示 功能说明 通过按键设置当前时间,按键调整时间只实现了对时分秒的设置,年月日以及星期是程序代码写入的,按键不能 ...

  3. 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)

    51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...

  4. 可调时钟的闹钟模式(接上篇)

    写在前面: 上篇文末提到可以优化的地方包括加入闹钟,了解无源蜂鸣器的工作原理后,就着手扩展闹钟设置功能了,同时按键按下加入蜂鸣器的提示音.由于上篇的篇幅过长了,所以决定单独写一篇这个闹钟模块. 一.实 ...

  5. 基于51单片机实现闹钟功能

    使用模块:数码管,独立按键,定时器0,定时器1 芯片:STC89C52RC 整体功能说明: 按键K1实现时钟.闹钟.秒表.日期的切换: 在时钟,闹钟和日期修改模式下,按键K2控制时分秒(年月日)的选择 ...

  6. 如何在51单片机实现闹钟功能

    如何在51单片机实现闹钟功能 51单片机制作万年历过程中的闹钟部分,主要说明设计算法,软件特性可以在proteus上仿真.闹钟是人机交互的一部分,因此闹钟的实现与具体的人机交互方式息息相关,本系统采用 ...

  7. 【2022最新Java面试宝典】—— Java虚拟机(JVM)面试题(51道含答案)

    目录 一.Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 2. 为什么说java是跨平台语言 3. Jdk和Jre和JVM的区别 4. 说一下 JVM由那些部分组成,运行流程 ...

  8. 小米手机证书信任设置在哪里_手机闹钟在哪里设置

    如今手机功能丰富多样,或许有些朋友还会搞不清楚手机闹钟在哪里设置,下面就给大家简单介绍下手机闹钟在哪里设置的问题. 手机闹钟在哪里设置 以下是苹果手机闹钟设置的方法 步骤1.拿到手机,找到时钟应用,点 ...

  9. 51单片机键盘接口-独立按键和矩阵按键

    51单片机键盘接口-独立按键和矩阵按键 按键的分类 键输入原理 独立式键盘 矩阵键盘 消抖 键码识别 键盘程序 按键的分类 按键按照结构原理可分为两类:一类是触点式开关按键,如机械开关.导电橡胶开关等 ...

最新文章

  1. 如何优雅地训练大型模型?
  2. 我们常用的 Integer 内部为什么会去实现 Comparable 接口?
  3. Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享
  4. ITK:获取类型的基本信息
  5. xml方式实现aop-通知的种类
  6. 在Google Cloud platform上创建Kubernetes cluster并使用
  7. 跟我学jQuery(二) 初识jQuery
  8. 电影特效用到什么计算机知识,后期影视特效处理知识普及
  9. JSON 语法之JSON null
  10. 学习记录——DSIC与IC的区别
  11. typescript接口使用
  12. 京西古道,王平到圈门的穿越
  13. 想了很久,我还是来了;天天看blog我也就想自己拥有一个了,好事。。。。坚持。。。。...
  14. matlab生成西门子plc源文件,【图】西门子step7功能块的属性及生成源文件的步骤...
  15. css精华怎么使用,css橄榄精华好用吗?css橄榄精华评测
  16. 应用华为大数据平台配置大数据项目①
  17. OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
  18. Greenplum删除segment节点
  19. win10 安装 frida 安装配置
  20. 未名企鹅极客 | 人机图灵测试中数字图像处理方法研究

热门文章

  1. AC自动机模板(【CJOJ1435】)
  2. MPB:中农冯固组-​利用13C-DNA-SIP法示踪根际和菌丝际活性解磷细菌
  3. VUE项目学习(二):学习项目文件结构
  4. 编程与手绘的异同---“运动”
  5. linux efi启动,在linux环境中利用efibootmgr管理efi启动项
  6. 学术规范与论文写作 答案
  7. python子图标题_python, 如何在subplot在总的图画上面加title?
  8. Unity 打包APK 适配全面屏、刘海屏、水滴屏、挖孔屏
  9. 漫谈程序员系列:程序员该不该考虑初创公司
  10. 【毕业设计】51-基于Multisim的篮球比赛24秒倒计时计时器的设计(仿真工程+相关芯片资料+答辩论文)