光控数字温度时钟Word下载.docx
《光控数字温度时钟Word下载.docx》由会员分享,可在线阅读,更多相关《光控数字温度时钟Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
3、进程安排
•第13周:
系统硬件电路设计
•第14周:
系统软件设计与仿真
•第15周:
实物制作
•第16周:
撰写总结报告
目录
一、前言-4-
二、功能描述与总体方案-5-
三、硬件设计-6-
四、软件设计-9-
五、心得体会-22-
一、前言
单片微型计算机是随着超大规模集成电路技术的发展而诞生的,由于它具有体积小、功能强、性价比高等特点,所以广泛应用于电子仪表、家用电器、节能装置、军事装置、机器人、工业控制等诸多领域,使产品小型化、智能化,既提高了产品的功能和质量,又降低了成本,简化了设计。
本文主要介绍由单片机控制的带有温度显示的电子钟的设计。
随着人们生活水平的日益提高,人们对生活的要求越来越高,原有的事物已经不能满足人们的生活需求了,一些带有新功能的事物已经在慢慢的取代旧事物。
就像电子钟一样,人们用电子钟不仅仅只是看时间了,人们还需要看温度了。
越来越多的新功能更贴近人们的生活了,所以也越来越受人们所喜欢。
带有温度的的电子钟可以使人们随时都可以了解温度的变化。
本文介绍了设计的框架结构和组成模块以及各模块的原理,介绍了各部分硬件设计和各部分软件设计以及软件流程图。
该设计是以AT89C51单片机为控制核心的集多种功能于一体的数字钟。
该数字钟实现了具有时间显示功能;
具有温度显示功能。
硬件设计分为单片机控制模块、按键模块、温度模块、时钟模块、显示模块等几个部分。
二、功能描述与总体方案
2.1功能描述
根据主要功能要求,该设计利用51单片机实现了电子时钟、温度的显示、根据环境光强度动态调节显示亮度以及设置闹铃等功能。
具体可分为一下几种:
(1)显示当前的时间,24时制的时、分、秒;
(2)可调节时间;
(3)显示当前屋内温度;
(4)具有光控功能,能根据环境光线的强弱,动态调节显示亮度。
2.2系统组成
用主芯片为AT89C51的单片机控制实现,为了满足单片机系统的实时控制的需求,采用实时钟芯片DS1302,使用按键进行时间的调整和定时,温度传感器使用热敏电阻。
显示时间和温度使用KYX-1106BS显示。
系统硬件电路图如图2.1,一给单片机上电,单片机就初始化。
单片机接收并处理来自热敏电阻传过来的数据在液晶上显示当时的室内温度,液晶还显示当前的时间,日期。
当需要设置闹钟或调整时间时,又检测按键是否按下,以便对时间进行修正、设置闹钟时间,最后进入循环。
图2.1主程序框图
三、硬件设计
3.1时钟电路
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
51单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
图3.1时钟电路
3.2DS1302时钟电路
DS1302内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。
实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。
DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:
复位(RST)、I/O数据线、串行时钟(SCLK)。
DS1302时钟电路如图3.3所示。
图3.2DS1302时钟电路
3.3温度光强采集模块电路
温度光强采集模块主要对环境的温度与光强度进行采集,利用TLC分析控制,将温度数据传送至KYX-1106BS显示,光强的大小将决定显示的光强。
图3.3温度光强采集模块电路图
3.4按键、闹铃模块电路
闹铃模块主要就是一个蜂鸣器,其作用是当到达设定的时间到时发出蜂鸣声报警。
用一个PNP型三极管和蜂鸣器连接主要是给蜂鸣器一个驱动,让蜂鸣器为高电平有效,蜂鸣器发声报警。
独立按键用来用作调节时钟以及闹铃。
按键均采用低电平有效连接方式。
几个按键可以对时钟进行设置调节,并调节设置闹铃,当时间与设置的时间一致是闹铃报警,即蜂鸣器响。
图3.4按键闹铃模块电路
3.5显示电路
显示器是单片机常用的功能单元之一,显示器的主要功能是为单片机系统使用者提供必要的单片机工作信息,或者提供工作状态的提示信息,显示器的工作是由单片机通过显示接口驱动的。
图3.5显示电路
四、软件设计
/***************DS1302.C******************/
#include<
reg52.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitIO=P1^5;
//DS1302'
sI/O
sbitSCLK=P1^6;
sclock
sbitRST=P1^7;
sReset
voidWrite_A_Byte_TO_DS1302(ucharx)
{
uchari;
for(i=0;
i<
8;
i++)
{
IO=x&
0x01;
SCLK=1;
SCLK=0;
x>
>
=1;
}
}
ucharGet_A_Byte_FROM_DS1302()
uchari,b=0x00;
b|=_crol_((uchar)IO,i);
SCLK=1;
returnb/16*10+b%16;
//返回BCD码
ucharRead_Data(ucharaddr)//从DS1302指定位置读数据
uchardat;
RST=0;
RST=1;
Write_A_Byte_TO_DS1302(addr);
dat=Get_A_Byte_FROM_DS1302();
RST=0;
returndat;
voidWrite_DS1302(ucharaddr,uchardat)
SCLK=0;
RST=1;
Write_A_Byte_TO_DS1302(addr);
Write_A_Byte_TO_DS1302(dat);
voidGetTime(uchar*DateTime)//读取当前日期时间
uchari,addr=0x81;
7;
DateTime[i]=Read_Data(addr);
addr+=2;
voidSET_DS1302(uchar*DateTime)
uchari;
Write_DS1302(0x8E,0x00);
//写控制位,取消保护
for(i=1;
Write_DS1302(0x80+2*i,(DateTime[i]/10<
<
4)|(DateTime[i]%10));
Write_DS1302(0x8E,0x80);
//加保护
*********************Display********************
#include"
Display.h"
externunsignedcharTempData[8];
//存储显示值的全局变量
/*------------------------------------------------
显示函数,用于动态扫描数码管
------------------------------------------------*/
voidNormalDisplay(void)
{
if((time_buf1[4]/10)==0)
{LATCH1=1;
else
{LATCH1=0;
}
DataPort=TempData[0];
DelayMs(4);
LATCH1=1;
LATCH2=0;
DataPort=TempData[1];
SEC=((time_buf1[6]%10)%2);
//跳秒处理
DelayMs(4);
LATCH2=1;
LATCH3=0;
DataPort=TempData[2];
LATCH3=1;
LATCH4=0;
DataPort=TempData[3];
LATCH4=1;
voidHourDisplay(void)
{
{LATCH1=1;
{
if(((time_buf1[6]%10)%2)==0)
{LATCH1=0;
else
{LATCH1=1;
}
}
LATCH1=1;
if(((time_buf1[6]%10)%2)==0)
{LATCH2=0;
else
{LATCH2=1;
LATCH3=0;
SEC=((time_buf1[6]%10)%2);
LATCH4=0;
DelayMs
(2);
voidMinuteDisplay(void)
if((time_buf1[4]/10)==0)
{LATCH1=0;
{LATCH3=0;
else
{LATCH3=1;
{LATCH4=0;
{LATCH4=1;
voidDataDisplay(void)
LATCH1=0;
DataPort=TempData[4];
DataPort=TempData[5];
//SEC=((time_buf1[6]%10)%2);
SEC=0;
DataPort=TempData[6];
DataPort=TempData[7];
SEC=0;
voidMoothDisplay(void)
{LATCH1=0;
{LATCH1=1;
if(((time_buf1[6]%10)%2)==0)
LATCH3=0;
LATCH4=0;
voidDayDisplay(void)
LATCH1=0;
SEC=((time_buf1[6]%10)%2);
*******************Delay**************
delay.h"
voidDelayUs(unsignedchart)
while(--t);
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs(245);
**********************main.c*******************
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
ds1302.h"
Delay.h"
sbitLED0=P1^0;
sbitLED1=P1^1;
sbitK1=P2^4;
//定义按键端口,选择调整什么
sbitK2=P2^5;
//加键
bitReadTimeFlag=1;
//定义读时间标
//bitSecondFlag=0;
unsignedcharcodeDuanMa1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳显示段码值0~9
unsignedcharcodeDuanMa2[10]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82};
//第三个数码管的数组
unsignedcharTempData[8];
unsignedcharSetTime=0;
voidInit_Timer0(void);
//定时器初始化
主函数
voidmain(void)
Init_Timer0();
Ds1302_Init();
Ds1302_Read_Time();
while
(1)
if(!
K1)
{
DelayMs(10);
if(!
{
while(!
K1);
LED0=~LED0;
SetTime++;
if(SetTime==5)SetTime=0;
}
if(!
K2)
{
K2);
LED1=~LED1;
if(SetTime==0)
{SetTime=50;
LED0=~LED0;
{//
switch(SetTime)
{
case1:
time_buf1[4]++;
if(time_buf1[4]==24)time_buf1[4]=0;
Ds1302_Write_Time();
break;
//正常时间小时加1
case2:
time_buf1[5]++;
if(time_buf1[5]==60)time_buf1[5]=0;
//分加1
case3:
time_buf1[2]++;
if(time_buf1[2]==13)time_buf1[2]=1;
//正常时间月加1
case4:
time_buf1[3]++;
if(time_buf1[3]==31)time_buf1[3]=1;
//日加1
default:
}
}
}//
if(ReadTimeFlag==1)//大致100ms
ReadTimeFlag=0;
TempData[0]=DuanMa1[time_buf1[4]/10];
//时//数据的转换,
TempData[1]=DuanMa1[time_buf1[4]%10];
//因我们采用数码管0~9的显示,将数据分开
TempData[2]=DuanMa2[time_buf1[5]/10];
//分
TempData[3]=DuanMa1[time_buf1[5]%10];
TempData[4]=DuanMa1[time_buf1[2]/10];
//月
TempData[5]=DuanMa1[time_buf1[2]%10];
TempData[6]=DuanMa2[time_buf1[3]/10];
//日
TempData[7]=DuanMa1[time_buf1[3]%10];
定时器初始化子程序//
voidInit_Timer0(void)
TMOD|=0x01;
//使用模式1,16位定时器,使用"
|"
符号可以在使用多个定时器时不受影响
//TH0=0x00;
//给定初值
//TL0=0x00;
EA=1;
//总中断打开
ET0=1;
//定时器中断打开
TR0=1;
//定时器开关打开
/*------------------------------------------------
定时器中断子程序
voidTimer0_isr(void)interrupt1
staticunsignedintnum;
TH0=(65536-500)/256;
//重新赋值0.5ms
TL0=(65536-500)%256;
num++;
if(num==1)
Ds1302_Read_Time();
switch(SetTime)
case0:
NormalDisplay();
case1:
HourDisplay();
case2:
MinuteDisplay();
case3:
MoothDisplay();
case4:
DayDisplay();
case50:
while(SetTime--)
DataDisplay();
DelayMs(20000);
;
}SetTime=0;
default: