以AT89C51单片机为核心制作一个LCD显示的智.docx

上传人:b****6 文档编号:7781896 上传时间:2023-01-26 格式:DOCX 页数:17 大小:91.15KB
下载 相关 举报
以AT89C51单片机为核心制作一个LCD显示的智.docx_第1页
第1页 / 共17页
以AT89C51单片机为核心制作一个LCD显示的智.docx_第2页
第2页 / 共17页
以AT89C51单片机为核心制作一个LCD显示的智.docx_第3页
第3页 / 共17页
以AT89C51单片机为核心制作一个LCD显示的智.docx_第4页
第4页 / 共17页
以AT89C51单片机为核心制作一个LCD显示的智.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

以AT89C51单片机为核心制作一个LCD显示的智.docx

《以AT89C51单片机为核心制作一个LCD显示的智.docx》由会员分享,可在线阅读,更多相关《以AT89C51单片机为核心制作一个LCD显示的智.docx(17页珍藏版)》请在冰豆网上搜索。

以AT89C51单片机为核心制作一个LCD显示的智.docx

以AT89C51单片机为核心制作一个LCD显示的智

以AT89C51单片机为核心-制作一个LCD显示的智

第6章 智能电子钟的设计

6.1功能要求

1.设计要求

以AT89C51单片机为核心,制作一个LCD显示的智能电子钟:

(1)计时:

秒、分、时、天、周、月、年。

(2)闰年自动判别。

(3)五路定时输出,可任意关断(最大可到16路)。

(4)时间、月、日交替显示。

(5)自定任意时刻自动开/关屏。

(6)计时精度:

误差≤1秒/月(具有微调设置)。

(7)键盘采用动态扫描方式查询。

所有的查询、设置功能均由功能键K1、K2完成。

2.工作原理

本设计采用市场上流行的时钟芯片DS1302进行制作。

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。

实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力。

DS1302时钟芯片的主要功能特性:

(1)能计算2100年之前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年的天数可自动调整;时钟可设置为24或12小时格式。

(2)31B的8位暂存数据存储RAM。

(3)串行I/O口方式使得引脚数量最少。

(4)DS1302与单片机之间能简单地采用同步串行的方式进行

通信,仅需3根线。

(5)宽范围工作电压2.0-5.5V。

(6)工作电流为2.0A时,小于300nA。

(7)功耗很低,保持数据和时钟信息时功率小于1mW。

6.2方案论证

6.3系统硬件电路的设计

……

 

 

6.4系统程序的设计

write_com_date(0xc7,0x30+minute%10);

write_com_date(0xc6,0x30+minute/10);

hour=read1302(0x85);

write_com_date(0xc4,0x30+hour%10);

write_com_date(0xc3,0x30+hour/10);

day=read1302(0x87);

write_com_date(0x8a,0x30+day%10);

write_com_date(0x89,0x30+day/10);

week=read1302(0x8b);

write_com_date(0xcd,0x30+week%10);

month=read1302(0x89);

write_com_date(0x87,0x30+month%10);

write_com_date(0x86,0x30+month/10);

year=read1302(0x8d);

write_com_date(0x84,0x30+year%10);

write_com_date(0x83,0x30+year/10);

}

voidkeyscan()//修改调整时间日期

