单片机最小时钟日期显示课程设计.docx

上传人:b****7 文档编号:10777422 上传时间:2023-02-22 格式:DOCX 页数:56 大小:297.97KB
下载 相关 举报
单片机最小时钟日期显示课程设计.docx_第1页
第1页 / 共56页
单片机最小时钟日期显示课程设计.docx_第2页
第2页 / 共56页
单片机最小时钟日期显示课程设计.docx_第3页
第3页 / 共56页
单片机最小时钟日期显示课程设计.docx_第4页
第4页 / 共56页
单片机最小时钟日期显示课程设计.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

单片机最小时钟日期显示课程设计.docx

《单片机最小时钟日期显示课程设计.docx》由会员分享,可在线阅读,更多相关《单片机最小时钟日期显示课程设计.docx(56页珍藏版)》请在冰豆网上搜索。

单片机最小时钟日期显示课程设计.docx

单片机最小时钟日期显示课程设计

 

单片机课程设计报告

 

设计题目:

基于51单片机电子钟

 

学院:

机电工程学院

班级:

09电气二班

姓名:

杨飞豹

学号:

20090502310077

 

摘要:

本设计是简单定时闹钟系统,不仅能实现系统要求的功能:

(1)显示当前时间:

年—月—日;时时—分分—秒秒。

(2)由LED闪动做秒显示。

(3)定利用按键可以对时间及闹铃进行设置,并可显示闹铃时间。

当闹铃间到蜂鸣器发出声响,按停止键可使闹铃声停止。

(4)能显示温度。

本设计采用单片机STC89C52作为核心元件,配备液晶显示模块、时钟芯片、等功能模块。

数字钟采用24小时制方式显示时间,定时信息以及年月日显示等功能。

12MHZ晶振,由P0口输出所要显示的字形段码,由P2口输出字位信号。

在其基础上扩展外围芯片与电路,附加时钟电路及LED电路。

LED采用共阴极接法,低电平有效选中相应的LED。

并添加温度采集与处理功能。

文章的核心主要从硬件设计和软件编程两个大的方面。

硬件电路设计主要包括中央处理单元电路、时钟电路、人机接口电路、信号处理电路、执行电路等几部分组成。

单片机具有集成度高、功能强、通用性好、特别是它能耗低、价格便宜、可靠性高、抗干扰能力强和使用方便等独特的优点。

 

关键字:

STC89C52单片机电子时钟数码管温度传感器DS18B20。

 

 

目录

1.设计任务和要求………………………………………4页

2.方案设计与论证………………………………………4页

2.1各方案的优点………………………………4页

2.2各方案的缺点………………………………4页

2.3对比选择……………………………………5页

3.系统设计………………………………………………5页

3.1系统的硬件设计………………………………5页

3.2系统的软件设计………………………………10页

4.电路安装调试及结果…………………………………25页

5.设计总结………………………………………………25页

参考文献…………………………………………………26页

元器件清单………………………………………………27页

 

1.设计任务和要求

(1)显示当前时间:

年—月—日;时时—分分—秒秒。

(2)由LED闪动做秒显示。

(3)定利用按键可以对时间及闹铃进行设置,并可显示闹铃时间。

当闹铃间到蜂鸣器发出声响,按停止键可使闹铃声停止。

(4)能显示温度。

2方案设计与论证

时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。

在一个单片机应用系统中,时钟有两方面的含义:

一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:

一是用软件实现,即用单片机内部的可编程定时/计数器来实现;二是用专门的时钟芯片实现。

2.1各方案优点:

(1)数宇时钟方案:

数字时钟是本设计的最主要的部分。

根据需要,可利用两种方案实现。

方案一:

本方案采用Dallas公司的专用时钟芯片DS12887A。

该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

方案二:

本方案完全用软件实现数字时钟。

原理为:

在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。

利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。

(2)数码管显示方案

方案一:

静态显示。

所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。

该方式每一位都需要一个8位输出口控制。

静态显示时较小的电流能获得较高的亮度,且字符不闪烁。

方案二:

动态显示。

所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。

显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。

调整参数可以实现较高稳定度的显示。

动态显示节省了I/O口,降低了能耗。

2.2各方案缺点:

(1)数宇时钟方案:

方案一:

本方案采用Dallas公司的专用时钟芯片DS12887A。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:

本方案完全用软件实现数字时钟。

