很多人估计是把这个当着毕业设计来做或者是课程设计,但是为何年年都是这个题目,年年都有这么多人来问这样的问题呢。我想不是同学们的错,学校的教育制度有很大一部分责任。到底是孰对孰错这里我不想去追问,做好自己本分的事情,没事的时候写一写Blog,希望你们做这个电子时钟真的能学到一点东西,这里上传两个比较经典的例子。
PS:这两个例子绝对是通过调试的,不存在问题的不管是硬件电路还是程序部分。当然我希望你们可以尝试着改改,这样才能体会的更深刻些!
手头没有相机不然拍几张实物照片,显得有点无图无真相的感觉!
51单片机制作电子时钟,这里提供两个例子(一个LED的一个LCD的涵盖了两个电子钟的方向):
声明一下,数码管的是电脑圈圈的作品比较典型,所以这里引用了一下
电脑圈圈版本(LED电子时钟):
硬件电路

程序:

程序部分我上传到我的网盘里面了这里就不PS出来了,文章字数有限制.
#include "main.h"
#include "LED.H"
#include "keyboard.h"
#include "timer.h"
void system_initial(void) //系统初始化
{
TMOD=0x11; //定时器工作在模式1
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
EA=1; //开总中断
year=05;
month=06;
day=01; //日期初始化为2005年6月1日
}
void main(void) //主函数
{
system_initial(); //系统开机初始化
while(1)
{
scan_keyboard(); //键盘扫描
timer(); //时钟功能
}
}
这里在说一下圈圈是个电脑天才,程序风格很值得大家去学习,看看人家的程序Main中直接调用LED、KeyBoard、Timer(仔细体会一下吧)
个人版本(LCD电子时钟):
硬件电路图

这个带DS18B20的温度显示。
主程序
#include <REG51.H>
#include <intrins.h>
//#include "LCD1602.h"
//#include "DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚
sbit DS1302_IO = P1^6; //实时时钟数据线引脚
sbit DS1302_RST = P1^5; //实时时钟复位线引脚
sbit wireless_1 = P3^0;
sbit wireless_2 = P3^1;
sbit wireless_3 = P3^2;
sbit wireless_4 = P3^3;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
sbit Set = P2^0; //模式切换键
sbit Up = P2^1; //加法按钮
sbit Down = P2^2; //减法按钮
sbit out = P2^3; //立刻跳出调整模式按钮
sbit DQ = P1^0; //温度传送数据IO口
char done,count,temp,flag,up_flag,down_flag;
uchar temp_value; //温度值
uchar TempBuffer[5],week_value[2];
void show_time(); //液晶显示程序
/***********1602液晶显示部分子程序****************/
//Port Definitions**********************************************************
sbit LcdRs = P2^5;
sbit LcdRw = P2^6;
sbit LcdEn = P2^7;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数**************************************************************************
unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
main()
{
flag=1; //时钟停止标志
LCD_Initial(); //液晶初始化
Init_DS18B20( ) ; //DS18B20初始化
Initial_DS1302(); //时钟芯片初始化
up_flag=0;
down_flag=0;
done=0; //进入默认液晶显示
wireless_1=0;
wireless_2=0;
wireless_3=0;
wireless_4=0;
while(1)
{
while(done==1)
keydone(); //进入调整模式
while(done==0)
{
show_time(); //液晶显示数据
flag=0;
Setkey(); //扫描各功能键
}
}
}
添加LCD1602和DS1302的头文件即可,程序也上传至我的网盘了!