单片机多功能数字电子时钟设计毕业设计论文(编辑修改稿)内容摘要:

16 第四章 系统的软件设计 程序流程框图和程序概述 DS1302 时钟芯片具有通电自动计时的功能。 向 DS1302 中写入一个初值,如写入20xx0501 00: 00: 00 ,星期日,在通电时,时间就会自动走,过 60 秒分加 1,过60 分时加 1,过 24 小时天加 1,星期日变成星期一,一周有 7天, 7天一循环,芯片能够自动判断每月有多少天, 5 月有 31 天, 31 天后,月加 1。 采用 DS1302 时钟芯片的单片时钟就能一直精准的走下去。 调整时间日期,实质就是向 DS1302 时钟芯片重新写入初值。 电子时钟的主程序框图如图 41所示。 图 41 主程序流程图 开始 初始化 读写日期、时间和温度 分离日期、时间和温度显示值值 显示子程序 时间修改子程序 日期修改子程序 显示结果 返回 开关控制子程序 单片机多功能数字电子时钟设计 17 图 42 时间调整程序流程图 , 单片机多功能数字电子时钟设计 18 图 43 温度闹钟设置报警流程图 图 44 日期设置流程图 单片机多功能数字电子时钟设计 19 延时函数 void delay(uint z) { uint x,y。 for(x=z。 x0。 x) for(y=110。 y0。 y)。 } 由 for 循环构成的延时函数 ,z 的取值为这个函数的延时 ms 数,如 delay(200)。 大约延时 200ms. delay(500)。 大约延时 500ms。 因下文多次用到,固在此先作 说明。 对 DS1302 读写操作函数。 在对 DS1302 时钟芯片操作前,应对其操作时序有所了解,参看前文 DS1302 介绍。 DS1302 采用串行方式与单片机进行通信,一个机器周期只能读写一个字节的一位,因此在单片机与 DS1302 芯片间传输一字节, 8 位数据要分 8 次进行且先从低位开始传输。 向 DS1302 写数据 /***************************写数据字节子函数 **************************/ void write_1302_byte(uchar temp)//用来发送 8 位数据信息 { uchar i。 for(i=0。 i8。 i++)//循环 8 次 写入数据 { sck=0。 sda=tempamp。 0x01。 //每次传输低字节 temp=1。 //右移一位 sck=1。 //在 SCK 上升沿的时候字节写入 DS1302 } } /*************************1302 写数据子函数 **************************/ void write_1302(uchar addd,uchar dat) { rst=0。 _nop_()。 sck=0。 _nop_()。 rst=1。 _nop_()。 write_1302_byte(addd)。 //发送地址 write_1302_byte(dat)。 //发送数据 rst=0。 } 从 DS1302 读数据 /***************************读 DS1302 数据函数 *************************/ 单片机多功能数字电子时钟设计 20 uchar read_1302(uchar add)//输入地址 add,返回读取的数据 { uchar i,temp=0x00。 rst=0。 sck=0。 rst=1。 write_1302_byte(add)。 for(i=0。 i8。 i++)//循环 8 次读取 { if(sda) temp|=0x80。 // temp=temp|0x80 sck=0。 temp=1。 //右移一位 sck=1。 //sck 0 } rst=0。 //以下为 DS1302 复位的稳定时间 sck=0。 sck=1。 sda=0。 sda=1。 return(temp)。 //将 temp 值返回 } 显示函数 对 1602 进行操作前要对其进行初使化,初使化完成后它才能正常显示。 如果想在 1602 液晶的某一个位置显示一个内容,要先对其写入一个指令,在什么地方显示。 然后再对其写入一个数据,要显示什么内容。 对 1602 的液晶初使化,需要用写入指令的方式完成。 1602 液晶中写一个指令 void write_(uchar ) { lcdwr=0。 //lcdwr lcdwr=0,这里可不写 lcdrs=0。 //液晶 rs 接口为 0 时 , rs 为 1时写数据 P0=。 //将要写的指令赋给 P0 delay(5)。 //由 1602 P0 lcden=1。 端 lcden lcden delay(5)。 就写入到 LCD 了 lcden=0。 } void write_data(uchar date) lcdrs 设为 1 { lcdrs=1。 单片机多功能数字电子时钟设计 21 P0=date。 delay(5)。 lcden=1。 delay(5)。 lcden=0。 } 1602 液晶 此函数首先对液晶进行初使化,使其处于待命状态,然后将时钟框架显示出来:年、月、日、之间的“ — void init_1602() { uchar num。 lcdwr=0。 lcden=0。 write_(0x38)。 //设置 LCD 为 16*2 显示、 5*7 点阵、 8 位数据接口模式 write_(0x0c)。 //开显示、不显示光标 write_(0x06)。 //写一个字符后 1 write_(0x01)。 //显示清 0 write_(0x80)。 //将指针指向初始位置 for(num=0。 num14。 num++)// 20 写入液晶 write_data(table[num])。 write_(0x80+0x40+4)。 //将指针指向 1602 for(num=0。 num8。 num++)// : : 写入 write_data(table1[num])。 } 如何在液晶上显示时间、日期及周 DS1302 中的时间、日期等信息是以 BCD 码的形式存放的,要先将从 1302 中读取的数据转化成 10 进制,然后显示在液晶上相应的位置。 /***************************显示时间、日期子函数 ***********************/ void write_sfm(uchar add,uchar time)//用于在 1602 上显示年、月、日、时、分、秒。 { Add time 为要显示的内容 uchar shi,ge。 shi=time/16。 //将从 DS1302 中读取的 BCD 码数据转化成 10 进制个位和 10 ge=time%16。 进制十位 write_(add+0x80)。 //定义显示在液晶的什么位置 write_data(0x30+shi)。 //由 1602 0~9 的数据码分别对应 0x30~0x39 write_data(0x30+ge)。 // 1 } 不用重 新光标定位 /**************************显示周子函数 *******************************/ void write_zhou(uchar time1) 1602 { 时间日期子函数类似 uchar ge。 ge=time1%16。 // 单片机多功能数字电子时钟设计 22 write_(0x80+13)。 write_data(0x30+ge)。 } 按键函数 此电子时钟共有 4 S S S3 与调时有关图按键程序如图 11 S4为 12小时切换键 S1 功能键:在 24 S2 1 S3 期写入 DS1302 S4 显示模式调整键:用于对时间的 12/24 小时模式的切换 12/24 小时 显示模式切换键 时钟默认在 24 flag1。 第一次按下切换键把瞬时时间转化成 12 flag1=1。 并写入 DS1302 DS1302 芯片在 12 小时模式下24 小时显示模式, 令 flag1=0,把瞬时时间转化成 24小时模式并写入 DS1302 芯片。 有关 DS1302 的时间寄存器存放形式参阅前文。 如 24 小时模式下的 22:00, 存放的形式为00100010。 12 小时模式下的 22 点, 也就是 10:00PM, 存放形式为 10110000,在切换的一瞬间, 我 们只需要把小时数据 0xb0 写入到 DS1302, 这样就能让时钟芯片在 12 小时模式下运行了。 需要注意的是, 12 小时模式下, 只用到后 5 位来表示时间, 第 6 位用来表示AM 或 PM信息, 如果真接用 24 小时模式下的显示方法是会出错的, 这里我们需要对时进行转化。 首先提取 AM/PM 信息, 让其显示。 然后提取其后 5 位时间, 显示时间。 在主函数部分如果检测到 flag1=1, 就进行转换。 12 转 24 小进模式与其类似, 不再赘述。 if(s1num==0amp。 amp。 s4==0)// 设置键没被按下, 且 12/24 小时模式切换键被按下后 { delay(5)。 if(s4==0) { s2num++。 while(!s4)。 if(s2num==1)//24 小时切换成 12 小时 { int ge,shi。 flag1=1。 hour=read_1302(0x85)。 ge=hour%16。 shi=hour/16。 if(shi=1amp。 amp。 ge=1)//时小于 12 { if(shi==0amp。 amp。 ge==0) hour=0x92。 单片机多功能数字电子时钟设计 23 else { hour=houramp。 0x9f。 hour=hour+0x80。 } } if(shi==1amp。 amp。 ge==2)//12 点 { hour=hour+0x80。 hour=hour+0x20。 } if(shi=1amp。 amp。 ge=3amp。 amp。 ge=9)//13 点 ~19 点 { hour=hour0x12。 hour=hour+0x80。 hour=hour+0x20。 } if(shi==2amp。 amp。 ge==0)//20 点 { hour=0xa8。 } if(shi==2amp。 amp。 ge==1) hour=0xa9。 if(shi==2amp。 amp。 ge==2) { hour=0xb0。 } if(shi==2amp。 amp。 ge==3) hour=0xb1。 write_1302(0x8e,0x00)。 write_1302(0x84,hour)。 write_1302(0x8e,0x80)。 } if(s2num==2)//12 小时切换成 24 小时 { int。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。