该方案具有硬件电路简单的特点。

但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。

而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。

(2)数码管显示方案:

方案一:

静态显示。

当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:

动态显示。

利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。

2.3对比选择

基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。

从节省I/O口和降低能耗出发,本设计采用方案二完成数码管显示。

本设计使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。

本系统采用单片机STC89C52作为本设计的核心元件,利用7段共阴LED作为显示器件,可显示时,分钟,秒。

并设置定时闹钟,定时时间到,扬声器发出声响,通过AT24C02与温度传感器DS18B20相连,用于检测温度并断电存储。

3系统设计

电路由下列部分组成:

时钟电路、复位电路、控制电路、LED显示,温度检测,报警电路,芯片选用STC89C52单片机。

3.1系统硬件设计

(1)STC89C52单片机:

STC89C52是一种带8K字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,俗称单片机。

该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

具有8K在系统可编程Flash存储器。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,是目前使用最广泛的一类单片机。

(1)系统原理图

(2)数码管显示电路:

单片机中通常使用7段LED,LED是发光二极管显示器的缩写。

LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳,配置灵活,与单片机接口方便而得到广泛应用。

LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符。

LED七段数码显示器由8个发光二极管组成显示字符,根据内部发光二极管的连接形式不同,LED有共阴极和共阳极两种,本系统采用共阴极。

LED的结构及连接如图所示:

LED显示原理

当选用共阴极的LED时,所有发光二极管阴极连在一起接地,当某个发光二极管的阳极加入高电平时,对应的二极管点亮。

因此要显示某字形就应使此字形的相应段的二极管点亮,实际上就是送一个用不同电平组合代表的数据字来控制LED的显示,此数据为字符的段码或称为字型码。

字型码与LED显示器各段的关系为

D7

D6

D5

D4

D3

D2

D1

D0

dp

g

f

e

d

c

b

a

表2-1

dp为小数点,字符0、1、2……F的段码如表2-2所示

字符

段码(共阴)

段码(共阳)

0

3FH

COH

1

06H

F9H

2

5BH

A4H

3

4FH

B0H

4

66H

99H

5

6DH

92H

6

7DH

82H

7

07H

F8H

8

7FH

80H

9

6FH

90H

A

77H

88H

B

7CH

83H

C

39H

C6H

D

5EH

A1H

E

79H

86H

F

71H

8EH

-

40H

BFH

.

80H

7FH

熄灭

00H

FFH

表2-2

下图是本系统采用的共阴极LED七段数码显示器:

(3)集成器件74HC573:

八个锁存器都是透明的D型锁存器,当使能G为高时,Q输出将随D输入而变。

当使能为低时,输出讲锁存在已建立的数据电平上。

输出控制不影响锁存器的内部工作,即老数据可以继续保持,甚至当输出被关闭时,新的数据也可以置入。

这种电路可以驱动大电容或低阻抗负载,可以与系统总线接口并驱动总线,而不需要外接口。

特别适用于缓冲寄存器,I/O通道,双向总线驱动器和工作寄存器。

74HC573引脚图:

(4)电源模块:

STC89C52RC的工作电压范围是:

3.3V~5.5V,次开发板没有设计专门的稳压电路,直接通过外部提供稳定的5V稳压电源供电。

(5)闹铃模块:

采用蜂鸣器闹铃,当到设定时间时,单片机向蜂鸣器送出低电平,蜂鸣器响铃。

采用蜂鸣器闹铃结构简单,只需要单路信号控制,发出的闹铃声音可以根据响和不响的不同的软件延时时间来控制。

(6)输入输出电路:

该系统输入电路采用的是P1口以及4个上拉电阻,其阻值为10千欧。

(7)温度检测电路:

采用美国DALLAS半导体公司推出的一种改进型智能温度传感器DS18B20作为检测元件,温度范围为-55~125ºC,最高分辨率可达0.0625ºC。

DS18B20可以直接读出被侧温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

将DS18B20的数据输入/输出端与单片机STC89X52端口相连,并将温度值通过P1端口显示出来。

STC89X52

温度传感器

串口通信

数码管显示

无线遥控

 

(8)单片机晶振电路:

51单片机内部的振荡电路是一个增益反相放大器,引线XYAL1和XTAL2分别为反相放大器的输入和内部时钟电路输入和来自反相放大器的输出,该反相放大器可以配置为片内振荡器。

晶振电路如下图所示。

