电子系统设计.docx

上传人:b****8 文档编号:30681511 上传时间:2023-08-19 格式:DOCX 页数:48 大小:718.21KB
下载 相关 举报
电子系统设计.docx_第1页
第1页 / 共48页
电子系统设计.docx_第2页
第2页 / 共48页
电子系统设计.docx_第3页
第3页 / 共48页
电子系统设计.docx_第4页
第4页 / 共48页
电子系统设计.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

电子系统设计.docx

《电子系统设计.docx》由会员分享,可在线阅读,更多相关《电子系统设计.docx(48页珍藏版)》请在冰豆网上搜索。

电子系统设计.docx

电子系统设计

电子系统设计:

 

具有报时报温功能的电子钟

 

一、目的及任务

1.通过查阅相关资料,深入了解温度测量相关知识;

2.学习动态显示方式的实现方法及原理;

3.复习“MCS-51单片机原理及C语言程序设计”,掌握其借口扩展,如:

显示、键盘等;

4.确定具有报时报温功能的电子钟原理图,构建硬件平台;

5.采用C语言编写应用程序并调试通过;

6.制作出样机并测试达到功能和技术指标要求;

7.写出设计报告和答辩PPT。

二、功能说明

1.具有显示年、月、日、星期、时、分、秒的基本时钟功能;

2.具有显示实时温度的功能;

3.具有设定闹钟的功能;

4.具有设定日期、时间的功能;

5.具有整点语音播报时间和温度的功能。

三、设计思路

以51单片机为核心,运行程序。

由DS1302提供时钟日历,DS18B20实现温度测量,ISD1760实现语音播报功能。

四、使用说明

录入程序后,数码管默认显示当前时间(初始值由程序提前录入),依此按下K4分别显示当前日期(初始值也为程序提前录入),当前星期(初始值依旧为程序初始化),当前温度和当前闹钟设定值,再次按下重新显示当前时间。

在任何一个上述显示状态下按下K5进入设定时间的中断程序,默认进入时间设定界面,K1,K2,K3分别使时、分、秒依此加一,连按可连续加;

再次按K5进入日期设定界面,K1,K2,K3分别对应年、月、日依此加一,同样连按可连续加;

再次按K5进入星期设定界面,按下K1可使星期依此加一;

再按K5进入闹钟设定界面,可以设定要定闹钟的小时和分钟,K1,K2分别使小时、分钟依此加一,再按K5回到时间设定界面。

在任何一个设定界面按下K4即可跳出中断,默认回到时间显示界面。

在显示(K4)状态下,如果时间与闹钟所定的时间相同,则led1和数码管开始闪烁,默认闪烁一分钟(具体值可在程序中修改),此时按下K4表示已收到闹钟提示,可跳出闹钟闪烁状态。

如果时间进入到整点,则语音功能开启,系统将自动播报当前时间和温度。

如果时间在晚上18点以后数码管亮度将自动降低以适应晚上低亮度的显示环境。

在温度显示界面,如果温度超过33度(也可在程序中修改)则数码管第一位将显示H表示HOT(HIGH也行),并且数码管将闪烁显示以提示用户(不喜欢该功能也可以删掉)。

五、硬件设计

1.主要硬件说明

(1)SST89E516RD单片机

·通用8位8051系列兼容微处理器。

·工作电压:

4.50V-5.50V

·工作频率0~40MHz

·内部RAM共有1Kbyte(256Byte+768Byte)

·支持最大64KByte外部程序和数据存储空间

·3个16位定时/计数器(T0,T1,T2)

·全双工增强型串行通讯口(UART)

·帧错误识别-自动地址识别

·10个中断源,4个优先级

·4个8位I/O口(32个I/O引脚)和1个4位口,共36个I/O

·准的每个指令周期12个时钟,也可以倍频,以实现每个指令周期6个时钟

·支持掉电检测

SST89E516RD的功能方框图和引脚定义图

(2)DS1302

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

 

结构

