• PUDN用户
    了解作者
  • C/C++
    开发工具
  • 3KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 100
    下载次数
  • 2009-10-09 21:13
    上传日期
用C写的基于51所做的可显示温度的DS12C887的液晶时钟,可以报时,可以设定闹钟,每句话都有详细的注释
DS12c887.rar
  • 可显示温度的DS12c887时钟.c
    8.8KB
内容介绍
/*可显示温度的DS12C887时钟*/ #include <reg52.h>//单片机头文件 #define uint unsigned int//宏定义 #define uchar unsigned char//宏定义 //1602液晶定义 sbit rs=P3^6; sbit en=P3^4; //按键定义 sbit s=P2^0;//功能键 sbit s1=P2^1;//加 sbit s2=P2^2;//减 //ds12c887定义 sbit dscs=P2^7;//片选信号 sbit dsas=P2^6;//地址通信信号 sbit dsrw=P2^5;//读写输入 sbit dsds=P2^4;//数据选通 sbit dsirq=P3^2;//中断请求输入 sbit beep=P3^7;//蜂鸣器定义 sbit DQ=P3^3;//18B20定义 uchar code table[]={" : : "};//时钟格式 uchar code table1[]={" 20 - - "};//年月日 uchar code table2[]={"MonTueWedThuFriSatSun"};//星期 uchar shi,fen,miao,week,month,day,flag,flag1;//时分秒星期月日定义flag:按键标记;flag1:闹钟开关标记 int year;//年 char snum,num;//snum:功能键按键次数 uint wd;//温度 /*************详细函数解释见下面代码*****************/ void wr_nyr(uchar,int); void wr_com(uchar); void wr_data(int); void wr_sfm(uchar ,uchar ); void set_time(); void set_nyr(); void set_alarm(uchar ,uchar ,uchar); /*******************************/ void Delayy(int z)//18B20专用延时 { while(z--); } void delay(uint z)//1ms延时子函数 { uint x,y;//局部变量,用于延时 for(x=z;x>0;x--)//循环语句 for(y=110;y>0;y--);//嵌套语句 } /*****************18B20启动程序******************************/ void init1820()//1820初始化 { DQ=0;//将DQ拉低 Delayy(80);//精确延时 DQ=1;//拉高总线 Delayy(14); } uchar readbyte()//读一个字节 { uchar i,dat; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; Delayy(4); } return(dat); } void wrbyte(uchar dat)//写一个字节 { uchar i; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; Delayy(5); DQ=1; dat>>=1; } } uint tc()//读取温度 { uchar a,b; uint t; float tt; init1820(); wrbyte(0xcc);//跳过读序列号的操作 wrbyte(0x44); //启动温度转换 init1820(); wrbyte(0xcc); wrbyte(0xbe);//读取温度寄存器 a=readbyte();//读低8位 b=readbyte();//读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t=tt*10+0.5;//放大10倍输出并四舍五入 return(t); } void wr_wd(uchar add,uchar dian,uint date) { uchar shi,ge,xiao,aa; shi=date/100;//十位 aa=date%100; ge=aa/10;//个位 xiao=aa%10;//小数位 wr_com(0x80+0x40+add);//第二行显示时分秒,温度地址 wr_data(0x30+shi);//显示十位字符 wr_data(0x30+ge);//显示个位字符 wr_com(0x80+0x40+dian); wr_data('.' );//显示温度小数点 wr_com(0x80+0x40+13); wr_data(0x30+xiao);//显示小数位字符 } /*******************************************************/ /**************************DS12c887*************************************/ void wr_ds(uchar add,int date)//intel总线写时序 { 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)//intel总线读时序 { uchar ds_date; dscs=0; dsas=1; dsds=1; dsrw=1; P0=add; dsas=0; dsds=0; P0=0xff; ds_date=P0; dsds=1; dsas=1; dscs=1; return ds_date; } void wr_week(uchar a)//定义星期函数 { uchar p; p=(a-1)*3; for(num=12;num<15;num++)//液晶上显示星期字符的位置 { wr_com(0x80+num); wr_data(table2[p++]); } } void keyscan()//按键输入函数 { /********************关闭闹钟*******************/ if(flag1==1) { if(s1==0) { delay(5); if(s1==0) { while(!s1); flag1=0; } } if(s2==0) { delay(5); if(s2==0) { while(!s2); flag1=0; } } } /*********************************/ if(s==0)//功能键是否按下 { delay(5);//消抖 if(s==0)//确定按下 { flag=1;//进入调整时间状态 snum++;//功能键按下次数加1 while(!s);//松手检测 if(snum==1)//如果按下1次 { wr_com(0x80+0x40+7);//停在秒位置 wr_com(0x0f);//光标闪烁 } if(snum==2)//按下2次 { wr_com(0x80+0x40+4);//停在分位置 } if(snum==3)//按下3次 { wr_com(0x80+0x40+1);//停在时位置 } if(snum==4)//按下4次 { wr_com(0x80+14);//停在星期位置 } if(snum==5)//按下5次 { wr_com(0x80+10);//停在日位置 } if(snum==6) { wr_com(0x80+7);//停在月位置 } if(snum==7) { wr_com(0x80+4);//停在年为止 } if(snum==8) { flag=0;//返回常态 snum=0;//按键次数清0 wr_com(0x0c);//光标不闪烁 /*********重新赋值给12B887*******************/ wr_ds(0,miao); wr_ds(2,fen); wr_ds(4,shi); wr_ds(6,week); wr_ds(7,day); wr_ds(8,month); wr_ds(9,year); /*******************************************/ } } } if(snum!=0)//表示按键已经被按下了 { if(s1==0)//加按下 { delay(5);//消抖 if(s1==0)//确认按下 { while(!s1);//松手检测 if(snum==1)//功能键按下次数为1时 { miao++;//每按下一次S1,秒加1 if(miao==60) miao=0; wr_sfm(7,miao);//秒刷新;秒地址,数据 wr_com(0x80+0x40+7);//光标在秒位置 } if(snum==2) { fen++;//S1按下后分加1 if(fen==60) fen=0; wr_sfm(4,fen);//分刷新;分地址,数据 wr_com(0x80+0x40+4); } if(snum==3) { shi++;//时加1 if(shi==24) shi=0; wr_sfm(1,shi);//时刷新 wr_com(0x80+0x40+1); } if(snum==4) { week++;//星期加1 if(week==8) week=1; wr_week(week);//星期刷新 wr_com(0x80+14); } if(snum==5) { day++;//日加1 if(day==32) day=1; wr_nyr(9,day);//日期刷新 wr_com(0x80+9); } if(snum==6) { month++;//月加1 if(month==12) month=1; wr_nyr(6,month);//月刷新 wr_com(0x80+6); } if(snum==7) { year++;//年加1 wr_nyr(3,year); wr_com(0x80+3);//年刷新 } } } } if(s2==0)//减按下 { delay(5);//消抖 if(s2==0)//确认按下 { while(!s2); if(snum==1)//功能键按下次数为1时 { miao--;//秒减1 if(miao==-1) miao=59; wr_sfm(7,miao); wr_com(0x80+0x40+7); } if(snum==2)//功能键按下次数为2时 { fen--;//分减1 if(fen==-1) fen=59; wr_sfm(4,fen);//分刷新 wr_com(0x80+0x40+4); } if(snum==3)//功能键按下次数为3时 { shi--;//时减1 if(shi==-1) shi=23; wr_sfm(1,shi);//时刷新 wr_com(0x80+0x40+1); } if(snum==4)//功能键按下次数为4时 { week--;//星期减1 if(week==0) week=7; wr_week(week);//刷新星期 wr_com(0x80+14); } if(snum==5)//按下次数为5 { day--;//日减1 if(day==0) day=31; wr_nyr(9,day);//日刷新 wr_com(0x80+9); } if(snum==6)//按下次数为6 { month--;//月减1 if(month==12) month=1; wr_nyr(6,month);//月刷新 wr_com(0x80+6); } if(snum==7)//按下次数为7 { year--;//年减1 wr_nyr(3,year);//年刷新 wr_com(0x80+3); } } } } void wr_com(uchar com)//1602写指令 { rs=0; P0=com; delay(5); en=0; delay(1); en=1; } void wr_data(int date)//1602写数据 { rs=1; P0=date; delay(5); en=0; delay(1); en=1; } void init() { EA=1; EX0=1; IT0=1;// 跳变 沿触发方式 wr_ds(0x0b,0x26); read_ds(0x0c);//闹钟开启 wr_ds(0x0a,0xa0);//12c887初始化 // set_time(); // set_nyr(); set_alarm(17,02,0);//闹钟时间设置 wr_com(0x01); wr_com(0x38);//显示模式设置 wr_com(0x0c);//光标设置,开显示 wr_com(0x06);//光标移动设置,光标自动加1,整屏不移动 wr_com(0x01);//清屏 wr_com(0x80);//光标在一行第一个位置 for(num=0;num<15;num++) { wr_data(table1[num]); delay(5); } wr_com(0x80+0x40);//光标在第二行 for(num=0;num<7;num++) { wr_data(table[num]); delay(5); } /*摄氏度符号 */ wr_com(0x80+0x40+14); wr_data(0xdf); delay(5); wr_com(0x80+0x40+15); wr_data(0x43); delay(5); } void wr_sfm(uchar add,uchar date)//显示时分秒的地址,数据 { uchar shi,ge; shi=date/10; ge=date%10; wr_com(0x80+0x40+add); wr_data(0x30+shi);//字符编码 wr_data(0x30+ge); } void wr_nyr(uchar add,int date)//显示年月日的地址,数据 { uchar shi,ge; shi=date/10; ge=date%10; wr_com(0x80+add); wr_data(0x30+shi); wr_data(0x30+ge); } void set_time()//设定初始时间 { wr_ds(4,21); wr_ds(2,21); } void set_nyr()//初始日期 { wr_ds(9,9); wr_ds(8,8); wr_ds(7,17); } void set_alarm(uchar ashi,uchar afen,uchar amiao)//设置闹钟 { wr_ds(1,amiao); wr_ds(3,afen); wr_ds(5,ashi); } void did
评论
    相关推荐
    • ds12c887.zip
      用c语言编的时钟芯片DS12C887驱动程序。
    • 12c88.rar
      DS12C887的C程序,自己用过,好用的,献给大家
    • DS12887.rar
      ds12c887驱动程序,可以实现实时时钟,并且掉电数据也不丢失,采用总线接口
    • 1602_DS18B20.zip
      1602液晶+DS18B20,MCU是STC12C5A60S2,平台是Keil C,因为开发环境没有这个选项,所以就选了C-C++,还有里面的STC头文件和另外一个头文件是我自己写的,大家可以根据需要自己改动下,第一次上传,请轻拍
    • DS12C887-based_real-time_calendar_clock_display_sy
      基于DS12C887的实时日历时钟显示系统设计,单片机入门。
    • DS12C887实时时钟winbond接口程序.rar
      DS12C887实时时钟winbond接口程序
    • DS12C887.zip
      基于C51单片机的,使用DS12c887的c语言时钟程序。
    • ds12c887.rar
      ds12c887 interfacing with 8051.the code just initialises ,reads and displays it in the serial port.
    • 基于51单片机的DS12C887 实时时钟PL2303+1602液晶系统
      时钟芯片DS12C887、51单片机、USB转串口芯片PL2303、1602液晶     系统特点介绍: 本系统通过上位机与下位机之间的通行协议,实现在三个更新周期内,上位机时间与下位机时间完全同步,适用于时间...
    • Proteus7.12.rar
      Proteus7.12完美破解版.rar电路仿真软件很好用可以仿真单片数字模拟电路