硬件部分 基于51单片机、 ds1302时钟芯片、 ds18b20温度芯片、 以及1602液晶显示的 实时时间 和 实时温度显示 。同时可通过按键 设置 年、月、日、时、分、星期。并且可以设置闹钟 当闹钟时间到时 蜂鸣器持续发出 滴..声 同时led灯不停闪烁 且在一分钟内没有按指定停止按键 闹钟将自动停止 。。。
![](https://img.diangon.com/portal/201612/13/074815tbpcb6y88mb25tyy.jpeg)
![](https://img.diangon.com/portal/201612/13/074819k5rquq5h551b60z1.jpeg)
![](https://img.diangon.com/portal/201612/13/074819uaeeaeeyayi8y07p.jpeg)
![](https://img.diangon.com/portal/201612/13/074820lk668q9dkxuucau6.jpeg)
![](https://img.diangon.com/portal/201612/13/074820l4v5jqx81sxee8l6.jpeg)
![](https://img.diangon.com/portal/201612/13/074820fwwbppb7wj1b17nn.jpeg)
![](https://img.diangon.com/portal/201612/13/074821g5k72czoskd5zocv.jpeg)
![](https://img.diangon.com/portal/201612/13/074822zllcvcqly1l0nlwq.jpeg)
![](https://img.diangon.com/portal/201612/13/074822iib8xi4x08xlx0zg.jpeg)
![](https://img.diangon.com/portal/201612/13/074822p766ysgppwqr6e2l.jpeg)
![](https://img.diangon.com/portal/201612/13/074824f78sylnlh7bhivdn.jpeg)
![](https://img.diangon.com/portal/201612/13/074826l5uqkuj30ccc8kn8.jpeg)
![](https://img.diangon.com/portal/201612/13/074827bj57zrf7r82ie8ej.jpeg)
软件部分#include #define uchar unsigned char #define uint unsigned intsbit spk=P1^7;sbit led=P1^5;sbit DQ=P1^0;sbit RS=P2^4;sbit RW=P2^5;sbit EN=P2^6;sbit key1=P2^0;sbit key2=P2^1;sbit key3=P2^2;sbit key4=P2^3;sbit IO=P3^6;sbit RST=P3^7;sbit SCLK=P3^5;uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; int nian,xing,yue,ri,shi,fen,miao;uchar num,temp,c,d,time[7],a,b,aa,bb,ns,ng,ys,yg,rs,rg,ss,sg,fs,fg,ms,mg,flag;/*******************1602************************/void delay(int z){ int x,y; for(x=z;x>0;x--) for(y=100;y>0;y--); }void write_com(uchar com) //写命令{ RS=0; P0=com; delay(5); EN=1; delay(5); EN=0;}void write_data(uchar date) //写数据{ RS=1; P0=date; delay(5); EN=1; delay(5); EN=0;}void init() //初始化{ RW=0; EN=0; write_com(0x38); //显示模式设置 write_com(0x0c); //开显示 不显示光标 不闪 write_com(0x06); //写一个字符 地址指针 光标 加一 整屏不移动 write_com(0x01); //显示清零 write_com(0x80+0x04); write_data('2'); write_com(0x80+0x05); write_data('0'); write_com(0x80+0x00); write_data('c'); write_com(0x80+0x01); write_data('a'); write_com(0x80+0x02); write_data('i'); write_com(0x80+0x4e); write_data(0xdf); write_com(0x80+0x4f); write_data('C'); write_com(0x80+0x4b); write_data(0x2e); //显示"。"} /**************DS18B20****************/void delay1(unsigned int t) //延时函数{ while(t--);}void init1() //初始化{ uchar n=0; DQ=1; //DQ复位 delay1(8); DQ=0; //主机将DQ拉低 delay1(80); //大于480us的延时 DQ=1; delay1(5); //延时15~60us n=DQ; delay1(5); //若n=0初始成功 n=1初始失败(可设置返回值查看n是否为1) } void write_byte(uchar dat) //写入一个字节{ uint i; for(i=0;i>=1; } delay1(4);}uchar read_byte() //读入一个字节{ uint k=0; uchar value=0; for(k=0;k>=1; DQ=1; if(DQ) value|=0x80; delay1(4); } return value; }uchar read_temp() //读取温度函数{ uchar a=0,b=0; init1(); write_byte(0xcc); write_byte(0x44); delay1(200); init1(); write_byte(0xcc); write_byte(0xbe); a=read_byte(); b=read_byte(); c=b; d=a; b4; return b;}/***********************1302**********************/void wirte_byte1(uchar date) //写入一个字节{ uchar i; for(i=8;i>0;i--) { IO=date&0x01; SCLK=0; SCLK=1; date=date>>1; }}uchar read_byte1() //读一个字节{ uchar dat,i; for(i=8;i>0;i--) { dat=dat>>1; SCLK=0; if(IO) dat=dat|0x80; SCLK=1; } return(dat);}void write_ds1302(uchar add,uchar date) //将数据写入1302中{ RST=0; SCLK=0; RST=1; wirte_byte1(add); wirte_byte1(date); RST=0; SCLK=1;}uchar read_ds1302(uchar add) //读出1302中数据{ uchar temp; RST=0; SCLK=0; RST=1; wirte_byte1(add); temp=read_byte1(); RST=0; SCLK=0; return (temp);}uchar huan_BCD(uint z) //将数据 转换成BCD { uint a,b; a=z/10; b=z%10; a=a&0xff; b=b&0xff; a=60) { fen=0; } } if(a==3) { ri++; if(ri>=32) { ri=1; } } if(a==4) { yue++; if(yue>=12) { yue=1; } } if(a==5) { nian++; if(nian>=99) { nian=0; } } if(a==6) { xing++; if(xing>=8) { xing=1; } } } if(key3==0) //key3按键 可将需设置的数 调小 { if(a==1) { shi--; if(shi
|