DS1302的引脚排列,其中Vcc2为主电源,VCC1为后备电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

X1和X2是振荡源,外接32.768kHz晶振。

RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:

首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc>2.0V之前,RST必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

I/O为串行数据输入输出端(双向),后面有详细说明。

SCLK为时钟输入端。

下图为DS1302的引脚功能图:

(3)ISD1760语音芯片

ISD1700系列芯片是Winbond推出的单片优质语音录放电路,该芯片提供多项新功能,包括内置专利的多信息管理系统,新信息提示(vAlert),双运作模式(独立&嵌入式),以及可定制的信息操作指示音效。

芯片内部包含有自动增益控制、麦克风前置扩大器、扬声器驱动线路、振荡器与内存等的全方位整合系统功能。

工作电路:

(4)DS18B20温度传感器

DS1302是Dallas公司生产的一种实时时钟芯片.它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒,分,时,日,月,年等在内的实时时间信息,并可对月末日期,闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。

另外,它还能提供31字节的用于高速数据暂存的RAM.鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。

DS1302时钟芯片内主要包括移位寄存器,控制逻辑电路,振荡器,实时时钟电路以及用于高速暂存的31字节RAM。

DS1302与单片机系统的数据传送依靠RST,I/O,SCLK三根端线即可完成。

其工作过程可概括为:

首先系统RST引脚驱动至高电平,然后在作用于SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入地址/命令字节,随后再在SCLK时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节.因此,其与单片机之间的数据传送是十分容易实现的。

·独特的单线接口,只需1个接口引脚即可通信

·多点(multidrop)能力使分布式温度检测应用得以简化

·不需要外部元件

·可用数据线供电

·不需备份电源

·测量范围从-55℃至+125℃,增量值为0.5℃。

等效的华氏温度范围是-67℉至257℉,增量值为0.9℉

·以9位数字值方式读出温度

·在1秒(典型值)内把温度变换为数字

·用户可定义的,非易失性的温度告警设置

·告警搜索命令识别和寻址温度在编定的极限之外的器件(温度告警情况)

DS18B20系统方框图

2.硬件电路设计

(1)原理图绘制

(2)硬件布局

(3)PCB布线

 

六、程序设计

1.程序设计说明

因为程序要实现的功能比较多,考虑到程序的可读性和简洁性使用了头文件的方式调用相关的功能。

因为几乎每个功能都要用到数码管显示,为了以后设计和调试方便所以第一步先编写了数码管显示的头文件,具体先了解了锁存器的使用方法,写出P2.5,P2.6和WR位在显示时的状态,然后输入简单段码进行运行和调试,功能实现完全并且修正各种显示问题后将函数编写为头文件方便调用。

时钟日历为该电路主要功能,所以接下来开始该部分的设计。

各种初始化、写入、读出函数都采用课本上例程,然后对例程进行补充,增加了对日期和星期的显示和设定函数,再次封装为头文件方便主程序调用。

温度显示部分依旧采用了课本上的例程,依旧对程序进行了补充,增加了小数位的读取,并在读取函数中直接加入了数码管显示函数进行显示(这个是为了主程序而服务),然后封装头文件。

语音部分首先用书上例程加单步调试进行语音的录入,录入完成后删除主函数中while

(1),Erase和set函数,只保留play功能,封装为头文件。

主程序的编写为此次试验主要部分,它综合全部功能导致逻辑部分难度较大,使得调试也比较困难。

大体设计思路为:

在主函数中先进行系统的初始化,然后进入while

(1)循环中,实现按下K4使当前显示状态的标志switch_statu自加1,并加入了防止连按的功能。

然后判断switch_statu的值分别调用不同的函数显示当前值,再后面的功能为夜间自动调低亮度、闹钟闪烁和整点播报。

按下K5进入设定部分的中断,并且按下K4跳出中断,具体原理类似于主函数部分。

同时在主程序中还有对所需的各种变量、数组的定义,闹钟部分的显示、设定函数,实现了所有要求的功能。

