基于单片机的实时时钟.docx
《基于单片机的实时时钟.docx》由会员分享,可在线阅读,更多相关《基于单片机的实时时钟.docx(12页珍藏版)》请在冰豆网上搜索。
基于单片机的实时时钟
基于单片机的ds1302实时时钟
一、设计目的
本方案设计LCD1602显示电话拨号按键显示的实验,使用基于AT89C51单片机,在lcd1602上显示按键的数字,最多依次显示11位数据,按下数据蜂鸣器会发出声音。
二、摘要:
通过lcd1602显示电话按键显示的数字,按下键盘,蜂鸣器会发出声音进行提示,本次lcd1602最多显示11位数据。
程序设计使用模块化设计
关键词:
单片机,键盘,蜂鸣器,lcd1602系统
三、硬件电路设计
1、单片机模块设计
本次设计采用的是单片机AT89C51。
芯片共有40个引脚,引脚的排列顺序为从靠芯片的缺口,如图3.1所示。
左边那列逆时针数起,依次为1,2,3.....40,其中芯片的1脚顶上有一个凹点。
在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。
图AT89C51管脚图
AT89C51单片机共有4组8位可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位,共32根。
每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品时就是利用这些可编程引脚来实现我们想要的功能。
P0口:
8位双向I/O口线,名称为P0.0-P0.7;
P1口:
8位准双向I/O口线,名称为P1.0-P1.7;
P2口:
8位准双向I/O口线,名称为P2.0-P2.7;
P3口:
8位准双向I/O口线,名称为P3.0-P3.7。
本文单片机模块如图所示,主要是由单片机芯片与晶振和复位电路组成的。
是由单片机来控制整个系统,让我们的系统可以正常的运行。
2、显示模块
LM016L液晶模块采用HD44780控制器,HD44780具有功能较强而又简单的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用4位或8位并行传输两种方式,HD44780控制器是由2个8bit的寄存器、显示数据存储(DDRAM)、指令寄存器(IR)、RAM(DR)、地址计数器RAM(AC)、忙标志(BF)、字符发生器ROMA(CGOROM)以及字符发生器RAM(CGRAM)组成。
其中,DR是用来寄存数据的;IR是用来寄存指令码的,它只能够写入而不能够读出。
其数据是由内部操作自动地写入到CGRAM和DDRAM中来,或者是暂存从CGRAM以及DDRAM中读出的数据,BF为1时,LED模块工作于内部模式,既不会接受数据也不会响应外部的操作指令,DDTAM用来存储显示的字符,能存储80个字符码,CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4.CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LM016L液晶模块的引脚图如图3.5所示。
图3.51601引脚图
LM016L引脚介绍:
Vss(1脚):
一般接地。
Vdd(2脚):
接电源。
Vee(3脚):
LED显示器对比度调整端口,接地时,其对比度达到最高(当对比度过高时,就会产生“鬼影”,若要正常工作,则可以通过使用一个大小为10K的电位器来调整对比度),接电源时,其对比度降至最弱。
RS(4脚):
RS是寄存器选择端口。
当接低电平时,选择指令寄存器;接高电平时,选择数据寄存器。
R/W(5脚):
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
E(6脚):
E(或EN)端为使能(enable)端,下降沿使能。
Lcd1602与单片机的接口
3、ds1302时钟芯片
DS1302是DALLAS公司推出的涓流充电时钟芯片。
内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。
DS1302芯片广脚介绍:
X1、X2为32.768KHz晶振管脚。
GND 为地。
RST复位脚。
I/O数据输入/输出引脚。
SCLK串行时钟。
Vcc1,Vcc2电源供电管脚。
与单片机连接的信号线为:
DS1302_SCLK 接P3^6;
实时时钟时钟线引脚 DS1302_IO 接P3^4;
实时时钟数据线引脚 DS1302_RST 接P3^5; 实时时钟复位线引脚
特别注意DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。
即单片机对SCLK咬先送高电平,再送低电平。
数据时通过IO进行传送的。
单片机与ds1302接口
四、软件程序模块设计
1、Lcd1602模块程序
Lcd1602.h
#ifndef__LCD1602_H__
#define__LCD1602_H__
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^6;
sbitrw=P2^5;
sbiten=P2^7;
voiddelay(ucharms);
voidbusy_wait();
voidwrite_lcd_command(ucharcmd);
voidwrite_lcd_data(uchardat);
voidinit_lcd();
voidlcd_showstring(ucharr,ucharc,uchar*str);
#endif
Lcd1602.c
#include
codeucharddram[]={0x80,0xc0};
voiddelay(ucharms)
{
uchari;
while(ms--)
for(i=0;i<10;i++);
}
voidbusy_wait()
{
ucharlcd_status;
do
{
P0=0xff;
en=0;rs=0;rw=1;
en=1;lcd_status=P0;
en=0;
}while(lcd_status&0x80);
}
voidwrite_lcd_command(ucharcmd)
{
busy_wait();
en=0;rs=0;rw=0;
P0=cmd;
en=1;_nop_();en=0;
}
voidwrite_lcd_data(uchardat)
{
busy_wait();
en=0;rs=1;rw=0;
P0=dat;
en=1;_nop_();en=0;
}
voidinit_lcd()
{
write_lcd_command(0x38);delay
(1);
write_lcd_command(0x01);delay
(1);
write_lcd_command(0x06);delay
(1);
write_lcd_command(0x0c);delay
(1);
}
voidlcd_showstring(ucharr,ucharc,uchar*str)
{
uchari=0;
write_lcd_command(ddram[r]|c);
for(i=0;i<16;i++)
write_lcd_data(str[i]);
//for(;i<16;i++)
//write_lcd_data('');
}
2、ds1302模块程序
Ds1302.h
#ifndef__DS1302_H__
#define__DS1302_H__
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardatatime[7],write_addr[7];
sbitio=P3^4;
sbitsclk=P3^6;
sbitrst=P3^5;
voidds1302_write(ucharaddr,uchardat);
uchards1302_read(ucharaddr);
voidds1302_init();
voidds1302_readtime();
#endif
Ds1302.c
#include
uchardatatime[7]={0,0x10,0x16,0x21,0x02,0x07,0x16};//存取数据
voidds1302_write(ucharaddr,uchardat)
{
ucharn;
sclk=0;
_nop_();
rst=1;
_nop_();
for(n=0;n<8;n++)
{
io=addr&0x01;
addr>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
for(n=0;n<8;n++)
{
io=dat&0x01;
dat>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
rst=0;
_nop_();
}
uchards1302_read(ucharaddr)
{
ucharn,dat,dat1;
sclk=0;
_nop_();
rst=1;
_nop_();
for(n=0;n<8;n++)
{
io=addr&0x01;
addr>>=1;
sclk=1;
_nop_();
sclk=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++)
{
dat1=io;
//dat=dat>>1;
//dat|=dat1<<7;
dat=(dat1<<7)|(dat>>1);
sclk=1;
_nop_();
sclk=0;
_nop_();
}
rst=0;
_nop_();
sclk=1;
_nop_();
io=0;
_nop_();
io=1;
_nop_();
returndat;
}
voidds1302_init()
{
ucharn,addr=0x80;
ds1302_write(0x8e,0x00);
for(n=0;n<7;n++)
{
ds1302_write(addr,datatime[n]);
addr+=2;
}
ds1302_write(0x8e,0x80);
}
voidds1302_readtime()
{
ucharn,addr=0x81;
for(n=0;n<7;n++)
{
datatime[n]=ds1302_read(addr);
addr+=2;
}
}
3、主函数程序模块设计
#include
#defineucharunsignedchar
#defineuintunsignedint
uchar*week[]={"sun","mon","tus","wen","thu","fri","sat"};
ucharlcd_buf_1[]="data00-00-00";
ucharlcd_buf_2[]="time00:
00:
00";
externvoidds1302_readtime();
externds1302_init();
externvoidinit_lcd();
externvoidlcd_showstring(ucharr,ucharc,uchar*str);
externuchardatatime[7];
voidformat_datatime(uchard,uchar*a)
{
*a=(d>>4)+'0';*(a+1)=(d&0x0f)+'0';
}
voidmain()
{
init_lcd();
//ds1302_init();
while
(1)
{
ds1302_readtime();
format_datatime(datatime[6],lcd_buf_1+5);
format_datatime(datatime[4],lcd_buf_1+8);
format_datatime(datatime[3],lcd_buf_1+11);
strcpy(lcd_buf_1+13,week[datatime[5]-1]);
//
format_datatime(datatime[2],lcd_buf_2+5);
format_datatime(datatime[1],lcd_buf_2+8);
format_datatime(datatime[0],lcd_buf_2+11);
lcd_showstring(0,0,lcd_buf_1);
lcd_showstring(1,0,lcd_buf_2);
}
}
五、模拟仿真图
六.参考文献
[1]欧伟明,何静,凌云,刘剑.单片机原理与应用系统设计[M].北京:
电子工业出版社,2009:
268-298.
[2]楼然苗,李光飞.单片机课程设计指导[M].北京:
北京航空航天大学出版社,2007.7:
15-36.
[3]林伸茂.8051单片机彻底研究——实习篇[M].北京:
中国电力出版社,2006:
12-38.
[4]张萌,和湘,姜斌.单片机应用系统开发综合实例[M].北京:
清华大学出版社,2007.7:
23-46.
[5]鲍可.C8051F单片机原理及应用[M].北京:
中国电力出版社,2006.1:
56-65
[6]谭浩强.C程序设计[M].北京:
清华大学出版社,2005:
18-62.
[7]彭伟单片机C语言程序设计实训100例—基于8051+proteus仿真2012.10
[8]赵广元proteus辅助的单片机原理实践——基础设计、课程设计。
毕业设计