DS12C887.zip

  • PUDN用户
    了解作者
  • C/C++
    开发工具
  • 3KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 5
    下载次数
  • 2013-05-27 11:28
    上传日期
利用DS12C887实现实时时钟及闹钟功能,还能利用按键调节时钟,在1602 上显示
DS12C887.zip
  • DS12C887设计数字钟程序.txt
    11.2KB
内容介绍
郭天享单片机80c51教程 十天学会单片机 共计十三课 重要介绍单片机端口 c语言及中断程序入口 学习单片机是学习阿入门的基础 dip40脚座一个 杜邦线=单头带帽40根 单排针两排 小电路板一块 ds12c887一片 综合运用51单片机知识设计一个可以随意调节时间 带整点闹铃的时钟(其中用到定时器 中断 按键 蜂鸣器 液晶或串口通信) 时钟功能,可以显示,设置日期,星期,时间,可以设置闹铃, ds12cbb7内部带有锂电池 系统掉电情况下可以自行精确走十年 并带有闹钟功能,年 月 日,时 分 秒 用的器材,STC89C52,YJD1602A-1,DS12C887,矩阵键盘4*4(只用了4个键),蜂鸣器 按键功能: 通过第四列的四个键来设置时间,闹钟等。(按其它列键会引起程序异常,,主要是因为先把P3口都接到键盘上了,LCDEN,LCDRS,LCDRW也都接在了P3口)。 引脚设置: 矩阵键盘:p3.0-p3.3控制行,p3.4-p3.7控制列 DS12C887: 1,2,3,19,20,21,22,23不接,ad0-ad7接p1.0-p1.7 12,16接地, 18,24结vcc cs接p2.4,as接p2.0,ds接p2.2,irq接p2.5 1602LCD: P0口接地址总线…… 蜂鸣器接p2.3 #include <reg52.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit lcdrs=P3^5; sbit lcdrw=P3^6; sbit dl=P2^6; sbit wl=P2^7; sbit dscs=P2^4; sbit dsas=P2^0; sbit dsrw=P2^1; sbit dsds=P2^2; sbit beep=P2^3; sbit dsirq=P2^5; uchar i,year,month,day,xingqi,hour,minute,second,temp,flag,hang,lie,select,alarm; uchar set_year,set_month,set_day,set_xingqi,set_hour,set_minute,alarm_hour,alarm_minute,alarm_second; uchar code table_xingqi[7][3]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void dudu() { if(dsirq==0) { beep=0; delay(30); beep=1; } } void write_ds_com(uchar add,uchar date) //写时钟芯片数据 { dscs=0; dsas=1; dsds=1; dsrw=1; P1=add; dsas=0; dsrw=0; P1=date; dsrw=1; dsas=1; dscs=1; } uchar read_ds_data(uchar add) //读时钟芯片数据 { uchar ds_date; dsas=1; dsds=1; dsrw=1; dscs=0; P1=add; dsas=0; dsds=0; P1=0xff; ds_date=P1; dsds=1; dsas=1; dscs=1; return ds_date; } void set_alarm(uchar h,uchar m,uchar s) { write_ds_com(1,s); write_ds_com(3,m); write_ds_com(5,h); } void write_com(uchar com) //写1602LCD指令 { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date) //写1602LCD数据 { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void c_second() //显示秒 { uchar shi,ge; second=read_ds_data(0); shi=second/10; ge=second%10; write_com(0x80+0x40+8); write_data(shi+0x30); write_com(0x80+0x40+9); write_data(ge+0x30); } void c_minute() //显示分 { uchar shi,ge; minute=read_ds_data(2); shi=minute/10; ge=minute%10; write_com(0x80+0x40+5); write_data(shi+0x30); write_com(0x80+0x40+6); write_data(ge+0x30); } void c_hour() //显示小时 { uchar shi,ge; hour=read_ds_data(4); shi=hour/10; ge=hour%10; write_com(0x80+0x40+2); write_data(shi+0x30); write_com(0x80+0x40+3); write_data(ge+0x30); } void c_xingqi() //显示星期 { uchar x; xingqi=read_ds_data(6); for(x=0;x<3;x++) { write_com(0x80+13+x); write_data(table_xingqi[xingqi-1][x]); } } void c_day() //显示日 { uchar shi,ge; day=read_ds_data(7); shi=day/10; ge=day%10; write_com(0x80+10); write_data(shi+0x30); write_com(0x80+11); write_data(ge+0x30); } void c_month() //显示月 { uchar shi,ge; month=read_ds_data(8); shi=month/10; ge=month%10; write_com(0x80+7); write_data(shi+0x30); write_com(0x80+8); write_data(ge+0x30); } void c_year() //显示年 { uchar shi,ge; year=read_ds_data(9); shi=year/10; ge=year%10; write_com(0x80+2); write_data(2+0x30); write_com(0x80+3); write_data(0+0x30); write_com(0x80+4); write_data(shi+0x30); write_com(0x80+5); write_data(ge+0x30); } uchar keyscan() //键盘扫描 { P3=0X0F; if((P3&0X0F)!=0X0F) { switch(P3) { case 0x0e: hang=1; break; case 0x0d: hang=2; break; case 0x0b: hang=3; break; case 0x07: hang=4; break; default: break; } delay(100); P3=0XF0; if((P3&0XF0)!=0XF0) { switch(P3) { case 0xe0: lie=1; break; case 0xd0: lie=2; break; case 0xb0: lie=3; break; case 0x70: lie=4; break; default: break; } } return 1; } else return 0; } void set_time(uchar x) // 时钟设置(年月日小时分钟) { set_year=0; set_month=0; set_day=0; set_xingqi=0; set_hour=0; set_minute=0; switch(x) { case 1: set_year=1; //年设置,状态显示为y write_com(0x80); write_data('y'); break; case 2: //月设置,状态显示为m set_month=1; write_com(0x80); write_data('m'); break; case 3: //日设置,状态显示为d set_day=1; write_com(0x80); write_data('d'); break; case 4: //周设置,状态显示为w set_xingqi=1; write_com(0x80); write_data('w'); break; case 5: //时设置,状态显示为h set_hour=1; write_com(0x80); write_data('h'); break; case 6: //分设置,状态显示为f set_minute=1; write_com(0x80); write_data('f'); break; default: break; } } //程序初始化 void init() { lcden=0; wl=1; P0=0XFF; wl=0; alarm=1; write_com(0x38);//设置显示模式 write_com(0x0f); write_com(0x06); write_com(0x01); write_com(0x80); write_ds_com(0x0a,0x20); //启动时钟芯片内部晶振 write_ds_com(0x0B,0x26); //24小时制,二进制格式 //第一次使用芯片时设置初始时间,防止出错(设置初始时间一定不能超过范围,否则会出错!) //write_ds_com(0,45); //秒 // write_ds_com(2,48); //分钟 // write_ds_com(4,17); //小时 // write_ds_com(6,3); //星期 // write_ds_com(7,10); //天 // write_ds_com(8,12); //月 // write_ds_com(9,8); //年 set_alarm(13,58,0); alarm_hour=read_ds_data(5); alarm_minute=read_ds_data(3); alarm_second=read_ds_data(1); read_ds_data(0x0c); write_com(0x80+6); write_data('-'); write_com(0x80+9); write_data('-'); write_com(0x80+0x40+4); write_data(':'); write_com(0x80+0x40+7); write_data(':'); write_com(0x80+0x40+11); //显示当前闹铃时间 write_data(alarm_hour/10+0x30); write_com(0x80+0x40+12); write_data(alarm_hour%10+0x30); write_com(0x80+0x40+13); write_data(':'); write_com(0x80+0x40+14); write_data(alarm_minute/10+0x30); write_com(0x80+0x40+15); write_data(alarm_minute%10+0x30); // second=read_ds_data(0);//读取时钟芯片时间 // minute=read_ds_data(0x02); // write_ds_com(7,8); } void main() { init(); while(1) { c_second(); c_minute(); c_hour(); c_xingqi(); c_day(); c_month(); c_year(); if(alarm!=0) { dudu(); write_com(0x80+40+1); write_data('@'); //表示当前闹钟为开 if(alarm==1) //显示当前闹钟设置状态 { write_com(0x80+40); write_data('h'); }else { write_com(0x80+40); write_data('m'); } }else { write_com(0x80+0x40+1); write_data(' '); } if(keyscan()) { if(hang==1&&lie==4) //设置键 { flag=1; select++; alarm=0; if(select>6) { select=1; } write_com(0x80+0x40); write_data('*'); set_time(select); } if(hang==4&&lie==4) //退出设置 { flag=0; alarm++; if(alarm>2) { alarm=0; } read_ds_data(0x0c); write_com(0x80); write_data(' '); write_com(0x80+0x40); write_data(' '); } if(flag==1||alarm!=0) //设置时钟或闹铃 { if(hang==2&&lie==4) { if(set_year==1&&alarm==0) { year++; if(year>99) year=0; write_ds_com(9,year); } if(set_month==1&&al
评论
    相关推荐
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      数据库课程设计十分完整有需要的请下载啊谢谢
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...