时间温度显示电路.docx

上传人:b****8 文档编号:11460773 上传时间:2023-03-01 格式:DOCX 页数:42 大小:3.89MB
下载 相关 举报
时间温度显示电路.docx_第1页
第1页 / 共42页
时间温度显示电路.docx_第2页
第2页 / 共42页
时间温度显示电路.docx_第3页
第3页 / 共42页
时间温度显示电路.docx_第4页
第4页 / 共42页
时间温度显示电路.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

时间温度显示电路.docx

《时间温度显示电路.docx》由会员分享,可在线阅读,更多相关《时间温度显示电路.docx(42页珍藏版)》请在冰豆网上搜索。

时间温度显示电路.docx

时间温度显示电路

 

单片机课程设计报告

 

1设计任务

实时时钟芯片应用

1)可以显示时间,日期与闹钟,并可通过按键进展调整;

2)可同时设置多个闹钟时间(不少于3个)。

2整体设计方案与框图

a.整体设计方案流程:

1)根据实验电路原理图,找出关于时钟设计的相关芯片与原件并利用相关图书资料和网络资源搞清楚其功能结构,最终将各个元件连成时钟电路图画在草稿纸上。

2)根据画好的电路原理图进展电路的焊接过程。

3)电路焊接完毕后,首先进展最小系统的调试,测试最小系统是否能够实现。

4)最小系统在测试通过后进展时钟电路的焊接与测试,假如最小系统没有通过测试,如此进展错误排查直至最小系统成功实现。

5)最小系统与时钟电路测试通过后进展软件局部编写。

6)根据搜集到的芯片相关资料,了解各芯片管脚结构与功能后进展软件编写。

7)对编写好的程序下载到单片机中进展测试直至所要求功能全部实现。

b.设计框图:

3硬件设计

最小系统原理:

1)最小系统电路由芯片SST89E516RD和MAX232ACPE,复位电路,LED双色灯,数据通信串口,USB连接口以与晶振局部组成。

2)单片机SST89E516RD工作在12MHz频率下,控制整个电路的运行。

3)复位电路主要通过按钮的短接来实现电路的复位功能。

4)9针的通信串口与MAX232ACPE芯片连接与单片机上的RXD(串行数据接收)和TXD(串行数据发送)来实现单片机与计算机之间的通信。

5)LED双色显示主要通过单片机上的1.6与1.7口来控制。

6)按钮通过2.4~2.7管脚口来实现其功能。

7)USB接口通过与计算机USB接口相连为电路板上的电路提供电源。

显示电路原理:

1)芯片SN74HC573AN实现数码管显示的控制,其八条线路分别控制数码管上a,b,c,d,e,f,g,dot的亮灭,从而将相关数据显示在数码管中。

2)数码管上的Y0~Y7口分别于74LS138芯片上的管脚相连,来实现对数码管某一位的亮灭控制。

 

时钟电路原理:

1)通过向DS1302中写入初始时钟来让其通过部和外部的晶振实现计时功能。

2)DS1302中I/O端口为串行数据输入/输出,RST为复位/片选线,Vcc2为主电源,X1、X2为振荡源,GND为地线,SCLK为串行时钟引脚,Vcc1为后备电源。

LED数码管结构图:

四位共阴数码管部逻辑图

四位共阴数码管实物引脚图

芯片介绍

SST89E516RD介绍

兼容80C51系列,置超级FLASH存储器的单片机,工作电压VDD=4.5~5.5V,5伏工作电压时0~40MHz的频率围,工作电压VDD=2.7~3.6V,在3伏工作电压下,原厂保证0~25MHz的工作频,实际最高可达40MHz,与现行的80C52列单片机硬件PIN-TO-PIN完全兼容,软件、开发工具也完全兼容。

1K*8的部RAM〔256Bytes+768Bytes,可使用C语言编程〕两块超级FLASHEEPROM,即SST89E516RD/SST89V516RD:

64K*8的根本存储块和8K*8的二级存储块〔扇区大小为128字节〕和SST89E58RD/SST89V58RD:

