ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:388.71KB ,
资源ID:3713212      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3713212.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(武汉理工单片机万年历课程设计.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

武汉理工单片机万年历课程设计.docx

1、武汉理工单片机万年历课程设计1 DS1302实时时钟(1) 时钟芯片DS1302的工作原理: DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序图如图1.1所示。为DS1302的控制字,此控制字的位7必须置1,若为0则不能对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表-2为DS1302的日历、时间寄存器内容:“CH”是时钟

2、暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。(2) DS1302的控制字节DS1302的控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出表-1 DS1302的控制字格式 RAM RD 1

3、A4 A3 A2 A1 A0 / CK /WR (3) 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图1所示 图1.1 DS1302读/写时序图(4) DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表-2。表-2 DS1302的日历、时间寄存器 写寄存器读寄存器Bit7Bit6Bit5Bit4Bit3Bit2

4、Bit1Bit080H81HCH10秒秒82H83H10分分84H85H12/010时时/PM86H87H0010日日88H89H00010月月8AH8BH00000星期8CH8DH10 年年8EH8FHWP0000000 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次

5、性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 2 方案论证与设计2.1控制器部分方案设计 硬件控制电路主要用了AT89C52芯片处理器、1602LCD显示器、DS1302实时时钟、DB18B20温度传感器。根据各自芯片的功能互相连接成电子万年历的控制电路。软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及温度显示程序等组成。设计框图如图2.1所示图2.1 框图设计2.2 显示部分的方案论证方案一:采用8段数码管虽经济实惠,但操作比液晶显示来说略显繁琐。方案二:液晶显示方式。液晶显示效果出众,可以运用菜单项来方便操作,比较简单,所以,最后选择液晶显示方案

6、。显示电路图如图2.2所示。图2.2 液晶显示电路2.3 实时时钟电路设计 图2.3是 DS1302与单片机的连接,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。图2.3 DS1302时钟电路2.4 温度采集模块设计如图2.4所示,采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要

7、一条数据线进行数据传输,使用P3.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。 图2.4 DS18B20温度采集模块2.5 功能按钮设计当按钮被按下时,该按钮对应的I/O口被拉为低电平,松开时按钮对应的I/O口由内部的上拉电阻将该I/O拉为高电平,如图2.5所示:图2.5 键盘电路设计2.6 总体电路图3 软件设计流程3.1 系统总流程图 系统总体流程图如图3.1所示,系统流程图设计分析如下:首系统初始化,系统运行,当有设置键按下时进入时间修改模式,无按键按下时读取时间温度等数据送入显示器显示。在时间修改模式下设置时间完成后再将时间送入显示器显示。 图3.1 系统

8、流程图3.2 温度程序流程图 温度读取程序流程图如图3.2所示。流程图分析:开始进入初始化DS18B20,就是通过主机拉低单线产生复位脉冲然后释放总线,如果有应答就发起ROM命令,当成功执行操作命令后,就使用温度转换,当温度转换完成后又初始化DS18B20是否有应答脉冲,若有就发起读暂存器和CRC命令,同时读出第一第二字节即温度数据。 图3.2 温度读取程序流程图3.3 DS1302时钟程序流程图 时钟流程图如图3.3所示,流程图分析:DS1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片的时间数据送入液晶显示。这时若有设置键按下,进行时间修改,完成后将时间数据送入1302芯片,

9、若没有按键按下,直接送入EPROM中,送入液晶显示。图3.3 时钟程序流程图DS1302时钟部分子程序void write_byte(uchar dat)/写一个字节ACC=dat;RST=1;for(a=8;a0;a-) IO=ACC0; SCLK=0; /产生上升沿写入数据,从低位写入 SCLK=1; ACC=ACC1;uchar read_byte()/读一个字节RST=1;for(a=8;a0;a-) ACC7=IO; SCLK=1; /产生下降沿输出数据,先输出低位,保存到ACC中 SCLK=0; ACC=ACC1;return (ACC);void write_1302(uchar

10、 add,uchar dat)/向1302芯片写函数,指定写入地址,数据RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD码转十进制函数,输入BCD,返回十进制uchar Decima

11、l;Decimal=bcd4;return(Decimal=Decimal*10+(bcd&=0x0F);void ds1302_init() /1302芯片初始化子函数(2012-06-18,12:00:00,week7)RST=0;SCLK=0;write_1302(0x8e,0x00); /允许写,禁止写保护 write_1302(0x80,0x00); /向DS1302内写秒寄存器80H写入初始秒数据00write_1302(0x82,0x00);/向DS1302内写分寄存器82H写入初始分数据00write_1302(0x84,0x12);/向DS1302内写小时寄存器84H写入初始

12、小时数据12write_1302(0x8a,0x07);/向DS1302内写周寄存器8aH写入初始周数据4write_1302(0x86,0x17);/向DS1302内写日期寄存器86H写入初始日期数据18write_1302(0x88,0x06);/向DS1302内写月份寄存器88H写入初始月份数据06write_1302(0x8c,0x12);/向DS1302内写年份寄存器8cH写入初始年份数据12write_1302(0x8e,0x80); /打开写保护3.4 LCD显示程序流程图显示流程图如图3.4所示,流程图分析如下:首先对1602显示屏进行初始化(初始化大约持续10ms),然后检查

13、忙信号,若BF=0,则获得显示RAM地址,写入相应的数据显示。若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=0为止。图3.4 LCD显示程序流程图4 万年历的仿真与调试结果上电后的显示 秒调节 功能按键,自上而下功能依次为调节按键、加按键、减按键 5 心得体会本次设计是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助才逐一克服了难题,学习到了不少的专业知识。在整个设计过程之前,我已经在网上找了相关方面的资料,万事开始难,一开始不知道从哪里下手。后来慢慢学会分析

14、系统,将系统模块化,各个模块可以在软件或者硬件上实现。在确保各个模块的硬件电路和与之相搭配的程序能够正常工作后在把它们组成一个系统。在今后的日子里,我会进一步加强自己的动手能力,丰富自己的知识面。参考文献1 李朝青.单片机原理及接口技术M,北京:北京航天航空大学出版社,20052 李广弟.单片机基础M,北京:北京航空航天大学出版社,20003 万光毅.单片机实验与实践教程M,北京:北京航空航天大学出版社,20034 唐亚平、李移伦.单片机原理实训与学习指导M,长沙:中南大学出版社,20065 刘军.单片机原理与接口技术M,华东理工大学出版社,20066 谢自美.电子线路设计、实验、测试M,武汉

15、:华中理工大学出版社,2000附件万年历源程序#include#includeDS18B20_3.H#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;/flag用于读取头文件中的温度值,和显示温度值#define yh 0x80 /LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 /LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)/液晶

16、屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)sbit rs=P26; /寄存器选择sbit en=P27; /下降沿使能sbit rw=P25; /读写信号线/DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P34;/数据线sbit SCLK=P36;sbit RST=P35;sbit ACC0=ACC0;sbit ACC7=ACC7;ACC累加器=AACC.0=E0H /校时按键与C51的引脚连接定义sbit key1=P20; /设置键sbit key2=P21; /加键sbit key3=P22; /减键sbit buzzer=P15;/蜂鸣器,端口低电平响

17、uchar code tab1=20 - - ; /年显示的固定字符uchar code tab2= : : ;/时间显示的固定字符/延时函数,后面经常调用void delay(uint xms)/延时函数,有参函数uint x,y;for(x=xms;x0;x-) for(y=120;y0;y-);void write_1602com(uchar com)/*液晶写入指令函数*rs=0;/数据/指令选择置为指令rw=0; /读写选择置为写P0=com;/送入数据delay(1);en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);en=0;/en由高变低,产生下降沿,液晶执行命

18、令void write_1602dat(uchar dat)/*液晶写入数据函数*rs=1;/数据/指令选择置为数据rw=0; /读写选择置为写P0=dat;/送入数据delay(1);en=1; /en置高电平,为制造下降沿做准备delay(1);en=0; /en由高变低,产生下降沿,液晶执行命令void lcd_init()/*液晶初始化函数*write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);/开显示不显示光标write_1602com(0x06);/整屏不移动,光标自动右移write_1602c

19、om(0x01);/清显示write_1602com(yh+1);/日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a14;a+)write_1602dat(tab1a);/向液晶屏写日历显示的固定符号部分/delay(3);write_1602com(er+2);/时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a0;a-) IO=ACC0; SCLK=0; /产生上升沿写入数据,从低位写入 SCLK=1; ACC=ACC1;uchar read_byte()/读一个字节RST=1;for(a=8;a0;a-) ACC7=IO; SCLK=1; /产生下降沿输出

20、数据,先输出低位,保存到ACC中 SCLK=0; ACC=ACC1;return (ACC);void write_1302(uchar add,uchar dat)/向1302芯片写函数,指定写入地址,数据RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(t

21、emp);uchar BCD_Decimal(uchar bcd)/BCD码转十进制函数,输入BCD,返回十进制uchar Decimal;Decimal=bcd4;return(Decimal=Decimal*10+(bcd&=0x0F);void ds1302_init() /1302芯片初始化子函数(2012-06-18,12:00:00,week7)RST=0;SCLK=0;write_1302(0x8e,0x00); /允许写,禁止写保护 write_1302(0x80,0x00); /向DS1302内写秒寄存器80H写入初始秒数据00write_1302(0x82,0x00);/向

22、DS1302内写分寄存器82H写入初始分数据00write_1302(0x84,0x12);/向DS1302内写小时寄存器84H写入初始小时数据12write_1302(0x8a,0x07);/向DS1302内写周寄存器8aH写入初始周数据4write_1302(0x86,0x17);/向DS1302内写日期寄存器86H写入初始日期数据18write_1302(0x88,0x06);/向DS1302内写月份寄存器88H写入初始月份数据06write_1302(0x8c,0x12);/向DS1302内写年份寄存器8cH写入初始年份数据12write_1302(0x8e,0x80); /打开写保护

23、/温度显示子函数void write_temp(uchar add,uchar dat)/向LCD写温度数据,并指定显示位置uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0xdf);/显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_16

24、02dat(0x43); /显示C符号,0x43是液晶屏字符库里大写C的地址码 /时分秒显示子函数void write_sfm(uchar add,uchar dat)/向LCD写时分秒,有显示位置加、现示数据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 /年月日显示子函数vo

25、id write_nyr(uchar add,uchar dat)/向LCD写年月日,有显示位置加数、显示数据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(yh+add);/设定显示位置为第一个位置+addwrite_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码void write_week(uchar week)/写星期函数write_1602com(yh+0x0c);/星期字符的显示位

26、置switch(week) case 1:write_1602dat(M);/星期数为1时,显示 write_1602dat(O); write_1602dat(N); break; case 2:write_1602dat(T);/星期数据为2时显示 write_1602dat(U); write_1602dat(E); break; case 3:write_1602dat(W);/星期数据为3时显示 write_1602dat(E); write_1602dat(D); break; case 4:write_1602dat(T);/星期数据为4是显示 write_1602dat(H);

27、 write_1602dat(U); break; case 5:write_1602dat(F);/星期数据为5时显示 write_1602dat(R); write_1602dat(I); break; case 6:write_1602dat(S);/星期数据为6时显示 write_1602dat(T); write_1602dat(A); break; case 7:write_1602dat(S);/星期数据为7时显示 write_1602dat(U); write_1602dat(N); break;/*键盘扫描有关函数*void keyscan()if(key1=0)/-key1

28、为功能键(设置键)-delay(9);/延时,用于消抖动if(key1=0)/延时后再次确认按键按下 buzzer=0;/蜂鸣器短响一次 delay(20); buzzer=1;while(!key1);key1n+;if(key1n=9) key1n=1;/设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n)case 1: TR0=0;/关闭定时器 /TR1=0; write_1602com(er+0x09);/设置按键按动一次,秒位置显示光标 write_1602com(0x0f);/设置光标为闪烁 temp=(miao)/10*16+(miao)%10;/秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);/miao write_1302(0x8e,0x80); break;case 2: write_1602com(er+6);/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1