毕业设计-基于AT89C51单片机的实时时钟设计.docx_第1页
毕业设计-基于AT89C51单片机的实时时钟设计.docx_第2页
毕业设计-基于AT89C51单片机的实时时钟设计.docx_第3页
毕业设计-基于AT89C51单片机的实时时钟设计.docx_第4页
毕业设计-基于AT89C51单片机的实时时钟设计.docx_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机at89c51实时时钟设计基于at89c51单片机的实时时钟设计学号姓名一系统分析本电路是由at89c51单片机为控制核心,具有在线编程功能,低功耗,能在4.5v超低压工作;显示部分用lcd1602实现,能够同时显示16x02即32个字符;闹钟部分由蜂鸣器构成,蜂鸣器是一种一体化结构的电子讯响器;时钟电路由ds1302提供,它是一种高性能、低功耗、带ram的实时时钟电路,可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5v5.5v.采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个318的用于临时性存放数据的ram 寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本设计中为ds1302增加了备用电池,当主电源掉电时,备用电池自动为其供电;温度的采集由ds18b20构成;当闹铃时间到时,通过蜂鸣器播放闹铃铃声。二.系统功能框图的设计三.系统硬件设计 本设计采用的元器件如下:单片机at89c51lm016lds1302晶振crystal ds18b2024c02c电容cap电解电容cap-elec电阻res排阻respack-8按键button四.系统软件设计(流程图和软件设计) 主程序流程图时间调整程序流程图定时闹铃程序流程图44c程序:#include #include intrins.h#include 24c02.h#define uchar unsigned char#define uint unsigned int/闹钟显示缓冲区code uchar alarm_one= hello,l.w hou;code uchar alarm_two=good morning hlw;code uchar w1=0x01,0x03,0x1d,0x11,0x1d,0x03,0x01,0x00;code uint cyc=1800,1600,1440,1351,1200,1079,960;/音阶1-7的半周期数code uchar tone=13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13, 13,15,16,16,15,16,13,12,12,15,13,12,13,12,11,12,6,6,12,15,13,12,6,6,15,13,12,13,12,11,12,6,5,6,0xff;/ 乐曲康定情歌的简谱表code uchar time=8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,8,8,12,4,8,8,4,4,4,4,8,24,8,24,8,24,8,16,8,8,8,4,4,4,4,8,16,8,32;/ 节拍表uchar h0,l0,cnt;uchar code tabe1=20 - - ; /液晶一直显示的字符uchar code tabe2= : : ;uchar code tabe3=alarm set:;uchar miao,fen,shi,nian,yue,ri,week,wendu_shi,wendu_ge,wendu_shu,variate,alarm_shi,alarm_fen,alarm_miao;uchar flag=1,count=0,flag_up=0,flag_down=0,flag_alarm=0,alarm_on,alarm_count=0,done=0;uint wendu;/定义iosbit dq = p10; /ds18b20温度传送数据io口sbit ds1302_rst = p11; /1302复位sbit ds1302_io = p12; /数据输入输出sbit ds1302_sclk= p13; /串行时钟sbit alarm_out = p36;sbit lcd1602_rs = p20; / 1602命令、数据选择sbit lcd1602_rw = p21; / 1602写sbit lcd1602_e = p22; / 1602使能sbit set = p24;/选择按键sbit up = p25;/加sbit down= p26;/减sbit nao = p27;sbit acc0=acc0;sbit acc7=acc7;sbit mode=p32;/延时void delay(uchar x) uchar y,z; for(z=x;z0;z-) for(y=110;y0;y-);void delay1() _nop_(); _nop_();void delay2(uint ms) uint i,j; for (j=0;jms;j+) for (i=0;i0;i-) dq=0; if(dat&0x01=0x01) dq=1; else dq=0; ds18b20_delay(5); dq=1; ds18b20_delay(1); dat=1; uchar read_onechar()/读一字节uchar value=0,i;for(i=8;i0;i-) value=1; dq=0; ds18b20_delay(1); dq=1; if(dq=1) value|=0x80; else value&=0x7f; ds18b20_delay(4); return value;uint read_wendu() /ds18b20读温度 uchar a=0,b=0; uint wen=0x0000; ds18b20_init();/初始化 write_onechar(0xcc);/ 跳过读序号列号的操作 write_onechar(0x44);/ 启动温度转换 ds18b20_delay(150); ds18b20_init();/初始化 write_onechar(0xcc);/跳过读序号列号的操作 write_onechar(0xbe);/读取温度寄存器等(共可读9个寄存器) 前两个就是温度 ds18b20_delay(150); b=read_onechar();/读取温度值低位 a=read_onechar();/读取温度值高位 wen=a; wen=(wen0;k-) ds1302_io=acc0; ds1302_sclk=0; /拉低sclk ds1302_sclk=1; /拉高sclk acc=1; uchar read_byte() uchar k; for(k=8;k0;k-) acc7=ds1302_io; ds1302_sclk=1; /拉高sclk ds1302_sclk=0; /拉低sclk acc=1; return acc; void ds1302_write(uchar add,uchar date) ds1302_rst=0; ds1302_sclk=0; /在rst没拉高之前先把sclk置0 ds1302_rst=1; write_byte(add); write_byte(date); ds1302_sclk=1; ds1302_rst=0;uchar ds1302_read(uchar add) uchar temp; ds1302_rst=0; ds1302_sclk=0; /在rst没拉高之前先把sclk置0 ds1302_rst=1; write_byte(add); temp=read_byte(); ds1302_sclk=1; ds1302_rst=0; return temp;void ds1302_init() /ds1302初始化 ds1302_rst=0; ds1302_sclk=1; ds1302_write(0x8e,0x00);/写允许 ds1302_write(0x80,0x58); ds1302_write(0x82,0x56); ds1302_write(0x84,0x09); ds1302_write(0x86,0x12); ds1302_write(0x88,0x05); ds1302_write(0x8a,0x05); ds1302_write(0x8c,0x12); ds1302_write(0x8e,0x80);/写保护 /*lcd1602*/void lcd_write_com(uchar com) /命令字写入lcd单元中 lcd1602_rw=0; delay1(); lcd1602_rs=0; / rw=1,rs=0,写lcd命令字 delay1(); p0=com; /将com中的命令字写入lcd数据口 delay1(); lcd1602_e=1; /e端时序 delay1(); lcd1602_e=0; delay1(); lcd1602_rw=1; delay(5);void lcd_write_date(uchar date) /数据写入lcd单元中 lcd1602_rw=0; delay1(); lcd1602_rs=1; / rw=0,rs=1,写lcd命令字 delay1(); lcd1602_e=1; / e端时序 delay1(); p0=date; / 将dat中的显示数据写入lcd数据口 delay1(); lcd1602_e=0; delay1(); lcd1602_rw=1; delay(5);void lcd1602_init() /lcd初始化函数 uchar lcdnum; p3=0xdf; lcd_write_com(0x38); lcd_write_com(0x0c); lcd_write_com(0x06); lcd_write_com(0x01); lcd_write_com(0x80); for(lcdnum=0;lcdnum8;lcdnum+) /写第一行数据 lcd_write_date(tabe1lcdnum); delay(2); lcd_write_com(0x80+0x40); /写入第二行数据 for(lcdnum=0;lcdnum4; decimal=decimal*10+(bcd&=0x0f); return decimal; void wendu_decimal(uint dat) /温度转换后送显示 float temp; temp=dat*0.625; /dat*0.0625*10 wendu_shi=temp/100; /取十位 temp除不用定义类型 wendu_ge =(uint)temp)%100/10; /取个位 temp求模要定义类型,为 /16位,故定义uint wendu_shu=(uint)temp)%100%10; /取小数 lcd_write_com(0x80+0x40+10); /送显示 lcd_write_date(0x30+wendu_shi); lcd_write_date(0x30+wendu_ge); lcd_write_date(0x2e); lcd_write_date(0x30+wendu_shu); lcd_write_date(0xdf); /温度符号 lcd_write_date(0x43);void write_week(uchar we) /星期送显示 lcd_write_com(0x80+0x0d); switch(we) case 1: lcd_write_date(m); lcd_write_date(o); lcd_write_date(n); break; case 2: lcd_write_date(t); lcd_write_date(u); lcd_write_date(e); break; case 3: lcd_write_date(w); lcd_write_date(e); lcd_write_date(d); break; case 4: lcd_write_date(t); lcd_write_date(h); lcd_write_date(u); break; case 5: lcd_write_date(f); lcd_write_date(r); lcd_write_date(i); break; case 6: lcd_write_date(s); lcd_write_date(a); lcd_write_date(t); break; case 7: lcd_write_date(s); lcd_write_date(u); lcd_write_date(n); break; void lcd_write_com1(uchar com,bit rs) /命令字写入lcd单元中 lcd1602_rs=rs; lcd1602_rw=0; / rw=1,rs=0,写lcd命令字 p0=com; delay1(); delay1(); /将com中的命令字写入lcd数据口 lcd1602_e=0; delay1(); delay1(); lcd1602_e=1; /e端时序 delay1(); delay1(); lcd1602_e=0; delay1(); delay1();/*lcd1602闹钟显示函数*/ void display_1602_alarm() uchar i,j,k; p3=0xdf; lcd_write_com(0x38); lcd_write_com(0x0c); lcd_write_com(0x06); lcd_write_com(0x01); lcd_write_com(0x80); /液晶显示位置 delay2(5); for (i=0;isizeof(alarm_one)-1;i+) lcd_write_date(alarm_onei); delay2(5); lcd_write_com1(0x40,0);lcd_write_com1(0x40,0);for(j=0;j8;j+)lcd_write_com1(w1j,1);lcd_write_com1(0x80+0x0f,0);lcd_write_com1(0x00,1);lcd_write_com(0x80+0x40); /液晶显示位置delay2(5);for (k=0;ksizeof(alarm_two)-1;k+) lcd_write_date(alarm_twok);delay2(5); /*按键处理*/uchar key_bcd(uchar key_decimal) /转成ds1302所需的bcd码 uchar temp; temp=(key_decimal/10)&0x0f)59) miao=0; break; case 2: fen+; if(fen59) fen=0; break; case 3: shi+; if(shi23) shi=0; break; case 4: week+; if(week7) week=1; break; case 5: ri+; if(ri31) ri=1; break; case 6: yue+; if(yue12) yue=1; break; case 7: nian+; if(nian99) nian=0; break; if(down=0) /减键处理 delay(2); flag_down=1; /减 更新标志 while(!down); switch(count) case 1: miao-; if(miao=255) miao=59; break; case 2: fen-; if(fen=255) fen=59; break; case 3: shi-; if(shi=255) shi=23; break; case 4: week-; if(week1) week=7; break; case 5: ri-; if(ri1) ri=31; break; case 6: yue-; if(yue1) yue=12; break; case 7: nian-; if(nian=255) nian=9

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论