电子时钟设计报告

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

电子时钟设计报告
一、设计目标
本设计主要是通过单片机从DS1302时钟芯片读取时间信息,并通过1602液晶显示出来,包括年、月、日、星期、
时、分、秒的显示。

二、工作原理
1.原理图
2.主要器件解说:
电源部分采取5V的直流电源为电路供电。

控制部分采用STC89C52单片机;DS1302来记录时间信息,显示部分是1602液晶显示。

3.工作原理:
(1)单片机部分
单片机就是用来控制DS1302和1602的,把DS1302的信息读出来送到1602液晶显示。

(2)D S1302部分
芯片封装形式
读数据的时序说明
写数据的时序说明
(3)1602部分
接口信号说明
RAM地址映射图
时序说明
三、调试过程及结果
用另一块单片机开发板将程序下载至单片机,接通电源,电源指示灯亮,同时1602液晶显示处于初始化状态,显示为
2010-03-18 Thu 10:30:00 ,接下来开始计时。

由于时间
紧迫并且自己掌握不是很熟练,所以没有涉及硬件调时,要想
调时可以利用软件编程来实现。

四、源程序
#include<reg52.h>
#define uchar unsigned char
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;
sbit SCL=P1^5;
sbit SDA=P1^6;
sbit RST=P1^7;
code uchar *day[7]={"Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
code uchar write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; code uchar read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; code uchar set_rtc_code[7]={0x00,0x30,0x10,0x04,0x18,0x03,0x10};
uchar read_rtc_code[7];
void Write_Ds1302_Byte(uchar temp)
{
uchar i;
for (i=0;i<8;i++)
{
SCL=0;
SDA=temp&0x01;
temp>>=1;
SCL=1;
}
}
void Write_Ds1302( uchar address,uchar Data )
{
RST=0;
SCL=0;
RST=1;
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(Data);
RST=0;
}
uchar Read_Ds1302 ( uchar address )
{
uchar i,temp,t;
RST=0;
SCL=0;
RST=1;
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
if(SDA==1)
temp|=0x80;
temp>>=1;
SCL=1;
}
RST=0;
t=temp/16;
temp=temp%16;
temp=temp+t*10;
return (temp);
}
void Read_RTC(void)
{
uchar i,*p;
p=read_rtc_address;
for(i=0;i<7;i++)
{
read_rtc_code[i]=Read_Ds1302(*p);
p++;
}
}
void Set_RTC(void)
{
uchar i,*p;
p=write_rtc_address;
for(i=0;i<7;i++)
{
Write_Ds1302(*p,set_rtc_code[i]);
p++;
}
}
void LCD_delay(void)
{
uchar i;
for(i=40;i>0;i--);
}
void LCD_en_command(uchar command) {
P2=command;
RS=0;
RW=0;
LCD_delay();
E=1;
}
void LCD_en_Data(uchar Data)
{
P2=Data;
RS=1;
RW=0;
E=0;
LCD_delay();
E=1;
}
void LCD_set_xy( uchar x, uchar y )
{
uchar address;
if (y == 0)
address = 0x80 + x;
else
address = 0xc0 + x;
LCD_en_command(address);
}
void LCD_write_char( unsigned x,uchar y,uchar Data) {
LCD_set_xy( x, y );
LCD_en_Data(Data);
}
void LCD_write_string(uchar X,uchar Y,uchar *s) {
LCD_set_xy( X, Y );
while (*s)
{
P2=*s;
LCD_en_Data(*s);
s++;
}
}
void LCD_init(void)
{
LCD_en_command(0x01);
LCD_en_command(0x38);
LCD_en_command(0x0c);
LCD_en_command(0x80);
LCD_en_command(0x01);
}
void Display(void)
{
LCD_write_char(0x0b,1,(read_rtc_code[0]%10)|0x30);
LCD_write_char(0x0a,1,(read_rtc_code[0]/10)|0x30);
LCD_write_char(0x08,1,(read_rtc_code[1]%10)|0x30);
LCD_write_char(0x07,1,(read_rtc_code[1]/10)|0x30);
LCD_write_char(0x05,1,(read_rtc_code[2]%10)|0x30);
LCD_write_char(0x04,1,(read_rtc_code[2]/10)|0x30);
LCD_write_char(0x09,0,(read_rtc_code[4]%10)|0x30);
LCD_write_char(0x08,0,(read_rtc_code[4]/10)|0x30);
LCD_write_char(0x06,0,(read_rtc_code[5]%10)|0x30);
LCD_write_char(0x05,0,(read_rtc_code[5]/10)|0x30);
LCD_write_char(0x03,0,(read_rtc_code[6]%10)|0x30);
LCD_write_char(0x02,0,(read_rtc_code[6]/10)|0x30);
LCD_write_string(0x0d,0,day[read_rtc_code[3]-1]);
LCD_write_string(0x09,1,":");
LCD_write_string(0x06,1,":");
LCD_write_string(0x07,0,"-");
LCD_write_string(0x04,0,"-");
LCD_write_string(0x00,0,"20");
}
void Initial(void)
{
LCD_init();
Write_Ds1302(0x8e,0x00);
Set_RTC();
Write_Ds1302(0x8e,0x80);
}
void main(void)
{
Initial();
while(1)
{
Read_RTC();
Display();
}
}。

相关文档
最新文档