当前位置:文档之家› 【完美升级版】智能电子钟(LCD)_应用电子专业综合毕业论文

【完美升级版】智能电子钟(LCD)_应用电子专业综合毕业论文

(此文档为word格式,下载后您可任意编辑修改!)

专业综合课程设计报告

题目:智能电子钟(LCD)

题目智能电子钟(LCD)

一、设计要求:

制作一个LCD显示的智能电子钟:

(1) 计时:秒、分、时、日、月、年、星期。

(2) 闰年自动判别。

(3) 时间、年、月、日、星期交替显示。

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

(6) 计时精度:误差≤1秒月(具有微调设置)。

二、方案论证:

本实验可采用并行时钟芯片(DS12C887)和串行时钟芯片(DS1302),DS1302要用户自己安装后备电池和串口通讯,要

32.768KHz的晶振,而DS12C887自带后备电池,并口通讯,无需

外围元件,并且DS12C887多了一个字节来记录世纪使用的,处在RAM的32H单元,但是其他的寄存器定义都相同。由于本实验用到了STC12C5A60S2直插40P封装的单片机、nokia5110液晶屏、独立式按键、四路2输入与门并且都是直插的,而且在实验室做PCB 只能是单层板,为了节约空间和简化电路于是就选用了串行时钟芯片DS1302。

三、理论设计:

用CAD软件绘制的硬件原理图

载端口,DOWN端口适用于四角插针式下载、BAT为备用电源端口。

CPU主控部分,此部分采用的是高速51系列的STC12C5A60S2的单片机,该芯片不仅运行速度快稳定驱动能力更大,还为用户提供了内部集成8位10位可调分辨率ADC模块(在此设计中有用到),1KB可擦写EEPROM本设

计中用其设计成可调闹钟功能存放闹钟值。

此图为串行数据nokia5110的LCD显示器模块,采用可控背光和可控电源有很好的节能效果。该显示器能显示汉字,字符,图片、并且处理显示数

据速度快。

DS1302具有闰年补偿。

处理按键按下的值来执行用户的操作。

此图为蜂鸣器模块此模块用于闹钟铃声设计,和开机提示。

此图为PCB版图

此图为PCB打印预览

软件流程图

yes其他键yes

按下目录键

NO

功能1(时间)

功能2(温度)

功能3(电压)

功能4(闹钟)

程序清单

完整C程序源代码

************************************************************************* *************

* 主程序:顶层程序

*

* 显示默认功能:时间日期显示;

*

* 调用子程序;

*

*

*

************************************************************************* **************

# include

{

system_inint(); 系统初始化;

Set_RTC();

while(1)

{

checkclock();

caidan(); 菜单显示;

if(menue==0)

{

if(ok==1)

{

LCD_clear(); 清屏幕

while(menue==0) 由此进入时钟功能

{

ok=0;

logo();

Read_RTC();读取时钟;

data_change();时钟数据处理

tiaozheng_flag();

date_time(); 显示年月日时分秒;

week();星期处理;

set_date_time();设置改变时间和日期;

powervcc();

checkclock();

}

LCD_clear(); 清屏幕

}

}

else if(menue==1) 由此进入温度检测功能{

if(ok==1)

{

LCD_clear(); 清屏幕

while(menue==1)

{

temperatuercheck();

ok=0;

}

LCD_clear(); 清屏幕

}

}

else if(menue==2) 由此进入电压测量功能{

if(ok==1)

{

LCD_clear(); 清屏幕

while(menue==2)

{

power();电量检测

ok=0;

}

LCD_clear(); 清屏幕

}

}

else if(menue==3)由此进入闹钟功能{

if(ok==1)

{

LCD_clear(); 清屏幕

while(menue==3)

{

clock();

ok=0;

checkclock();

}

LCD_clear(); 清屏幕

}

}

else {LCD_clear(); caidan();}

}

}

void extern0() interrupt 0 *外部中断0中断函数定义;*

{

key();

}

************************************************************************* *************

* 子程序:底层程序

*

* 功能:时间日期数据处理;

*

*

*

*

*

************************************************************************* **************

# include

}

******************************************************************

* 读时钟数据*

****************************************************************** void Read_RTC(void) 读取日历

{

unsigned char i,*p;

p=Read_RTC_address; 地址传递

for(i=0;i<7;i++) 分7次读取秒分时日月周年

{

l_tmpDate[i]=Read_Ds1302(*p);

p++;

}

}

****************************************************************** * 设定时钟数据* ****************************************************************** void Set_RTC(void) 设定日历

{

uchar i,*p,tmp;

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

{ BCD处理

tmp=l_tmpDate[i]10;

l_tmpDate[i]=l_tmpDate[i]%10;

l_tmpDate[i]=l_tmpDate[i]+tmp*16;

}

Write_Ds1302(0x8E,0X00); 关闭写保护;

p=Write_rtc_address; 传地址

for(i=0;i<7;i++) 7次写入秒分时日月周年

{

Write_Ds1302(*p,l_tmpDate[i]);

p++;

}

Write_Ds1302(0x8E,0x80); 打开写保护;

}

************************************************************************* *************

* 子程序:底层程序

*

* 功能:按键处理,键值显示;

*

*

*

*

*

************************************************************************* **************

# include "main.,shi,ri,yue,zhou,nian;*时间日期数值标志位;*

uchar clocktable[5]; 分,时,星期;

char ==0)

{ Delay10ms();

if(keydown==0)

{

LCD_BLA=1;

Delay10ms();

while(keydown==0);

key_flag--;

}

}

if(keymenue==0)

{

Delay10ms();

if(keymenue==0) 菜单选择标志位;{

Delay10ms();

while(keymenue==0);

LCD_BLA=1;

menue++;

if(menue>3)menue=0;

}

} if(keyok==0)

{

Delay10ms();

if(keyok==0) 确认标志位;{ Delay10ms();

while(keyok==0);

ok++;

if(ok>1)ok=0;

set=0;LCD_BLA=0;TR0 = 0;

}

}

if(set>=2)TR0 = 0;

EA=1;

}

void set_date_time()

{

if(set==2)

{

while(keyup==0|keydown==0);

{

miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];

miao=miao+key_flag;

if((key_flag<0)&(miao==0))miao=59;

if(miao>59)miao=0;

miao=miao%10+(miao10)*16;

Write_Ds1302(0x8E,0x00);

Write_Ds1302(0x80,miao);

Write_Ds1302(0x8E,0x80);

}

}

if(set==3)

{

while(keyup==0||keydown==0);

{

fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];

fen=fen+key_flag;

if(fen>59)

{

fen=0;

}

if((key_flag<0)&&(fen<0))

{

fen=59;

}

fen=fen%10+(fen10)*16;

Write_Ds1302(0x8E,0x00);

Write_Ds1302(0x82,fen);

Write_Ds1302(0x8E,0x80);

}

}

相关主题
文本预览
相关文档 最新文档