时间温度显示电路_第1页
时间温度显示电路_第2页
时间温度显示电路_第3页
时间温度显示电路_第4页
时间温度显示电路_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、.单片机课程设计报告1设计任务实时时钟芯片应用1)可以显示时间,日期及闹钟,并可通过按键进行调整;2)可同时设置多个闹钟时间(不少于3个)。2整体设计方案及框图a.整体设计方案流程:1)根据实验电路原理图,找出关于时钟设计的相关芯片及原件并利用相关图书资料和网络资源搞清楚其功能结构,最终将各个元件连成时钟电路图画在草稿纸上。2)根据画好的电路原理图进行电路的焊接过程。3)电路焊接完毕后,首先进行最小系统的调试,测试最小系统是否能够实现。4)最小系统在测试通过后进行时钟电路的焊接及测试,若最小系统没有通过测试,则进行错误排查直至最小系统成功实现。5)最小系统及时钟电路测试通过后进行软件部分编写。

2、6)根据搜集到的芯片相关资料,了解各芯片管脚结构及功能后进行软件编写。7)对编写好的程序下载到单片机中进行测试直至所要求功能全部实现。b.设计框图:硬件电路最小系统实现硬件电路设计硬件电路焊接软件部分编写硬件电路数码管部分电路实现硬件电路部分电路调试全部功能实现软件部分调试3硬件设计最小系统原理:1)最小系统电路由芯片SST89E516RD和MAX232ACPE,复位电路,LED双色灯,数据通信串口,USB连接口以及晶振部分组成。2)单片机SST89E516RD工作在12MHz频率下,控制整个电路的运行。3)复位电路主要通过按钮的短接来实现电路的复位功能。4)9针的通信串口与MAX232ACP

3、E芯片连接与单片机上的RXD(串行数据接收)和TXD(串行数据发送)来实现单片机与计算机之间的通信。5)LED双色显示主要通过单片机上的1.6与1.7口来控制。6)按钮通过2.42.7管脚口来实现其功能。7)USB接口通过与计算机USB接口相连为电路板上的电路提供电源。显示电路原理:1)芯片SN74HC573AN实现数码管显示的控制,其八条线路分别控制数码管上a,b,c,d,e,f,g,dot的亮灭,从而将相关数据显示在数码管中。2)数码管上的Y0Y7口分别于74LS138芯片上的管脚相连,来实现对数码管某一位的亮灭控制。时钟电路原理:1)通过向DS1302中写入初始时钟来让其通过内部和外部的

4、晶振实现计时功能。2)DS1302中I/O端口为串行数据输入/输出,RST为复位/片选线,Vcc2为主电源,X1、X2为振荡源,GND为地线,SCLK为串行时钟引脚,Vcc1为后备电源。LED数码管结构图:四位共阴数码管内部逻辑图四位共阴数码管实物引脚图芯片介绍SST89E516RD介绍兼容80C51系列,内置超级FLASH存储器的单片机,工作电压 VDD=4.55.5V,5伏工作电压时040MHz的频率范围,工作电压 VDD=2.73.6V,在3伏工作电压下,原厂保证025MHz的工作频,实际最高可达40MHz,与现行的80C52列单片机硬件PIN-TO-PIN完全兼容,软件、开发工具也完全

5、兼容。1K*8的内部RAM(256Bytes+768Bytes,可使用C语言编程)两块超级FLASH EEPROM,即SST89E516RD/SST89V516RD:64K*8的基本存储块和8K*8的二级存储块(扇区大小为 128 字节)和SST89E58RD/SST89V58RD:32K*8的基本存储块和8K*8的二级存储块(扇区大小为128字节),(二级存储块可用于存放掉电后要保存的数据,放在内部具有极强的抗干扰性)。独立的块加密,IAP 下的并行操作,块地址重映射。最大片外程序/数据地址空间为64K*8(当然也可以通过I/O口进行块切换,实现超64K扩展)。 三个高电流驱动引脚(每个16

6、mA,可直接驱动LED)和三个16位定时器/计数器。全双工增强型UART:帧错误检测、自动地址识别。9个中断源,四个中断优先级。看门狗定时器 (Watchdog Timer, 缺省情况下不打开, 用户不需要时可不使用)。可编程计数阵列(PCA),标准为每个机器周期12个时钟,器件可选择在每个机器周期6个时钟基础上加倍。掉电检测(Brow-out缺省为产生复位,也可设置为产生中断)降低EMI模式(通过AUXR SFR 不允许ALE 输出时钟)四个8位 I/O口(32 根输入输出线) MAX232介绍MAX232是一种把电脑的串行口RS232信号转换为单片机所用到的TTL信号电平的芯片。RS232

