
2012-04-30 15:04
有这样一个题目:求一个为 51 单片机编写的 LCD 电子时钟的设计,简单就好 !
希望说一下怎么设计这个时钟,都需要些什么东西,最重要的——把这个设计需要的程序写出来。
设计的任务:
以单片机控制的时钟,在 LCD 显示器上显示当前的时间。
设计的基本要求:
1.使用文字型 LCD 显示器显示当前时间。
2.显示格式为“时时:分分:秒秒”。
3.用4个功能键操作来设置当前时间。各个功能键的功能如下:
K1:进入设置现在的时间。
K2:设置小时。
K3:设置分钟。
K4:确认完成设置。
4. 程序执行后工作指示灯 LED 闪烁,表示程序开始执行,LCD 显示“00:00:00”,然后开始计时。
题目链接:http://zhidao.baidu.com/question/416705477.html
//==================================================
提到设计时钟,很多人都想到了时钟芯片 DS1302,都说它简单、准确。其实,这是个误区。
仅仅使用一般的单片机,简单的编程,达到相同 DS1302 的准确度,并不是难事。
如果不要求计算平闰年、不要求分清大小月、不要求计算星期几,只是要求一个简单的时钟(及日历),用 DS1302,就是自寻烦恼。
大家可以打开题目链接,看看其中的一些答案,就可以看出使用 DS1302 是多么的繁琐了,简直就是一场噩梦。
做而论道以前就使用普通的单片机和 LCD1602 设计过《时钟与日历》,程序设计的非常合理,时间精度就完全取决于晶振的精度。设计出来的时钟,几个月都差不上一秒。
针对这个题目,做而论道翻出了以前的设计,删节了一些不需要的功能,设计出了符合题目要求的时钟,用 PROTEUS 仿真截图如下:
程序用 C 语言编写,全部代码如下:
//---------------------------------------------------
#include #define uchar unsigned char #define uint unsigned int #define KEY_IO P3 #define LCD_IO P0 sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2; sbit SPK = P1^2; sbit LED = P2^4; bit new_s, modify = 0; char t0, sec = 50, min = 59, hour = 23; char code LCD_line1[] = "Designed by ZELD"; char code LCD_line2[] = "Timer: 00:00:00 "; char Timer_buf[] = "23:59:50"; //--------------------------------------------------- void delay(uint z) {     } //--------------------------------------------------- v写指令 {  和R/W都为低电平时,写入指令  用EN输入一个高脉冲 } //--------------------------------------------------- v写数据 {  为高、R/W为低时,写入数据  用EN输入一个高脉冲 } //--------------------------------------------------- v写字符串 {   } //--------------------------------------------------- v填写显示缓冲区 {         } //--------------------------------------------------- uchar read_key(void) {                       if      (x1 == 0x7f)  return 0;             } //--------------------------------------------------- void Init() {                   TMOD = 0x01;   //T0定时方式1       TR0 = 1;       //启动T0     PT0 = 1;       //高优先级, 以保证定时精度     } //--------------------------------------------------- void main() {         //-------------------------------  如果出现了新的一秒, 修改时间         new_s = 0;    sec++;  sec %= 60;         if(!sec)  {   min++;  min %= 60;      写显示 //-------------------------------  整点报时           //-------------------------------  读出按键       switch(Key) {      //分别处理四个按键           } //--------------------------------------------------- void timer0(void) interrupt 1  //T0中断函数, 50ms执行一次 {       t0++; t0 %= 20;   //20, 一秒钟     } //===================================================呵呵,全部程序,也不过 120 行左右。不知道还能不能找到更简明的程序。 