2.源程序

(1)主函数

#include

#include

#include

#include

#include"display.h"

#include"time.h"

#include"temprature.h"

#include"voice.h"

voidchange_time();

voidchange_date();

voidchange_week();

voidDelayMs(unsignedchar);

voidread_clock();

voidchange_clock();

unsignedcharcode

seg_code[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7C,

0x39,0x5E,0x79,0x71,0x00,0x40};

unsignedchari,j=0,k=0,l=0,m=0,switch_statu=1,switch_buffer,stemp=0;

unsignedchartime_data,times_temps=1;

unsignedcharclock_buffer[8],clock_display_buffer[8];

unsignedcharvoice_buffer_s[16]=

{0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x78,0x80,0x90,0x98};

unsignedcharvoice_buffer_e[16]=

{0x17,0x1f,0x27,0x2f,0x37,0x3f,0x47,0x4f,0x57,0x5f,0x67,0x77,0x7f,0x8f,0x97,0x9f};

sbitK1=P1^0;

sbitK2=P1^1;

sbitK3=P1^2;

sbitK4=P1^3;

sbitK5=P3^2;

voidmain()

{

initial_ds1302();

EA=1;

EX0=1;

for(i=0;i<8;i++)clock_buffer[i]=0;

clock_buffer[0]=clock_buffer[1]=clock_buffer[7]=16;

clock_buffer[4]=17;

P1=0x0f;

while

(1)

{

if(K4==0&&stemp==0)

{

switch_statu++;

stemp=1;

}

if(K4==1)

stemp=0;

if(switch_statu==6)

switch_statu=1;

switch(switch_statu)

{

case1:

read_time();break;

case2:

read_date();break;

case3:

read_week();break;

case4:

read_temp();break;

case5:

read_clock();break;

default:

read_time();break;

}

if(switch_statu!

=4&&switch_statu!

=5)

{

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

display_buffer[i]=seg_code[display_buffer[i]];

display(8,display_buffer);

}

read_time();

j=0;

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

{

if(display_buffer[i]==clock_buffer[i+2])

j++;

}

if(j==5&&K4==0)

m=1;

if(j==5&&m==0)

{

K1=~K1;

DelayMs(500);

}

if(display_buffer[0]>=1&&display_buffer[1]>=8)

DelayMs(5);

if(display_buffer[3]==0&&display_buffer[4]==0&&display_buffer[6]==0&&display_buffer[7]==0)

{

Cpu_Init();

ISD_Init();

ISD_SET_PLAY(voice_buffer_s[11],0,voice_buffer_e[11],0);//ÏÖÔÚÊÇ

delay(1200);

if(display_buffer[0]>=1)

{

if(display_buffer[0]==2)

ISD_SET_PLAY(voice_buffer_s[display_buffer[0]],0,voice_buffer_e[display_buffer[0]],0);//x

delay(1200);

ISD_SET_PLAY(voice_buffer_s[10],0,voice_buffer_e[10],0);//Ê®

delay(1200);

}

if(display_buffer[1]!

=0)

{

ISD_SET_PLAY(voice_buffer_s[display_buffer[1]],0,voice_buffer_e[display_buffer[1]],0);//x

delay(1200);

}

ISD_SET_PLAY(voice_buffer_s[12],0,voice_buffer_e[12],0);//µã

delay(1200);

ISD_SET_PLAY(voice_buffer_s[13],0,voice_buffer_e[13],0);//ζÈÊÇ

delay(1200);

ISD_SET_PLAY(voice_buffer_s[last_shi],0,voice_buffer_e[last_shi],0);//x

delay(1200);

ISD_SET_PLAY(voice_buffer_s[10],0,voice_buffer_e[10],0);//Ê®

delay(1200);

if(last_ge!

=0)

{

ISD_SET_PLAY(voice_buffer_s[last_ge],0,voice_buffer_e[last_ge],0);//x

delay(1200);

}

ISD_SET_PLAY(voice_buffer_s[12],0,voice_buffer_e[12],0);//µã

delay(1200);

ISD_SET_PLAY(voice_buffer_s[last_shifen],0,voice_buffer_e[last_shifen],0);//x

delay(1200);

ISD_SET_PLAY(voice_buffer_s[14],0,voice_buffer_e[14],0);//¶È

}

}

}