32K*8的根本存储块和8K*8的二级存储块〔扇区大小为128字节〕,〔二级存储块可用于存放掉电后要保存的数据,放在部具有极强的抗干扰性〕。

独立的块加密,IAP下的并行操作,块地址重映射。

最大片外程序/数据地址空间为64K*8〔当然也可以通过I/O口进展块切换,实现超64K扩展〕。

三个高电流驱动引脚〔每个16mA,可直接驱动LED〕和三个16位定时器/计数器。

全双工增强型UART:

帧错误检测、自动地址识别。

9个中断源,四个中断优先级。

看门狗定时器〔WatchdogTimer,缺省情况下不打开,用户不需要时可不使用〕。

可编程计数阵列〔PCA〕,标准为每个机器周期12个时钟,器件可选择在每个机器周期6个时钟根底上加倍。

掉电检测〔Brow-out缺省为产生复位,也可设置为产生中断〕

降低EMI模式〔通过AUXRSFR不允许ALE输出时钟〕

四个8位I/O口〔32根输入输出线〕

MAX232介绍

MAX232是一种把电脑的串行口RS232信号转换为单片机所用到的TTL信号电平的芯片。

RS232引脚定义

1-9针作用分别是载波检测(DCD)、接收数据(RDX〕、发送数据(TXD)、数据终端准备好(DTR)、地信号(SG)、数据准备好(DSR)、请求发送(RTS〕、去除发送(CTS)、振铃提示(RI)。

DS1302简介:

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进展同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

工作电压宽达2.5~5.5V。

采用双电源供电〔主电源和备用电源〕,可设置备用电源充电方式,提供了对后背电源进展涓细电流充电的能力。

DS1302的外部引脚分配如下列图。

DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。

DS1302的外部引脚分配

DS1302的部结构

各引脚的功能为:

Vcc1:

主电源;Vcc2:

备份电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2

SCLK:

串行时钟,输入,控制数据的输入与输出;I/O:

三线接口时的双向数据线;CE:

输入信号,在读、写数据期间,必须为高。

该引脚有两个功能:

第一,CE开始控制字访问移位存放器的控制逻辑;其次,CE提供完毕单字节或多字节数据传输的方法。

DS1302有如下几组存放器:

①DS1302有关日历、时间的存放器共有12个,其中有7个存放器〔读时81h~8Dh,写时80h~8Ch〕,存放的数据格式为BCD码形式,如下列图。

 

DS1302有关日历、时间的存放器

小时存放器〔85h、84h〕的位7用于定义DS1302是运行于12小时模式还是24小时模式。

当为高时,选择12小时模式。

在12小时模式时,位5是,当为1时,表示PM。

在24小时模式时,位5是第二个10小时位。

秒存放器〔81h、80h〕的位7定义为时钟暂停标志〔CH〕。

当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。

控制存放器〔8Fh、8Eh〕的位7是写保护位〔WP〕,其它7位均置为0。

在任何的对时钟和RAM的写操作之前,WP位必须为0。

当WP位为1时,写保护位防止对任一存放器的写操作。

②DS1302有关RAM的地址

DS1302中附加31字节静态RAM的地址如下列图。

③DS1302的工作模式存放器

所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。

突发模式存放器如下列图。

④此外,DS1302还有充电存放器等。

2读写时序说明

DS1302是SPI总线驱动方式。

它不仅要向存放器写入控制字,还需要读取相应存放器的数据。

要想与DS1302通信,首先要先了解DS1302的控制字。

DS1302的控制字如图。

控制字〔即地址与命令字节〕

控制字的最高有效位〔位7〕必须是逻辑1,如果它为0,如此不能把数据写入到DS1302中。

位6:

如果为0,如此表示存取日历时钟数据,为1表示存取RAM数据;位5至位1〔A4~A0〕:

指示操作单元的地址;位0〔最低有效位〕:

如为0,表示要进展写操作,为1表示进展读操作。

控制字总是从最低位开始输出。

在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位〔0位〕开始。

同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。

数据读写时序如图。

数据读写时序

 

3电路原理图:

电路原理图如图,DS1302与单片机的连接也仅需要3条线:

CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。

4软件设计

软件各模块设计流程:

日期功能设计:

时间功能设计:

闹钟功能设计:

程序实现代码:

#include

typedefunsignedcharunchar;

typedefunsignedintunint;

sbitT_CLK=P2^0;//DS1302中串行时钟引脚

sbitT_IO=P2^1;//DS1302中串行数据输入/输出

sbitT_RST=P2^2;//DS1302中复位/片选线

sbitBee=P2^7;

sbitDQ=P3^4;

sbitDT=P0^7;

sbitP1_6=P1^6;

sbitP1_7=P1^7;

sbitTAD=P2^7;

sbitK1=P2^6;

sbitK2=P2^5;

sbitK3=P2^4;

sbitACC0=ACC^0;//累加存放器

sbitACC7=ACC^7;

unchardatayear=0x10,month=0x07,date=0x25,day=0x01,hour=0x12,minute=0x59,second=0x45;

unchardataLed[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//分别代表0,1,2,3,4,5,6,7,8,9,-

unchardataDispbuff[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

unchardataring[]={0x00,0x00};

unchardataring1[]={0x00,0x00};

unchardataring2[]={0x00,0x00};

unsignedcharCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

uncharsec,min,hou,dat,mon,wek,yea,i=0,j=0,i1=0,i2=0,i3=0,i4=0;

longk=0;

 

voidCDelay(uncharCDelay)//延时

{

while(CDelay--);

}

ReadOneChar(void)//读一个字节

{

unchari=0;

unchardat=0;

for(i=8;i>0;i--)

{

DQ=0;

dat>>=1;

DQ=1;

if(DQ)//判断DQ上下电平,假如为高电平如此赋给dat高电平值

{

dat|=0x80;

}

CDelay(4);//延时

}

return(dat);//返回dat值

}

WriteOneChar(unchardat)//写一个字节

{

unchari=0;

for(i=8;i>0;i--)

{

DQ=0;//低电平脉冲信号

DQ=dat&0x01;

CDelay(5);//延时

DQ=1;//高电平脉冲信号

dat>>=1;//dat右移一位

}

CDelay(4);

}

voidoneByteToClock(uncharucDa)//向DS1302中写一位

{

unchari;

ACC=ucDa;

for(i=8;i>0;i--)

{

T_IO=ACC0;//相当于汇编中的RRC

T_CLK=1;

T_CLK=0;

ACC=ACC>>1;//下一位移到ACC0

}

}

uncharoneByteFromClock(void)//从DS1302中读一位

{

unchari;

for(i=8;i>0;i--)

{

ACC=ACC>>1;//*相当于汇编中的RRC

ACC7=T_IO;

T_CLK=1;

T_CLK=0;

}

return(ACC);

}

voidgiveOneTime(uncharucAddr,uncharucDa)

{

T_RST=0;

T_CLK=0;

T_RST=1;

oneByteToClock(ucAddr);//地址,命令

oneByteToClock(ucDa);//写1Byte数据

T_CLK=1;

T_RST=0;

}

unchargetOneTime(uncharucAddr)

{

uncharucDa;

T_RST=0;

T_CLK=0;

T_RST=1;

oneByteToClock(ucAddr);//地址,命令

ucDa=oneByteFromClock();//读1Byte数据

T_CLK=1;

T_RST=0;

return(ucDa);

}

voidresetTime(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);

oneByteToClock(hour);

oneByteToClock(date);

oneByteToClock(month);

oneByteToClock(day);

oneByteToClock(year);

oneByteToClock(0);

T_CLK=1;

T_RST=0;

}

voiddisTime(void)

{

uncharsec,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();

hou=oneByteFromClock();

dat=oneByteFromClock();

mon=oneByteFromClock();

wek=oneByteFromClock();

yea=oneByteFromClock();

T_CLK=1;

T_RST=0;

Dispbuff[0]=sec%16;

Dispbuff[1]=sec/16;

Dispbuff[2]=0xa;

Dispbuff[3]=min%16;

Dispbuff[4]=min/16;

Dispbuff[5]=0xa;

Dispbuff[6]=hou%16;

Dispbuff[7]=hou/16;

for(i=0;i<8;i++)

{

P1=j;

P0=Led[Dispbuff[i]];

CDelay(60);

j++;

CDelay(60);

}

}

voiddisDate(void)

{

uncharsec,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();

hou=oneByteFromClock();

dat=oneByteFromClock();

mon=oneByteFromClock();

wek=oneByteFromClock();

yea=oneByteFromClock();

T_CLK=1;

T_RST=0;

Dispbuff[0]=dat%16;

Dispbuff[1]=dat/16;

Dispbuff[2]=0xa;

Dispbuff[3]=mon%16;

Dispbuff[4]=mon/16;

Dispbuff[5]=0xa;

Dispbuff[6]=yea%16;

Dispbuff[7]=yea/16;

for(i=0;i<8;i++)

{

P1=j;

P0=Led[Dispbuff[i]];

CDelay(60);

j++;

CDelay(60);

}

}

voidiniClock()

{

giveOneTime(0x8e,0x00);//控制写入WP=0

giveOneTime(0x90,0xa5);

giveOneTime(0x80,second);//秒

giveOneTime(0x82,minute);//分

giveOneTime(0x84,hour);//时

giveOneTime(0x86,date);//日

giveOneTime(0x88,month);//月

giveOneTime(0x8a,day);//星期

giveOneTime(0x8c,year);//年*/

giveOneTime(0x8e,0x80);

}

uncharbcdToChar(uncharbcd)

{uncharn;

n=(bcd>>4)*10+(bcd&0x0F);

returnn;

}

uncharcharToBcd(uncharnum)

{

uncharn;

n=((num/10)<<4)|(num%10);

returnn;

}

uncharsToS(unchars)

{

uncharn;

n=(s/16)*10+(s%16);

returnn;

}

voiddisRing()//闹钟1设置显示

{

P1=0;

P0=Led[ring[0]%10];

CDelay(60);

P1=1;

P0=Led[ring[0]/10];

CDelay(60);

P1=4;

P0=Led[ring[1]%10];

CDelay(60);

P1=5;

P0=Led[ring[1]/10];

CDelay(60);

}

voiddisRing1()//闹钟2设置显示

{

P1=0;

P0=Led[ring1[0]%10];

CDelay(60);

P1=1;

P0=Led[ring1[0]/10];

CDelay(60);

P1=4;

P0=Led[ring1[1]%10];

CDelay(60);

P1=5;

P0=Led[ring1[1]/10];

CDelay(60);

}

voiddisRing2()//闹钟3设置显示

{

P1=0;

P0=Led[ring2[0]%10];

CDelay(60);

P1=1;

P0=Led[ring2[0]/10];

CDelay(60);

P1=4;

P0=Led[ring2[1]%10];

CDelay(60);

P1=5;

P0=Led[ring2[1]/10];

CDelay(60);

}

voidDateDisF()

{

if(i==0)

{

disDate();

//K1

if(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();

}

else{

yea=yea+1;

yea=charToBcd(yea);

giveOneTime(0x8e,0x00);//*控制命令,WP=0,写操作

giveOneTime(0x8c,yea);//写存放器指令,年

giveOneTime(0x8e,0x80);

disDate();

}

}

//K2

if(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();

}

else{

mon=mon+1;

mon=charToBcd(mon);

giveOneTime(0x8e,0x00);//*控制命令,WP=0,写操作?

giveOneTime(0x88,mon);//写存放器指令,月

giveOneTime(0x8e,0x80);

disDate();

}

}

//K3

if(K3==0&&i3==0)

{

i3=1;

mon=bcdToChar(getOneTime(0x89));

dat=bcdToChar(getOneTime(0x87));

yea=bcdToChar(getOne

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

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

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