




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、机电0902 李刚 学号38 时间日程显示设计程序实验一 设计目标:万年历实现以下三个功能:(1)具有年、月、日、星期、时、分、秒等功能;(2)具备年、月、日、星期、时、分、秒校准功能,具备自动调节闰年的功能;(3)具有与即时时间同步的功能。本电路是以stc89c51单片机为控制核心, 时钟芯片采用ds1302, 具有掉电自动保存功能。可自动对秒、分、时、日、周、月、年进行计数, 显示模块采用1602显示屏,它内置192种字符,可显示32个符号或数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。其工作电压为5v。 一个典型的单片机最小系统一般由时钟电路、复位电路、电源指示灯和外部扩展接口等部分
2、组成。 1时钟电路模块的设计ds1302内含有一个实时时钟/日历和31字节静态ram,通过简单的串行接口与单片机进行通信。图中vcc1为后备电源,vcc2为主电源。ds1302由vcc1或vcc2两者中的较大者供电。所以在主电源关闭的情况下,也能保持时钟的连续运行。x1和x2是振荡源,外接32.768khz晶振用来为芯片提供计时脉冲。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。ds1302的硬件接线图如图2所示:图2时钟芯片ds1302的工作原理:(1) ds1302的控制字节:ds1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds13
3、02中,位6如果为0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(2) 数据输入输出(i/o):在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位7。(3) ds1302的寄存器:ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。“ch”是时钟暂停标志位,当该位为1时,时钟振
4、荡器停止,ds1302处于低功耗状态;当该位为0时,时钟开始运行。“wp”是写保护位,在任何的对时钟和ram的写操作之前,“wp”必须为0。当“wp”为1时,写保护位防止对任一寄存器的写操作。2 独立式键盘设计独立式键盘每个键单独占用一根i/o口线。键盘的工作方式可分为编程控制方式和中断控制方式。cpu在一个工作周期内,利用完成其他任务的空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应的键处理程序。这种方式为编程扫描方式。由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使cpu经常处于工作状态, 在进行本次设计中,只涉及
5、到了选择、加、减、确定四个功能。因此采用独立式键盘。 3 显示模块的设计本设计中 对时间、温度进行显示,液晶显示屏1602模块作为输出。1602字符型lcd通常有14条引脚线或16条引脚线的lcd,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5v电源供电,外围电路配置简单。1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是01000001b(41h),显示时模块把地址41h中的点阵字符图形显示出来,我们就能看到字母“a”。lcd1602引脚功能:1vss一般接地2vdd接电源(+5v)
6、3v0液晶显示器对比度调整端。4rsrs为寄存器选择。5r/wr/w为读写信号线。6ee(或en)端为使能(enable)端,下降沿使能。1602主要管脚介绍:v0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生鬼影使用时可以通过一个10k的电位器调整对比度。rs为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。rw为读写信号线端,高电平时进行读操作,低电平时进行写操作。当rs和rw共同为低电平时可以写入指令或者显示地址;当rs为高电平rw 为低电平时可以写入数据。e为使能端,当e端由高电平跳变成低电平时,液晶模块执行命令。将l1602的r
7、s端和p2.0,r/w端和p2.1, e 端和p2.2相连,当rs=0时,对lcd1602写入指令;当rs=1时,对lcd1602写入数据。当r/w端接高电平时芯片处于读数据状态,反之处于写数据状态,e端为使能信号端。当r/w为高电平,e端也为高电平,rs为低电平时,液晶显示屏显示需要显示的示数。显示模块电路图如图3所示: 功能仿真 图10 电路图图11 键盘调节图12 调节键盘后主程序/ 名称:用ds1302与1602lcd设计的可调式电子日历与时钟/ 说明:本例会自动调节合法日期时间,对于星期的调节会在/ 调整年月日时自动完成,闰年问题也会自动判断。/-#include <reg51
8、.h>#include <string.h>#define uchar unsigned char#define uint unsigned intsbit sda=p10; /ds1302数据线sbit clk=p11; /dsb1302时钟线sbit rst=p12; /ds1302复位线sbit rs=p20; /lcd寄存器选择sbit rw=p21; /lcd读/写控制sbit en=p22; /lcd启用sbit k1=p34; /选择sbit k2=p35; /加sbit k3=p36; /减sbit k4=p37; /确定uchar tcount=0;/一年中
9、每个月的天数,二月的天数由年份决定uchar monthsdays=0,31,0,31,30,31,30,31,31,30,31,30,31;/周日,周一到周六0,1-6 读取ds1302时分别是1-7uchar *week="sun","mon","tus","wen","thu","fri","sat"/lcd显示缓冲uchar lcd_dsy_buffer1="date 00-00-00 "uchar lcd_dsy_buffer
10、2="time 00:00:00 "uchar datetime7; /所读取的日期时间char adjust_index=-1; /当前调节的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)uchar change_flag="-mhdm-y" /(分,时,日,月,年)(不调节秒周)/延时,向ds1302写、读一字节以及从ds1302指定位置度、写数据的程序/延时-void delayms(uint x)uchar i;while(x-) for(i=0;i<120;i+);/向ds1302写入一个字节void write_a_byte
11、_to_ds1302(uchar x)uchar i;for(i=0;i<8;i+)sda=x&1; clk=1; clk=0; x>>=1;/从da1302读取一字节-uchar get_a_byte_from_ds1302()uchar i,b,t;for(i=0;i<8;i+)b>>=1;t=sda;b|=t<<7;clk=1;clk=0;/bcd码转换return b/16*10+b%16;/从ds1302指定的位置读数据-uchar read_data(uchar addr)uchar dat;rst=0;clk=0;rst=1
12、;write_a_byte_to_ds1302(addr);dat=get_a_byte_from_ds1302();clk=1;rst=0;return dat;/向ds1302某地址写入数据-void write_ds1302(uchar addr,uchar dat)clk=0;rst=1;write_a_byte_to_ds1302(addr);write_a_byte_to_ds1302(dat);clk=0;rst=0;/-/-设置时间-void set_ds1302()uchar i;write_ds1302(0x8e,0x00);/写控制字,取消写保护for(i=1;i<
13、7;i+) /分时日月年依次写入/分的起始地址10000010(0x82),后面续依次是时,日,月,周,年,写入地址每次递增2 write_ds1302(0x80+ 2*i,(datetimei/10<<4)|(datetimei%10); write_ds1302(0x8e,0x80);/加保护/-/读取当前日期时间/-void gettime()uchar i;for(i=0;i<7;i+)datetimei=read_data(0x81+2*i);/- /1602lcd的若干显示控制代码。/uchar read_lcd_state() 读lcd状态uchar read_
14、lcd_state()uchar state;rs=0;rw=1;en=1;delayms(1);state=p0;en=0;delayms(1);return state;/void lcd_busy_wait() 忙等待void lcd_busy_wait()while(read_lcd_state()&0x80)=0x80);delayms(5);/void write_lcd_data(uchar dat) 向lcd写数据void write_lcd_data(uchar dat) lcd_busy_wait(); rs=1;rw=0;en=0;p0=dat;en=1;dela
15、yms(1);en=0;/void write_lcd_command(uchar cmd) 写lcd指令void write_lcd_command(uchar cmd)lcd_busy_wait();rs=0;rw=0;en=0;p0=cmd;en=1;delayms(1);en=0;/void init_lcd() lcd初始化void init_lcd()write_lcd_command(0x38);delayms(1);write_lcd_command(0x01);delayms(1);write_lcd_command(0x06);delayms(1);write_lcd_co
16、mmand(0x0c);delayms(1);/void set_lcd_pos(uchar p) 设置液晶显示位置void set_lcd_pos(uchar p)write_lcd_command(p|0x80);/-/在lcd上显示字符串void display_lcd_string(uchar p,uchar *s)uchar i;set_lcd_pos(p);for(i=0;i<16;i+)write_lcd_data(si); delayms(1);/-/日期与时间值转换为数字字符void format_datetime(uchar d,uchar *a)a0=d/10+
17、39;0'a1=d%10+'0'/-/判断是否为闰年uchar isleapyear(uint y)return(y%4=0&&y%100!=0)|(y%400=0);/-/求自2000.1.1开始的任何一天是星期几/函数没有通过,求出总天数后再求星期几,/因为求总天数可能会超越uint的范围。void refreshweekday()uint i,d,w=5;/已知1999.12.31是周五for(i=2000;i<2000+datetime6;i+)d=isleapyear(i)?366:365;w=(w+d)%7;d=0;for(i=1;i&
18、lt;datetime4;i+) d+=monthsdaysi;d+=datetime3;/保存星期,06表示星期日至周六,为了与ds1302的星期格式匹配,返回值需要加1datetime5=(w+d)%7+1;/-void datetime_adjust(char x)switch(adjust_index)case 6:/年00-99 if(x=1&&datetime6<99) datetime6+; if(x=-1&&datetime6>0) datetime6-; /获取2月天数 monthsdays2=isleapyear(2000+dat
19、etime6)?29:28; /如果年份变化后当前月份的天数大于上限则设为上限 if(datetime3>monthsdaysdatetime4) datetime3=monthsdaysdatetime4; refreshweekday();/刷新星期 break;case 4:/月01-12 if(x=1&&datetime4<12) datetime4+; if(x=-1&&datetime4>1)datetime4-; /获取2月天数 monthsdays2=isleapyear(2000+datetime6)?29:28; /如果月份
20、变化后当前月份的天数大于上限则设为上限 if(datetime3>monthsdaysdatetime4) datetime3=monthsdaysdatetime4; refreshweekday();/刷新星期 break; case 3:/日00-28/29/30/31;调节之前首先根据年份得出该年中2月的天数 monthsdays2=isleapyear(2000+datetime6)?29:28; /根据当前月份决定调节日期的上限 if(x=1&&datetime3<monthsdaysdatetime4) datetime3+; if(x=-1&
21、&datetime3>0) datetime3-; refreshweekday();/刷新星期 break; case 2:/时 if(x=1&&datetime2<23) datetime2+; if(x=-1&&datetime2>0) datetime2-; break;case 1:/分 if(x=1&&datetime1<59) datetime1+; if(x=-1&&datetime1>0) datetime1-; break; /-/定时器0每秒刷新lcd显示void t0_
22、int() interrupt 1th0=-50000/256;tl0=-50000%256;if(+tcount!=2) return;tcount=0;/按指定的格式生成待显示的日期时间串format_datetime(datetime6,lcd_dsy_buffer1+5);format_datetime(datetime4,lcd_dsy_buffer1+8);format_datetime(datetime3,lcd_dsy_buffer1+11);/星期strcpy(lcd_dsy_buffer1+13,weekdatetime5-1);/时分秒format_datetime(datetime2,lcd_dsy_buffer2+5);format_datetime(datetime1,lcd_dsy_buffer2+8);format_datetime(datetime0,lcd_dsy_buffer2+11);/显示年月日,星期,时分秒display_lcd_string(0x00,lcd_dsy_buffer1);display_lcd_string(0x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨平台测试挑战-深度研究
- 高性能数据库连接技术-深度研究
- 贴片机微纳化发展-深度研究
- 蛲虫病与女性生殖健康-深度研究
- 高清影像处理与优化-深度研究
- 移动互联网环境下的客户关系管理系统设计-深度研究
- 金融科技监管合规性研究-深度研究
- 高速列车结构强度与耐久性研究-深度研究
- 第25章 第3节 《远离烟酒 拒绝毒品》教学设计-2024-2025学年初中生物八年级下册同步教学(苏科版)
- 2025年绵阳飞行职业学院单招职业技能测试题库及答案1套
- DB51∕T 938-2009 草原鹰架招鹰控鼠技术规程
- 土木工程建筑工程毕业设计办公楼
- 中国工艺美术史资料(田自秉)课件
- 施工现场防汛安全检查表
- 定子中心偏差及圆的调整
- AFM-原子力显微镜简介
- 实用的尺寸公差等级一览表
- 骨质疏松症ppt课件
- 陶瓷过滤机使用说明书(新)
- 申通快递淘宝物流公章证明
- CPK 能力分析模板
评论
0/150
提交评论