(9)复位电路:

单片机小系统采用上电自动复位和手动按键复位两种方式实现系统的复位操作。

上电复位要求接通电源后,自动实现复位操作。

手动复位要求在电源接通的条件下,在单片机运行期间,如果发生死机,用按钮开关操作使单片机复位。

单片机要完成复位,必须向复位端输出并持续两个机器周期以上的高电平,从而实现复位操作。

上电自动复位通过电容C1充电来实现和限流电阻R2。

手动按键复位是通过按键将电阻R1与VCC接通来实现。

R1作为上拉电阻,当复位键按下是产生一个触发脉冲,进行复位操作。

(10)外部EEPROM电路:

24CO2是电可擦除PROM,采用256-bit的组织结构以及两线串行接口,电压可允许低至1.8V,待机电流和工作电流分别为1uA和1mA,它具有页写能力,每页为8字节。

其实在次开发板中,STC80C52已经具备8K的存储空间,已经没有必要加上24C02芯片,但是由于此芯片具有页写能力,可以进行程序的分页写入和读出,因此使用起来很方便。

外部EEPROM电路

(11)按键电路:

按键的开关状态通过一定的电路转换为高、低电平状态。

按键闭合过程在相应的I/O端口形成一个负脉冲。

闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。

抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。

为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。

本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。

3.2系统软件设计

(1)程序流程图:

 

中断服务程序

本实验中,T0的定时长度为0.01s,工作于方式1,计数1次,时长1us,故计数器计数10000次,进入中断,计数初值为65536-10000=55536=#0D8F0,装满定时器需要0.01s的时间,从而100次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。

包括日期显示的功能也是如此。

基于以上考虑,以下为定时中断流程图:

 

计数器T1工作于方式1,当调用响铃程序时,其计数功能开启,为音乐音调不同频率的方波的形成,提供延时。

其中断服务程序就是根据音调改变音乐方波输出口电平的高低,用语句CPL实现。

中断服务程序中日历的实现较为复杂,要考虑平年,闰年,特殊的2月,每月的天数的不尽相同。

具体的逻辑判断方法为:

首先,要考虑年份是不是闰年,闰年的判断方法是:

将年份除以100,若能整除,则将年份除以400,若还能整除,则为闰年,若不能,则为平年;若不能被100整除,则判断是否能被4整除,若能,则为闰年,若不能则为平年。

只有2月与平、闰年相关,因此在闰年和平年的子程序中,要判断是不是2月,若是则在相应的年中进行日期的增加,若不是则转入平时的月份。

其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月为每月30天。

日历进位判断流程图如下:

 

本实验用8个数码管,刚好能显示年,月,日,扫描显示与时间的扫描显示类似。

年比较特殊,由两个寄存器存储,个位,十位为0时,表明年数能被100整除,若此时千位,百位

组成两位数能被4整除,则年数被400整除,为闰年。

若十位,个位组成两位数能被4整除,则年数能被4整除,为闰年。

主程序

主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序,该段程序如下:

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable[]={

0xfc,0x60,0xda,0xf2,

0x66,0xb6,0xbe,0xe0,

0xfe,0xf6,0xee,0x3e,

0x9c,0x7a,0x9e,0x8e};

ucharcodetable1[]={

0xfd,0x61,0xdb,0xf3,

0x67,0xb7,0xbf,0xe1,

0xff,0xf7,0xef,0x3f,

0x9d,0x7b,0x9f,0x8f};//带小数的

ucharIRCOM[7];

uchartem_1[3];

uchartem_2[3];

uchartem_3[3];

uchartem_4[3];

ucharmonth,day,mode,num,num_day,flag,data_flag,

clock_flag,time_flag,flag_rom,b,c,time;charmiao,fen,shi,miao1,fen1,shi1;//miao1,fen1,shi1是闹钟的设置时间

uinttemper,year,tempe;

uchara1,a2,a3,a4,a5;

uinttem_hh=35000;//温度上限:

28度

uinttem_ll=15000;//温度下限:

21度

sbitwela=P1^7;

sbitdula=P1^6;

sbitled_hh=P1^0;

sbitled_h=P1^1;

sbitled_l=P1^3;

sbitled_ll=P1^4;

sbitk1=P2^0;//模式键

sbitk2=P2^1;//加键

sbitk3=P2^2;//减键

sbitk4=P2^3;