7、引脚定义1-9针作用分别是载波检测(DCD)、接收数据(RDX)、发送数据(TXD)、数据终端准备好(DTR)、地信号(SG)、数据准备好(DSR)、请求发送(RTS)、清除发送(CTS)、振铃提示(RI)。DS1302 简介:DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电

8、方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。DS1302的外部引脚分配 DS1302的内部结构 各引脚的功能为: Vcc1:主电源;Vcc2:备份电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2 Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字

9、访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。DS1302有下列几组寄存器: DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h8Dh,写时80h8Ch),存放的数据格式为BCD码形式,如图所示。 DS1302有关日历、时间的寄存器 小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302

10、处于低功耗状态;当该位置为0时,时钟开始运行。控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 DS1302有关RAM的地址 DS1302中附加31字节静态RAM的地址如图所示。 DS1302的工作模式寄存器所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图所示。 此外,DS1302还有充电寄存器等。 2 读写时序说明DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与DS1302通信,首先要先了解DS

11、1302的控制字。DS1302的控制字如图。 控制字(即地址及命令字节) 控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图

12、。数据读写时序 3 电路原理图:电路原理图如图,DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。4软件设计软件各模块设计流程:日期功能设计:从DS1302中读出日期向DS1302芯片写入初始化日期初始化DS1302芯片模块功能实现对显示的日期进行长度判断在LED数码管上显示读出的日期时间功能设计:从DS1302中读出时间向DS1302芯片写入初始化时间初始化DS1302芯片模块功能实现对显示的时间进行长度判断在LED数码管上显示读出的时间闹钟功能设计:闹钟时间点过去后蜂鸣器停止响声

13、,LED灯灭编写程序实现闹钟到点后蜂鸣器响,LED灯亮红色实现三个闹钟能够独立显示设置,互相之间没有干扰闹钟设置显示设计程序实现代码:#includetypedef unsigned char unchar; typedef unsigned int unint;sbit T_CLK = P20; /DS1302中串行时钟引脚sbit T_IO = P21; /DS1302中串行数据输入/输出sbit T_RST = P22; /DS1302中复位/片选线sbit Bee = P27;sbit DQ = P34; sbit DT =P07;sbit P1_6=P16;sbit P1_7=P17

14、;sbit TAD = P27;sbit K1=P26;sbit K2=P25;sbit K3=P24;sbit ACC0=ACC0;/累加寄存器sbit ACC7=ACC7;unchar data year=0x10, month=0x07, date=0x25, day=0x01, hour=0x12, minute=0x59, second=0x45;unchar data Led = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /分别代表0,1,2,3,4,5,6,7,8,9,-unchar data Dispbuff

15、 =0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;unchar data ring=0x00,0x00;unchar data ring1=0x00,0x00;unchar data ring2=0x00,0x00;unsigned char Code=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; unchar sec,min,hou,dat,mon,wek,yea,i=0,j=0,i1=0,i2=0,i3=0,i4=0;long k=0; void CDelay(unchar CDelay)

16、/延时 while(CDelay-);ReadOneChar(void) /读一个字节 unchar i = 0; unchar dat = 0; for(i=8;i0;i-) DQ = 0; dat=1; DQ = 1; if(DQ) /判断DQ高低电平,若为高电平则赋给dat高电平值 dat |= 0x80; CDelay(4);/延时 return(dat); /返回dat值WriteOneChar(unchar dat) /写一个字节 unchar i = 0; for(i=8;i0;i-) DQ = 0; /低电平脉冲信号 DQ = dat&0x01; CDelay(5);/延时 D

17、Q = 1; /高电平脉冲信号 dat = 1;/dat右移一位 CDelay(4);void oneByteToClock(unchar ucDa) /向DS1302中写一位 unchar i; ACC= ucDa; for(i=8; i0; i-) T_IO = ACC0; /相当于汇编中的 RRC T_CLK = 1; T_CLK = 0; ACC =ACC 1;/下一位移到ACC0 unchar oneByteFromClock(void) /从DS1302中读一位 unchar i; for(i=8; i0; i-) ACC = ACC1; /*相当于汇编中的 RRC ACC7 =

18、T_IO; T_CLK = 1; T_CLK = 0; return(ACC); void giveOneTime(unchar ucAddr, unchar ucDa) T_RST = 0; T_CLK = 0; T_RST = 1; oneByteToClock(ucAddr); /地址,命令 oneByteToClock(ucDa); /写1Byte数据 T_CLK = 1; T_RST =0; unchar getOneTime(unchar ucAddr) unchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; oneByteToClock(ucA

19、ddr); / 地址,命令 ucDa = oneByteFromClock(); / 读1Byte数据 T_CLK = 1; T_RST =0; return(ucDa); void resetTime(void) giveOneTime(0x8e,0x00); /8e:写寄存器BIT7=WP 控制命令,WP=0,写操作 T_RST = 0; T_CLK = 0; T_RST = 1; oneByteToClock(0xbe); / 0xbe:时钟突发模式:写寄存器 时钟多字节写命令 oneByteToClock(second); oneByteToClock(minute); oneByte

20、ToClock(hour); oneByteToClock(date); oneByteToClock(month); oneByteToClock(day); oneByteToClock(year); oneByteToClock(0); T_CLK = 1; T_RST =0; void disTime(void) unchar sec,min,hou,dat,mon,wek,yea,i,j=0; T_RST = 0; T_CLK = 0; T_RST = 1; oneByteToClock(0xbf); /* 0xbf:时钟突发模式寄存器:读寄存器 时钟多字节读命令 sec = one

21、ByteFromClock(); min =oneByteFromClock(); hou = oneByteFromClock(); dat = oneByteFromClock(); mon = oneByteFromClock(); wek = oneByteFromClock(); yea = oneByteFromClock(); T_CLK = 1; T_RST =0; Dispbuff0 = sec%16; Dispbuff1 = sec/16; Dispbuff2 = 0xa; Dispbuff3 = min%16; Dispbuff4 = min/16; Dispbuff5

22、= 0xa; Dispbuff6 = hou%16; Dispbuff7 = hou/16; for(i=0; i8; i+)P1 = j;P0 = LedDispbuffi;CDelay(60);j +; CDelay(60); void disDate(void) unchar sec,min,hou,dat,mon,wek,yea,i,j=0; T_RST = 0; T_CLK = 0; T_RST = 1; oneByteToClock(0xbf); /* 0xbf:时钟多字节读命令 sec = oneByteFromClock(); min =oneByteFromClock();

23、hou = oneByteFromClock(); dat = oneByteFromClock(); mon = oneByteFromClock(); wek = oneByteFromClock(); yea = oneByteFromClock(); T_CLK = 1; T_RST =0; Dispbuff0 = dat%16; Dispbuff1 = dat/16; Dispbuff2 = 0xa; Dispbuff3 = mon%16; Dispbuff4 = mon/16; Dispbuff5 = 0xa; Dispbuff6 = yea%16; Dispbuff7 = yea

24、/16; for(i=0; i4)*10 + (bcd&0x0F); return n;unchar charToBcd (unchar num)unchar n;n = (num/10)4) | ( num%10 ); return n;unchar sToS(unchar s)unchar n;n=(s/16)*10+(s%16);return n;void disRing() /闹钟1设置显示P1=0;P0=Ledring0%10;CDelay(60);P1=1;P0=Ledring0/10;CDelay(60);P1=4;P0=Ledring1%10;CDelay(60);P1=5;P

25、0=Ledring1/10;CDelay(60);void disRing1() /闹钟2设置显示P1=0;P0=Ledring10%10;CDelay(60);P1=1;P0=Ledring10/10;CDelay(60);P1=4;P0=Ledring11%10;CDelay(60);P1=5;P0=Ledring11/10;CDelay(60);void disRing2() / 闹钟3设置显示P1=0;P0=Ledring20%10;CDelay(60);P1=1;P0=Ledring20/10;CDelay(60);P1=4;P0=Ledring21%10;CDelay(60);P1

26、=5;P0=Ledring21/10;CDelay(60);void DateDisF()if(i=0)disDate();/K1if(K1=0&i1=0)i1=1;yea= bcdToChar(getOneTime(0x8d);if(yea=89)yea=0;yea= charToBcd(yea); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作 giveOneTime(0x8c,yea); /写寄存器指令,年 giveOneTime(0x8e,0x80);disDate();elseyea= yea+1;yea= charToBcd(yea); giveO

27、neTime(0x8e,0x00); /* 控制命令,WP=0,写操作giveOneTime(0x8c,yea); /写寄存器指令,年giveOneTime(0x8e,0x80);disDate();/K2if(K2=0&i2=0)i2=1;mon= bcdToChar(getOneTime(0x89);if(mon=12)mon=1;mon= charToBcd(mon); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x88,mon); /写寄存器指令,月 giveOneTime(0x8e,0x80);disDate();el

28、semon= mon+1;mon= charToBcd(mon); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作?giveOneTime(0x88,mon); /写寄存器指令,月giveOneTime(0x8e,0x80);disDate();/K3if(K3=0&i3=0)i3=1;mon= bcdToChar(getOneTime(0x89);dat= bcdToChar(getOneTime(0x87);yea= bcdToChar(getOneTime(0x8d); if(mon=1|mon=3|mon=5|mon=7|mon=8|mon=10|mo

29、n=12) /判断31天月份if(dat=31)dat=1;dat= charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86,dat); /写寄存器指令,日 giveOneTime(0x8e,0x80);disDate();else dat=dat+1; dat=charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86,dat); /写寄存器指令,日 giveOneTime(0x8e,0x80); disDat

30、e();elseif(mon=2) /二月份平年、闰年天数判断if(yea%4)=0&(yea%100)=0&yea!=0) /闰年if(dat=29)dat=1; dat= charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86,dat); /写寄存器指令,日 giveOneTime(0x8e,0x80); disDate();else dat=dat+1; dat=charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTi

31、me(0x86,dat); /写寄存器指令,日 giveOneTime(0x8e,0x80); disDate();else /平年if(dat=28)dat=1;dat= charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86,dat); /写指令 giveOneTime(0x8e,0x80);disDate();else dat=dat+1; dat=charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86

32、,dat); /寄存器写指令 giveOneTime(0x8e,0x80); disDate();elseif(dat=30)dat=1;dat= charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86,dat); giveOneTime(0x8e,0x80);disDate();else dat=dat+1; dat=charToBcd(dat); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x86,dat); giveOneTime

33、(0x8e,0x80); disDate();if(K1=1&K2=1&K3=1)i1=0;i2=0;i3=0; void TimeDisF()if(i=1) disTime();/K1 if(K1=0&i1=0) i1=1;hou= bcdToChar(getOneTime(0x85);if(hou=23)hou=0;hou= charToBcd(hou); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x84,hou); /写寄存器指令,时 giveOneTime(0x8e,0x80);disTime();elsehou= h

34、ou+1;hou= charToBcd(hou); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作?giveOneTime(0x84,hou); /写寄存器指令,时giveOneTime(0x8e,0x80);disTime();/K2if(K2=0&i2=0)i2=1;min= bcdToChar(getOneTime(0x83);if(min=59)min=0;min= charToBcd(min); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作? giveOneTime(0x82,min); /写寄存器指令,分 giv

35、eOneTime(0x8e,0x80);disTime();elsemin= min+1;min= charToBcd(min); giveOneTime(0x8e,0x00); /* 控制命令,WP=0,写操作?giveOneTime(0x82,min); /写寄存器指令,分giveOneTime(0x8e,0x80);disTime();/K3 if(K3=0&i3=0)resetTime();if(K1=1&K2=1&K3=1)i1=0;i2=0;i3=0; void GetTimeF() /读取时间T_RST = 0;T_CLK = 0;T_RST = 1;oneByteToClock

36、(0xbf); /* 0xbf:时钟多字节读命令 sec = bcdToChar(oneByteFromClock();min = bcdToChar(oneByteFromClock();hou = bcdToChar(oneByteFromClock();dat = bcdToChar(oneByteFromClock();mon = bcdToChar(oneByteFromClock();wek = bcdToChar(oneByteFromClock();yea = bcdToChar(oneByteFromClock();T_CLK = 1;T_RST =0;void Change

37、KF() /按钮切换显示实现函数if(TAD=0&j=0)if(i=4)i=0;else i=i+1;j=1;elseif(TAD=0&j=1)i=i;else j=0;void main (void)iniClock(); /始终初始化 while(1) GetTimeF();/获取之前初始化入DS1302中的时间 ChangeKF(); /显示数据切换DateDisF(); /日期控制TimeDisF(); /时间控制/设置闹钟if(i=2) /闹钟1 disRing();P0=0x6;P1=7;if(K1=0&i1=0)i1=1;ring1=ring1+1;if(ring1=24)ring1=0;disRing();if(K2=0&i2=0)i2=1;ring0=ring0+1;if(ring0=60)ring0=0;disRing();if(K2=1&K1=1)i1=0;i2=0;if(i=3) /闹钟2 disRing1();P0=0x5b;P1=7;if(K1=0&i1=0)i1=1;ring11=ring11+1;if(ring11=24)ring11=0;disRing1();if(K2=0&

温馨提示

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

评论

0/150

提交评论