voidint0_int(void)interrupt0

{

switch_statu=4;

while

(1)

{

if(switch_statu!

=4)

display(8,display_buffer);

P1=0x0f;

if(K5==0&&stemp==0)

{

switch_statu++;

stemp=1;

}

if(K5==1)

stemp=0;

if(switch_statu==5)

switch_statu=1;

switch(switch_statu)

{

case1:

read_time();change_time();break;

case2:

read_date();change_date();break;

case3:

read_week();change_week();break;

case4:

read_clock();change_clock();break;

default:

read_time();change_time();break;

}

for(i=0;i<8;i++)display_buffer[i]=seg_code[display_buffer[i]];

if(K4==0)

{

switch_statu=5;

return;

}

}

}

voidread_clock()

{

for(i=0;i<8;i++)clock_display_buffer[i]=seg_code[clock_buffer[i]];

DelayMs

(1);

display(8,clock_display_buffer);

}

voidchange_clock()

{

m=0;

P1=0x0f;

if(K1==0)

{

DelayMs(50);

if(K1==0)

{

time_data=clock_buffer[2]*10+clock_buffer[3];

time_data++;

if(time_data==24)time_data=0;

clock_buffer[2]=time_data/10;

clock_buffer[3]=time_data%10;

DelayMs(50);

}

}

if(K2==0)

{

DelayMs(50);

if(K2==0)

{

time_data=clock_buffer[5]*10+clock_buffer[6];

time_data++;

if(time_data==60)time_data=0;

clock_buffer[5]=time_data/10;

clock_buffer[6]=time_data%10;

DelayMs(50);

}

}

}

 

voidchange_time()

{

P1=0x0f;

if(k==1)

{

l++;

if(l==2)

{

k=0;

l=0;

}

}

if(K1==0&&k==0)

{

DelayMs(50);

if(K1==0)

{

time_data=display_buffer[0]*10+display_buffer[1];

time_data++;

if(time_data==24)time_data=0;

display_buffer[0]=time_data/10;

display_buffer[1]=time_data%10;

set_time();

DelayMs(50);

k=1;

}

}

if(K2==0&&k==0)

{

DelayMs(50);

if(K2==0)

{

time_data=display_buffer[3]*10+display_buffer[4];

time_data++;

if(time_data==60)time_data=0;

display_buffer[3]=time_data/10;

display_buffer[4]=time_data%10;

set_time();

DelayMs(50);

k=1;

}

}

if(K3==0&&k==0)

{

DelayMs(50);

if(K3==0)

{

time_data=display_buffer[6]*10+display_buffer[7];

time_data++;

if(time_data==60)time_data=0;

display_buffer[6]=time_data/10;

display_buffer[7]=time_data%10;

set_time();

DelayMs(50);

k=1;

}

}

}

voidchange_date()

{

P1=0x0f;

if(k==1)

{

l++;

if(l==2)

{

k=0;

l=0;

}

}

if(K1==0&&k==0)

{

DelayMs(50);

if(K1==0)

{

time_data=display_buffer[2]*10+display_buffer[3];

time_data++;

if(time_data>=100)time_data=0;

display_buffer[2]=time_data/10;

display_buffer[3]=time_data%10;

set_date();

DelayMs(50);

k=1;

}

}

if(K2==0&&k==0)

{

DelayMs(50);

if(K2==0)

{

time_data=display_buffer[4]*10+display_buffer[5];

time_data++;

if(time_data>=13)time_data=1;

display_buffer[4]=time_data/10;

display_buffer[5]=time_da

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

当前位置:首页 > 工程科技 > 城乡园林规划

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

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