sbitk5=P2^4;

sbitk6=P3^2;//外部中断0调取历史温度和时间

sbitIRIN=P3^3;//红外接INT1

sbitbuzzer=P2^7;

sbitDQ=P3^7;//温度传感器DS18B20

sbitsda=P2^6;//24C02数据线

sbitscl=P2^5;//24C02时钟线

voiddelay(uintz);

voidinit();

voidback();

voidalarm_ring();

voiddisplay_time();//显示时间函数

voiddisplay_time1();

voiddisplay_data();//显示日期函数

voidpoint_time1();//标志闹铃时间

voidbuzze(ucharz);

voidkey_scan();

voiddelayus(uintx,uchary);

voiddisplay_tem(uchara,ucharb,ucharc,uchard,uchare);//显示温度函数

voiddisplay_tim_tem(uchartime,uchartem_h,uchartem_l);//显示历史温度和时间

voidreset();

voidwrite_byte(uchardate);/*DS18B20相关函数*/

ucharread_byte();/*DS18B20的相关函数*/

voidget_tem();/*DS18B20的获取相关函数*/

voidwarn(uints,ucharled);

voidtem_ctrl();

voiddelay_nop();

voidstart();//24C02根据时序的函数启动信号

voidstop();//24C02停止信号

voidrespons();//24C02应答信号

voidinit_rom();//24C02总线初始化

voidmaindelay();

voidwrite_byte_rom(uchardate);//24C02写一字节

ucharread_byte_rom();//24C02读一个字节

voidwrite_add(ucharaddress,uchardate);//24C02写数据到确定的地址

ucharread_add(ucharaddress);//24C02读地址数据

voiddelay(uintz)

{

uintx,y;

for(x=z;x--;x<0)

for(y=110;y--;y<0);

}

voiddelayus(uintx,uchary)

{uinti;ucharj;

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

for(j=y;j>0;j--);}

voidIRdelay(unsignedcharx)//x*0.14MS

{unsignedchari;

while(x--)

{for(i=0;i<13;i++){}

}}

voidinit()//系统总的初始化

{fen=miao=shi=shi1=fen1=miao1=mode=num=flag=data_flag=0;

year=2012;month=10;day=10;

buzzer=1;

wela=dula=0;

TMOD=0x01;

TH0=(65536-50000)/256;//要定时50ms

TL0=(65536-50000)%256;

EA=1;

ET0=1;//开启定时器0

TR0=1;//启动定时器0

TCON|=0x01;//触发方式为脉冲负边沿触发

EX0=1;//开外部中断0

EX1=1;//开外部中断1

IRIN=1;

init_rom();//24C02总线初始化

get_tem();}

voidbuzze(ucharz)

{uchari,j;

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

{buzzer=0;for(j=10;j>0;j--)

{maindelay();}//设置的主函数,即蜂鸣器在响的时候数码管显示日期和温度

buzzer=1;//蜂鸣器声音实际上连续的

}

}

/*******************************************

加天数

*******************************************voiddayadd()

{day++;

if((year%4==0&&year%100!

=0)||year%400==0){switch(month)

{case1:

if(day==32)day=1;break;

case2:

if(day==30)day=1;break;

case3:

if(day==32)day=1;break;

case4:

if(day==31)day=1;break;

case5:

if(day==30)day=1;break;

case6:

if(day==31)day=1;break;

case7:

if(day==32)day=1;break;

case8:

if(day==32)day=1;break;

case9:

if(day==31)day=1;break;

case10:

if(day==32)day=1;break;

case11:

if(day==31)day=1;break;

case12:

if(day==32)day=1;break;

}}

else

{switch(month)

{case1:

if(day==32)day=1;break;

case2:

if(day==29)day=1;break;

case3:

if(day==32)day=1;break;

case4:

if(day==31)day=1;break;

case5:

if(day==30)day=1;break;

case6:

if(day==31)day=1;break;

case7:

if(day==32)day=1;break;

case8:

if(day==32)day=1;break;

case9:

if(day==31)day=1;break;

case10:

if(day==32)day=1;break;

case11:

if(day==31)day=1;break;

case12:

if(day==32)day=1;break;

}}}

/*******************************************减天数

*******************************************/voiddayreduce()

{day--;

if((year%4==0&&year%100!

=0)||year%400==0)

{swi

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

当前位置:首页 > 工程科技 > 能源化工

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

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