51单片机电子时钟设计完整的设计

基于51单片机的电子时钟设计 - 下载频道
- CSDN.NET
&&&&基于51单片机的电子时钟设计
基于51单片机的电子时钟设计
基于51单片机的电子时钟设计,没有应用时钟芯片,外围电路很简单,14个数码管显示年月日时分秒,三个独立按键可以设置时间日期,具有掉电保护电路,软件由C语言编写,具有平闰年、大小月判断功能,大家多多讨论,共同进步
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行MCS-51单片机由8051CPU、振荡器和时序电路、4KB程序存储器、128字节数据..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于51单片机的电子时钟设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口51单片机带闹钟可调时间的电子时钟程序设计
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
51单片机带闹钟可调时间的电子时钟程序设计
&& 基于51单片机、 ds1302时钟芯片、 ds18b20温度芯片、 以及1602液晶显示的&&& 实时时间&& 和&& 实时温度显示 。同时可通过按键 设置 年、月、日、时、分、星期。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 并且可以设置闹钟& 当闹钟时间到时 蜂鸣器持续发出 滴..声 同时led灯不停闪烁&& 且在一分钟内没有按指定停止按键 闹钟将自动停止& 。。。
如果网页上复制的代码不能编译可以从这里下载keil工程:
#include &reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit 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,
uchar num,temp,c,d,time[7],a,b,aa,bb,ns,ng,ys,yg,rs,rg,ss,sg,fs,fg,ms,mg,
/*******************1602************************/
void delay(int z)
&for(x=z;x&0;x--)
&&for(y=100;y&0;y--);&
void write_com(uchar com)&& //写命令
&delay(5);
&delay(5);
void write_data(uchar date)&&&&& //写数据
&delay(5);
&delay(5);
void init()&&&&&&&&& //初始化
&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的延时
&delay1(5);&& &//延时15~60us
&delay1(5);& &//若n=0初始成功 n=1初始失败(可设置返回值查看n是否为1)&
void write_byte(uchar dat)&&& //写入一个字节
&for(i=0;i&8;i++)
&&DQ=dat&0x01;
&&delay1(12);
&&dat&&=1;
&delay1(4);
uchar read_byte()&&& //读入一个字节
&uint k=0;
&uchar value=0;
&for(k=0;k&8;k++)
&&value&&=1;
&&value|=0x80;
&&delay1(4);
uchar read_temp()&&& //读取温度函数
&uchar a=0,b=0;
&write_byte(0xcc);
&write_byte(0x44);
&delay1(200);
&write_byte(0xcc);
&write_byte(0xbe);
&a=read_byte(); &
&b=read_byte();
&b+=(a&0xf0)&&4;&
/***********************1302**********************/
void wirte_byte1(uchar date)&&& //写入一个字节
&for(i=8;i&0;i--)
&&IO=date&0x01;
&&date=date&&1;
uchar read_byte1()&&&&& &//读一个字节
&uchar dat,i;
&for(i=8;i&0;i--)
&&dat=dat&&1;
&&dat=dat|0x80;
&return(dat);
void write_ds1302(uchar add,uchar date)&&& &//将数据写入1302中
&wirte_byte1(add);
&wirte_byte1(date);
uchar read_ds1302(uchar add)& //读出1302中数据
&wirte_byte1(add);
&temp=read_byte1();
&return (temp);
uchar huan_BCD(uint z)&& //将数据 转换成BCD
&uint a,b;
&return (a);
void xian_shi()&&&&& &//液晶显示函数
&if(b==0&a==0)
&&ms=time[0]/16;
&&mg=time[0]%16;
&&fs=time[1]/16;
&&fg=time[1]%16;
&&fen=fs*10+
&&ss=time[2]/16;
&&sg=time[2]%16;
&&shi=ss*10+
&&rs=time[3]/16;
&&rg=time[3]%16;
&&ri=rs*10+
&&ys=time[4]/16;
&&yg=time[4]%16;
&&yue=ys*10+
&&ns=time[6]/16;
&&ng=time[6]%16;
&&nian=ns*10+
&&xing=time[5];&
&if(a==1|b==1)
&&ss=shi/10;
&&sg=shi%10;
&&write_com(0x80+0x41);
&&write_data(0xff);
&&write_com(0x80+0x40);&& &
&&write_data(table[ss]);
&&write_com(0x80+0x41);&& &
&&write_data(table[sg]);
&if(a==2|b==2)
&&fs=fen/10;
&&fg=fen%10;
&&write_com(0x80+0x44);
&&write_data(0xff);
&&write_com(0x80+0x43);&& &
&&write_data(table[fs]);
&&write_com(0x80+0x44);&& &
&&write_data(table[fg]);
&&rs=ri/10;
&&rg=ri%10;
&&write_com(0x80+0x0d);
&&write_data(0xff);
&&write_com(0x80+0x0c);&& &
&&write_data(table[rs]);
&&write_com(0x80+0x0d);&& &
&&write_data(table[rg]);
&&ys=yue/10;
&&yg=yue%10;
&&write_com(0x80+0x0a);
&&write_data(0xff);
&&write_com(0x80+0x09);&& &
&&write_data(table[ys]);
&&write_com(0x80+0x0a);&& &
&&write_data(table[yg]);
&&ns=nian/10;
&&ng=nian%10;
&&write_com(0x80+0x07);
&&write_data(0xff);
&&write_com(0x80+0x06);&& &
&&write_data(table[ns]);
&&write_com(0x80+0x07);&& &
&&write_data(table[ng]);
&&write_com(0x80+0x0f);
&&write_data(0xff);
&&write_com(0x80+0x0f);&& &
&&write_data(table[xing]);
&&write_com(0x80+0x06); //在液晶第一行第七八位显示& 年& &
&&write_data(table[ns]);
&&write_com(0x80+0x07);&& &
&&write_data(table[ng]);
&&write_com(0x80+0x08);&& &
&&write_data('-');
&&write_com(0x80+0x09); //在液晶第一行第十十一位显示& 月& &
&&write_data(table[ys]);
&&write_com(0x80+0x0a);&& &
&&write_data(table[yg]);
&&write_com(0x80+0x0b);&& &
&&write_data('-');
&&write_com(0x80+0x0c); //在液晶第一行第十三 十四位显示& 日& &
&&write_data(table[rs]);
&&write_com(0x80+0x0d);&& &
&&write_data(table[rg]);
&&write_com(0x80+0x0f);&& //在液晶第一行第十七位显示& 星期&
&&write_data(table[xing]);
&&write_com(0x80+0x40);&& //在液晶第二行第二三位显示&&& 时&
&&write_data(table[ss]);
&&write_com(0x80+0x41);&& &
&&write_data(table[sg]);
&&write_com(0x80+0x42);&& &
&&write_data(':');
&&write_com(0x80+0x43);&& //在液晶第二行第五六位显示& 分&
&&write_data(table[fs]);
&&write_com(0x80+0x44);&& &
&&write_data(table[fg]);
&&write_com(0x80+0x45);&& &
&&write_data(':');
&&write_com(0x80+0x46);&& //在液晶第二行第八九位显示& 秒&
&&write_data(table[ms]);
&&write_com(0x80+0x47);&& &
&&write_data(table[mg]);
void keyscan()&&& //按键设置函数& 可任意设置年月日时分秒星期的数值
&if(key4!=0)
&&if(key1==0)&& //key1按键 选择需设置的位
&&&if(key1==0)
&&&&delay(1);
&&&&&&&& while(!key1)
&&&{&&&&&&
&&&&delay(1);
&&&}&&&& &&
&&if(a!=0)
&&&if(key2==0)&&& //key2按键 可将需设置的数 调大
&&&&if(a==1)
&&&&&shi++;
&&&&&if(shi&=24)
&&&&&&shi=0;
&&&&if(a==2)
&&&&&fen++;
&&&&&if(fen&=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&0)
&&&&&&shi=23;
&&&&if(a==2)
&&&&&fen--;
&&&&&if(fen&0)
&&&&&&fen=59;
&&&&if(a==3)
&&&&&ri--;
&&&&&if(ri&1)
&&&&&&ri=31;
&&&&if(a==4)
&&&&&yue--;
&&&&&if(yue&1)
&&&&&&yue=12;
&&&&if(a==5)
&&&&&nian--;
&&&&&if(nian&0)
&&&&&&nian=99;
&&&&if(a==6)
&&&&&xing--;
&&&&&if(xing&1)
&&&&&&xing=7;
&&&if(a==7)&&&&&& //当按下key1 7次后& 将个数据写入1302&
&&&&write_dse,0x00); &&//WP=0 写操作
&&&&write_ds,0x00);&&&//0x80是写秒数据&
&&&&write_ds,huan_BCD(fen));&//0x82是写分数据&
&&&&write_ds,huan_BCD(shi));&//0x84是写时数据
&&&&write_ds,huan_BCD(ri));&//0x84是写日数据
&&&&write_ds,huan_BCD(yue));&//0x84是写月数据
&&&&write_dsa,huan_BCD(xing));&//0x84是写星期数据
&&&&write_dsc,huan_BCD(nian));&//0x84是写年数据
&&&&write_dse,0x80); &&//WP=1 写保护& &&
void naozhong()&&&&& //通过按键设置闹钟& 时 分
&if(key1!=0)
&&if(key4==0)
&&&if(key4==0)
&&&&delay(1);
&&&&&&&& while(!key4)
&&&{&&&&&&
&&&&delay(1);
&&if(b!=0)
&&&if(key2==0)&&& //key2按键 可将需设置的数 调大
&&&&if(b==1)
&&&&&shi++;
&&&&&if(shi&=24)
&&&&&&shi=0;
&&&&if(b==2)
&&&&&fen++;
&&&&&if(fen&=60)
&&&&&&fen=0;
&&&if(key3==0)&&& //key3按键 可将需设置的数 调小
&&&&if(b==1)
&&&&&shi--;
&&&&&if(shi&0)
&&&&&&shi=23;
&&&&if(b==2)
&&&&&fen--;
&&&&&if(fen&0)
&&&&&&fen=59;
&&&aa=huan_BCD(shi);&& //将设置的时钟 赋值给aa
&&&bb=huan_BCD(fen);&//将设置的分钟 赋值给bb
&&&if(b==3)&&&&&& //当按下key4 3次后 闹钟设置完成&
void main()
&TMOD=0x10;
&TH1=()/256;
&TL1=()%256;
&&temp=0x81;&&&&&&&&& //读的初始地址&&&&&&&&&&&&&&&&&&&
&&&&&&& for(i=0;i&7;i++)&&&&&&&&&&&& //分别把秒分时日月年星期数据读出分7次读好一次地址加2& temp+=2;&
&&&&&&&& time[i]=read_ds1302(temp);
&&&&& temp+=2;
&&if(bb==time[1]&aa==time[2]&!time[0])& //如果读出来的时钟 分钟与1302读出来的值相等且读出来的秒钟为零时 进入中断
&&&flag=1;&& //标志位设置为1
&&if(key3==0)&& //进入闹钟后 可由key3按下 停止中断 标志位置零 允许调时闹钟设置按键动作 停止闹铃
&&&flag=0;
&&&&&&& if(flag!=1)&& //当进入闹钟中断后 调时与设置闹钟的按键& 无效
&&&&&&&& naozhong();
&&&keyscan();
&&xian_shi();
&&temp=read_temp();
&&write_com(0x80+0x49);&& &
&&write_data(table[temp/10]);&&& //在液晶第二行第十位显示温度的十位
&&write_com(0x80+0x4a);&&
&&write_data(table[temp%10]);&&& //在液晶第二行第十一位显示温度的个位
&&write_com(0x80+0x4c);&& &
&&write_data(table[(d&0x0f)*625/1000]);&& //在液晶第二行第十三位显示温度的小数点后一位
&&write_com(0x80+0x4d);&& &
&&write_data(table[(d&0x0f)*625/100%10]);&& //在液晶第二行第十四位显示温度的小数点后二位&
void timer1() interrupt 3&&&& //定时器&
&TH1=()/256;
&TL1=()%256;
&spk=0;&&&&& //蜂鸣器& 发出 滴答 声
&led=!&&&&& //发光二极管& 不停闪烁
&delay1(10);
&if(t==1120)&&& //约1分钟后 闹钟自动停止 标志位
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved51单片机电子时钟设计报告_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
23页3下载券9页2下载券22页1下载券46页2下载券4页1下载券51页3下载券8页3下载券25页2下载券
喜欢此文档的还喜欢14页免费20页免费36页3下载券30页免费53页1下载券
51单片机电子时钟设计报告|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢电子时钟课程设计,基于51单片机的DS18B20数字温度计的_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
28页免费13页免费17页免费13页免费35页免费27页免费18页免费50页3下载券32页2下载券
喜欢此文档的还喜欢38页5下载券4页免费4页免费25页免费24页5下载券
电子时钟课程设计,基于51单片机的DS18B20数字温度计的|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢}

我要回帖

更多关于 电子时钟课程设计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信