{

if(key1==0)

{

delay(10);

if(key1==0)

{

pos_flag++;

while(!

key1);

keyflag=1;

switch(pos_flag)

{

case1:

write_com(0x80+4);//年

write_com(0x0f);//光标闪烁

break;

case2:

write_com(0x80+7);//月

break;

case3:

write_com(0x80+10);//日

break;

case4:

write_com(0x80+0x40+0x0d);//星期

break;

case5:

write_com(0x80+0x40+4);//时钟

break;

case6:

write_com(0x80+0x40+7);//分钟

break;

case7:

write_com(0x80+0x40+10);//秒钟

break;

default:

break;

}

if(pos_flag==8)//pos_flag=8则退出调整

{

pos_flag=0;

keyflag=0;//按键标识清零

delay(5);

settime();

write_com(0x0c);//关光标

}

}

}

if(key2==0)//调节加键,按下(低电平)就加

{

delay(15);

if(key2==0)

{

while(!

key2);

switch(pos_flag)

{

case1:

year++;

if(year==99)

year=0;

write_com_date(0x84,0x30+year%10);

write_com_date(0x83,0x30+year/10);

break;

case2:

month++;

if(month==13)

month=1;

write_com_date(0x87,0x30+month%10);

write_com_date(0x86,0x30+month/10);

break;

case3:

day++;

if((year%4==0)&&(month==2))//闰年二月29天

{

if(day==30)

day=1;

}

if((year%4!

=0)&&(month==2))//平年二月28天

{

if(day==29)

day=1;

}

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月31天

{

if(day==32)

day=1;

}

if(month==4||month==6||month==9||month==11)//小月30天

{

if(day==31)

day=1;

}

write_com_date(0x8a,0x30+day%10);

write_com_date(0x89,0x30+day/10);

break;

case4:

week++;

if(week==8)

week=1;

write_com_date(0xcd,0x30+week);

break;

case5:

hour++;

if(hour==24)

hour=0;

write_com_date(0xc4,0x30+hour%10);

write_com_date(0xc3,0x30+hour/10);

break;

case6:

minute++;

if(minute==60)

minute=0;

write_com_date(0xc7,0x30+minute%10);

write_com_date(0xc6,0x30+minute/10);

break;

case7:

second++;

if(second==60)

second=0;

write_com_date(0xca,0x30+second%10);

write_com_date(0xc9,0x30+second/10);

break;

default:

break;

}

}

}

if(key3==0)

{

delay(15);

if(key3==0)

{

while(!

key3);

switch(pos_flag)

{

case1:

year--;

if(year==0)

year=99;

write_com_date(0x84,0x30+year%10);

write_com_date(0x83,0x30+year/10);

break;

case2:

month--;

if(month==0)

month=12;

write_com_date(0x87,0x30+month%10);

write_com_date(0x86,0x30+month/10);

break;

case3:

day--;

if((year%4==0)&&(month==2))//闰年二月29天

{

if(day==0)

day=29;

}

if((year%4!

=0)&&(month==2))//平年二月28天

{

if(day==0)

day=28;

}

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月31天

{

if(day==0)

day=31;

}

if(month==4||month==6||month==9||month==11)//小月30天

{

if(day==0)

day=30;

}

write_com_date(0x8a,0x30+day%10);

write_com_date(0x89,0x30+day/10);

break;

case4:

week--;

if(week==0)

week=7;

write_com_date(0xcd,0x30+week);

break;

case5:

hour--;

if(hour==0)

hour=24;

write_com_date(0xc4,0x30+hour%10);

write_com_date(0xc3,0x30+hour/10);

break;

case6:

minute--;

if(minute==0)

minute=59;

write_com_date(0xc7,0x30+minute%10);

write_com_date(0xc6,0x30+minute/10);

break;

case7:

second--;

if(second==0)

second=59;

write_com_date(0xca,0x30+second%10);

write_com_date(0xc9,0x30+second/10);

break;

default:

break;

}

}

}

}

voidmain()

{

init_lcd();

delay

(2);

init_ds1302();

delay

(2);

Disp_1602(1,0,"20--week");

Disp_1602(5,1,":

:

");

while

(1)

{

if(keyflag==0)

{

display();

}

keyscan();

}

}

 

#ifndef_lcd_h_

#define_lcd_h_

#include

 

#defineucharunsignedchar

#defineuintunsignedint

sbitlcdrs=P2^0;

sbitlcdrw=P2^1;

sbitlcden=P2^2;

voiddelay(ucharms)

{

uchari;

for(;ms>0;ms--)

for(i=110;i>0;i--);

}

voidwrite_com(ucharcom)//写指令

{

lcden=0;

lcdrs=0;

lcdrw=0;

P0=com;

delay

(1);

lcden=1;

delay

(1);

lcden=0;

}

voidwrite_data(uchardate)//写数据

{

lcden=0;

lcdrs=1;

lcdrw=0;

P0=date;

delay

(1);

lcden=1;

delay

(1);

lcden=0;

}

voidwrite_com_date(ucharadd,uchardate)

{

write_com(add);

delay

(1);

write_data(date);

}

voidDisp_1602(ucharx,uchary,uchar*p)

{

while(*p)

{

if(y==0)x|=0x80;

elsex|=0xc0;

write_com(x);

delay(5);

write_data(*p);

x++;

p++;

}

}

voidinit_lcd()

{

delay(15);

write_com(0x38);

delay(15);

write_com(0x38);

delay(5);

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

}

#endif

 

#ifndef_ds1302_h_

#define_ds1302_h_

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitsclk=P1^1;

sbitio=P1^0;

sbitrst=P1^2;

sbitACC_7=ACC^7;

voidwrite1302(ucharadd,uchardate)//写入地址、数据

{

uchari;

rst=0;

sclk=0;

rst=1;

for(i=0;i<8;i++)

{

sclk=0;

io=add&0x01;

add>>=1;

sclk=1;

}

for(i=0;i<8;i++)

{

sclk=0;

io=date&0x01;

date>>=1;

sclk=1;

}

rst=0;

}

ucharread1302(ucharadd)//读地址、数据

{

uchari,dat1,dat2;

rst=0;

sclk=0;

rst=1;

for(i=0;i<8;i++)

{

sclk=0;

io=add&0x01;

add>>=1;

sclk=1;

}

for(i=0;i<8;i++)

{

ACC_7=io;

sclk=1;

ACC>>=1;

sclk=0;

}

rst=0;

sclk=1;

dat1=ACC;

dat2=dat1/16;

dat1=dat1%16;

dat1=dat2*10+dat1;

returndat1;

}

voidinit_ds1302()

{

if(((read1302(0x81))&0x0f)==1)

{

write1302(0x8e,0x00);//关闭写保护

}

}

#endif……

6.5调试及性能分析

6.5.1调试与测试

……

6.5.2性能分析

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1