电子时钟(LCD显示)讲解

  • 格式:doc
  • 大小:147.50 KB
  • 文档页数:15

下载文档原格式

  / 15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电气工程及自动化专业

单片机原理及应用课程设计报告

姓名:XXXXXX

学号:XXXXXXX

专业班级:XXXXXX

题目:电子时钟(LCD显示)

电气与电子工程学院

二〇一四年十二月三十日

目录

一、设计目的 (2)

二、设计任务和要求 (2)

三、设计原理分析 (2)

四、硬件资源及其分配 (3)

五、硬件图 (4)

六、程序框图 (5)

七、程序 (7)

八、调试运行 (13)

九、仿真截图 (13)

十、设计心得体会 (14)

一、设计目的

1、设计要求以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时间。

2、 使用字符型LCD 显示器显示当前时间。显示格式为“时时:分分:秒秒”。

3、用4个功能键操作来设置当前时间。

4、熟悉掌握proteus 编成软件以及keil 软件的使用 二、设计任务与要求

本设计以AT89C51单片机为核心,通过时钟程序的编写,并在LCD 显示器上显示出来。该编程的核心在于定时器中断及循环往复判断是否有按键操作,并对每个按键的操作在LCD 显示器上作出相应的反应。由于LCD 显示器每八位对应一个字符,故把秒、分、时的个位和十位分开表示。

该课题中有四个控制开关KM1、KM2、KM3、KM4分别控制时、分、秒、确定的调整,时间按递增的方式调整,每点一次按钮则相应的时间个位加以,且时间调整不干扰其他为调整时间的显示。 三、设计原理分析

1、按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

图一 系统总原理图

2、软件主要完成功能

(1)显示时间程序

用软件调节时间,通过程序的调节,最后用LED现实时钟

(2)调节时间程序

按键调节时间,能实现时、分的调节

3、软件设计主要流程

时间控制程序

时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。

四、硬件资源及原理图

AT89C51芯片

AT89C51 是美国ATMEL 公司生产的8 位Flash ROM 单片机。其最突出的优点是片内ROM 为Flash ROM,可擦写1000 次以上,应用并不复杂的通用ROM 写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM 二级保密系统。因此可灵活应用于各种控制领域。

AT89C51 包含以下一些功能部件:

1. 一个8 位CPU ;

2. 一个片内振荡器和时钟电路;

3. 4KB Flash ROM ;

4. 128B 内RAM;

5. 可寻址64KB 的外ROM 和外RAM 控制电路;

6. 两个16 位定时/计数器;

7. 21 个特殊功能寄存器;

8. 4 个8 位并行I/O 口;

9. 一个可编程全双工串行口;

10. 5 个中断源,可设置成2 个优先级。

AT89C51 单片机一般采用双列直插DIP 封装,共40 个引脚,图2-1 为其引脚排列图。40 个引脚大致可分为4 类:电源、时钟、控制各I/O 引脚

五、硬件图

六、程序框图

七、程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}

sbit K1 =P0^0;

sbit K2 =P0^1;

sbit K3 =P0^2;

sbit K4 =P0^3;

sbit SPK=P3^0;

sbit RS =P2^0;

sbit RW =P2^1;

sbit E =P2^2;

uchar code Str1[] = " Current Time "; //一下两个字符串的串长均为16

uchar code Str2[] = "Set New Time... ";

uchar HMS_String[]=" 00:00:00 ";//带显示的时间串

bit Settime=0; //是否修改时间

bit Change_H_or_M =1;//1表示修改时.0表示修改分

uchar MilliSecond,Hour =0,Minute=0, Second =0;

//延时函数

void DelayMS(uint x)

{

uchar i;

while(x--) for(i=0;i<120;i++);

}

//LCD忙状态检测

bit LCD_Busy_Check()

{

bit result;

RS = 0;RW = 1;E = 1;DelayNOP();result = (bit)(P0 & 0x80);E = 0;

return result;

}

//写LCD命令

void LCD_Write_Command(uchar cmd)

{

while(LCD_Busy_Check());//判断LCD是否忙碌

RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = cmd; DelayNOP();

E = 1;DelayNOP();E = 0;

}

//设置LCD显示位置

void LCD_Set_Pos(uchar pos)

{

LCD_Write_Command(pos | 0x80);

}

//写LCD数据

void LCD_Write_Data(uchar dat)

{

while(LCD_Busy_Check());//判断LCD是否忙碌

RS = 1;RW = 0;E = 0;

P0 = dat; DelayNOP();

E = 1;DelayNOP();E = 0;

}

//LCD初始化

void LCD_Initialize()

{

LCD_Write_Command(0x38);DelayMS(1);

LCD_Write_Command(0x0c);DelayMS(1);

相关主题