51单片机电子时钟设计报告

  • 格式:doc
  • 大小:308.50 KB
  • 文档页数:23

.

. 电子时钟实验报告

全部代码在文档末尾:51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行

目录:

一, 实验目的 ................................................................ 1

二,实验要求 ................................................................. 2

三,实验基本原理 ............................................................. 2

四,实验设计分析 ............................................................. 2

五,实验要现 ................................................................. 3

A.电路设计 ............................................................... 3

1. 整体设计 .......................................................... 3

2. 分块设计 .......................................................... 4

2.1 输入部分 ..................................................... 4

2.2 输出部分 ..................................................... 5

2.3 晶振与复位电路 ............................................... 6

B.程序设计 ............................................................... 6

B.1 程序总体设计 ..................................................... 6

B.2 程序主要模块 ..................................................... 7

五.实验总结及感想 ............................................................ 9

一, 实验目的

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来.

. 非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,得到了广泛的使用。

1. 学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。

2. 设计任务及要求 利用实验平台上LCD1602液晶显示屏, 设计带有闹铃功能的数字时钟

二,实验要求

A.基本要求:

1. 在LCD1602液晶显示屏上显示当前日期,时间。

2. 利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。闹玲时间到蜂鸣器发出声响,一分钟后闹铃停止。

B.扩展部分:

1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。

2.定时功能(设定一段时间长度,定时到后,闹铃提示)

C.可扩展部分:

1.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调)

2.可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。

三,实验基本原理

利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.05s中断一次并当作一个计数,设定定时1秒的中断计数初值为20,每中断一次中断计数初值加1,当减到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,是否一天到了,是否一个月到了,是否一年到了。

将时间在LCD液晶屏上显示,降低了程序的编写难度。LCD的固定显示特性是我们省去了数码管的动态扫描显示。

四,实验设计分析

针对要实现的功能,采用AT89S52单片机进行设计,AT89S52 单片机是一款低功耗,高性能CMOS8位单片机,片含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储.

. 器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。

首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解C语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!

五,实验要现

A.电路设计

1. 整体设计

此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用lcd1602显示,年份,月份,星期,小时、分钟和秒(日),使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。

电路的总体设计框架如下:

单片机 输入部分

晶振和复位 输出部分 . .

2. 分块设计

模块电路主要分为:输入部分、输出部分、复位和晶振电路。

2.1 输入部分

输入信号主要是各种模式选择和调整信号,由按键开关提供。以下为输入部分样例:

在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示: . .

2.2 输出部分

本电路的输出信号LCD的写入命令和写入数据,闹铃脉冲信号。

闹铃由P1.5端输出,模块如下:

. . 日期时间由LCD1602输出,模块如下:

2.3 晶振与复位电路

本实验单片机时钟用部时钟,模块如下:

复位电路为手动复位构成,模块如下:

B.程序设计

B.1 程序总体设计

本实验用汇编程序完成.

程序总的流程图如下: .

.

B.2 程序主要模块

中断服务程序:

/******************一秒定时中断函数*****************/

void timer0() interrupt 1 using 1

{

ET0=0; //关闭定时器T0中断允许位

TR0=0; //关闭定时器T0

jiamiao++;

TH0=(65536-50000)/256; //设定每次中断间隔50ms

TL0=(65536-50000)%256;

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

ET0=1; //打开定时器T0中断允许位

}

本实验中,计数器T0有运用,其中T0中断为时钟定时所用,T1中断用于秒表的准确性保证。T0的定时长度为0.05s,工作于方式1,计数1次,时长1us,故计数器计数20次,进入中断,装满定时器需要0.05s的时间,从而20次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。包括日期显示的功能也是如此。另外,由于要实现倒计时功能,因此在中断程序中还要加入加一的寄存器,需要时将其进行显示。

程序中日历的实现较为复杂,要考虑平年,闰年,特殊的2月,每月的天数的不尽相同。具体的逻辑判断方法为:首先,要考虑年份是不是闰年,闰年的判断方法是:将年份除以100,若能整除,则将年份除以400,若还能整除,则为闰年,若不能,则为平年;若不能被100整除,则判断是否能被4整除,若能,则为闰年,若不能则为平年。只有2月与平、闰年相关,因此在闰年和平年的子程序中,要判断是不是2月,若是则在相应的年中进行日期的增加,若不是则转入平时的月份。其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月为每月30天。

显示子程序:

/********刷新液晶屏显示容子函数*********/

void brush_lcd()

{ .

. static uchar old_second=0x01;

if(dis_val[6]!=old_second)

{

old_second=dis_val[6]; //刷新原来的"秒"为新"秒"值

in_command(0x80); //设定第一行字符串起始显示位置

in_data('2'); //年的千位

in_data('0'); //年的百位

in_data(num_tab[dis_val[0]/16]); //显示"年"

in_data(num_tab[dis_val[0]%16]);

in_data('-'); //显示分隔符

in_data(num_tab[dis_val[1]/16]); //显示"月"

in_data(num_tab[dis_val[1]%16]);

in_data('-'); //显示分隔符

in_data(num_tab[dis_val[2]/16]); //显示"日"

in_data(num_tab[dis_val[2]%16]);

in_data(' '); //显示分隔符

in_data('['); //显示分隔符

week_disp(dis_val[3]); //LCD1602显示星期值

in_data(']'); //显示分隔符