基于凌阳单片机的电子时钟设计Word格式文档下载.docx

上传人:b****6 文档编号:19265734 上传时间:2023-01-04 格式:DOCX 页数:24 大小:352.31KB
下载 相关 举报
基于凌阳单片机的电子时钟设计Word格式文档下载.docx_第1页
第1页 / 共24页
基于凌阳单片机的电子时钟设计Word格式文档下载.docx_第2页
第2页 / 共24页
基于凌阳单片机的电子时钟设计Word格式文档下载.docx_第3页
第3页 / 共24页
基于凌阳单片机的电子时钟设计Word格式文档下载.docx_第4页
第4页 / 共24页
基于凌阳单片机的电子时钟设计Word格式文档下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

基于凌阳单片机的电子时钟设计Word格式文档下载.docx

《基于凌阳单片机的电子时钟设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于凌阳单片机的电子时钟设计Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。

基于凌阳单片机的电子时钟设计Word格式文档下载.docx

系统具有简单清晰的操作界面,能够准确显示时间以及日期,并且实现同步播报功能,可随时进行时间调整。

3、系统设计

3.1小组分工:

本小组成员有赵红,王瑞、吴勃庆、王鹏。

组长为赵红,其中小组四人共同设计主框架、搭建硬件电路;

王瑞和吴勃庆负责主程序的编写,赵红和王鹏负责Lcd子程序部分以及中断部分;

所有组员分工明确,齐心协力共同完成本次课程设计。

3.2硬件设计

3.2.1SPCE061A单片机实验环境

图1、试验箱

图2总体接线

图3PLCD501模组的硬件平面图

这一模块可以使用lcd或者led数码管来实现。

我组最后选择用lcd液晶显示来显示时间以及日期。

之所以选择lcd来实现,是因为它具有很多优点。

低压微功耗,平板型结构,被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳)而且显示信息量大(因为像素可以做得很小)无电磁辐射(对人体安全,利于信息保密)。

具体的实现方法是利用C语言的编程(代码见程序system.c)。

下面的硬件设计将详细的介绍lcd的模块的接口电路以及具体的接线方法。

3.2.2模组的内部设置的点阵图

图4模组的内部设置的点阵图

3.2.3Lcd的电路

这部分的主要接线如下:

IOA8-15接液晶显示模块DB0-DB7

IOB4接液晶显示模块AO

IOB5接液晶显示模块的R/W

IOB6接液晶显示模块的EP

DB0-DB7为双向数据口,AO为数据/使命控制位,R/w为读/写信号,EP是全能端(低电平有效)

图5Lcd模块接口电路

程序下载后会显示日期、时间。

按Key1可以进入时间调整界面。

3.2.4按键电路

按键电路直接与IOA口连接。

其原理图如下:

图6按键电路直接与IOA口连接

3.2.5常用功能函数介绍

液晶显示控制类:

LCD501_Init液晶初始化

LCD501_ClrScreen清屏

LCD501_ReverseColor显示翻转

LCD501_SetPaintMode设置图形显示模式

LCD501_GetPaintMode获取当前显示模式

LCD501_FontSet设置文本字体

LCD501_FontGet获取当前文本字体

LCD501_PutChar显示单个字符

LCD501_PutString显示字符串

LCD501_PutPixel画点

LCD501_Line画直线

LCD501_Circle画圆

LCD501_Rectangle画矩形

LCD501_Bitmap位图显示/汉字显示

SPCE061A与SPLC501的接口采用6800并行接口电路,即8位数据总线、1个读写选通端口、1个数据指令选通端口、1个信号使能端口,具体接法如下图:

图7

按键采用凌阳61板上提供的三个按键,接口电路如下:

图8

4、软件设计

•软件部分由三个部分组成:

主程序部分、2Hz时基中断部分、1KHz时基中断部分,主程序部分主要负责初始化LCD和显示界面,2Hz时基中断部分负责时间的计数,1KHz时基中断部分负责按键的扫描,

4.1各个程序文件的功能

•1.main.c实现了系统的初始化,显示开机画面,键盘扫描和语音播报。

•2.system.c包含了工程中大部分的功能函数,包括各种界面的显示、时间和日期的调整、秒表的调整、闹钟的时间设定、闹钟的铃声选择等。

•3.key.c键盘扫描文件,里面定义了键盘扫描函数、延时函数,用来实现对键盘的扫描等功能,键盘扫描采用查询方式。

•4.isr.asm中断服务函数文件,实现语音解码、秒表和时间以及日期的修改。

2Hz时基中断

1KHz时基中断

图9主程序流程图

主程序(main.c)编写首先进行函数声明,定义文件中用到的变量以及常数数组,再编写真正的主体部分。

首先进行键盘以及液晶显示的初始化。

置2hz的中断,开2hz的中断。

//main.c

#include"

SPLC501User.h"

Mychar.h"

SPCE061A.h"

intCount_time=0;

intKey_time=0;

unsignedintContr=24;

intSet_mode=0;

structTime//定义时间结构体,存储现在的时间

{

intyear;

//年

intmonth;

//月

intweek;

//周

intday;

//日

inthour;

//时

intminute;

//分

intsecond;

//秒

}Clock;

voidClock_Init();

voidClock_Fix();

voidDisp_Time();

constcharclr[]={"

"

};

intmain()

{longintm=100000;

//addyourcodehere

intdly;

LCD501_Init(0x00);

*P_IOA_Dir&

=0xfff8;

*P_IOA_Attrib&

*P_IOA_Data&

LCD501_Bitmap(32,0,(unsignedint*)encoding_00);

//课

LCD501_Bitmap(48,0,(unsignedint*)encoding_01);

//程

LCD501_Bitmap(64,0,(unsignedint*)encoding_02);

//设

LCD501_Bitmap(80,0,(unsignedint*)encoding_03);

//计

LCD501_Bitmap(24,16,(unsignedint*)encoding_04);

LCD501_Bitmap(40,16,(unsignedint*)encoding_05);

//算

LCD501_Bitmap(56,16,(unsignedint*)encoding_06);

//机

LCD501_Bitmap(72,16,(unsignedint*)encoding_07);

//接

LCD501_Bitmap(88,16,(unsignedint*)encoding_08);

//口

LCD501_Bitmap(16,32,(unsignedint*)encoding_09);

//数

LCD501_Bitmap(32,32,(unsignedint*)encoding_0a);

//字

LCD501_Bitmap(48,32,(unsignedint*)encoding_0b);

//电

LCD501_Bitmap(64,32,(unsignedint*)encoding_0c);

//子

LCD501_Bitmap(80,32,(unsignedint*)encoding_0d);

LCD501_Bitmap(96,32,(unsignedint*)encoding_0e);

//钟

*P_Watchdog_Clear=0x0001;

while(m--)

Clock_Init();

LCD501_PutString(0,0,clr);

for(dly=0;

dly<

100;

dly++);

LCD501_PutString(0,16,clr);

LCD501_PutString(0,32,clr);

LCD501_PutString(0,48,clr);

LCD501_Bitmap(0,0,(unsignedint*)encoding_15);

//王

LCD501_Bitmap(16,0,(unsignedint*)encoding_16);

//

LCD501_Bitmap(32,0,(unsignedint*)encoding_17);

//瑞

LCD501_PutString(56,0,"

08064030"

);

//08064030

LCD501_Bitmap(32,16,(unsignedint*)encoding_18);

LCD501_Bitmap(64,16,(unsignedint*)encoding_19);

LCD501_Bitmap(96,16,(unsignedint*)encoding_1a);

LCD501_Bitmap(0,34,(unsignedint*)encoding_1b);

//北

LCD501_Bitmap(12,34,(unsignedint*)encoding_1c);

//京

LCD501_Bitmap(24,34,(unsignedint*)encoding_1d);

LCD501_Bitmap(36,34,(unsignedint*)encoding_1e);

//间

LCD501_PutChar(46,32,'

:

'

LCD501_Bitmap(0,48,(unsignedint*)encoding_13);

//星

LCD501_Bitmap(16,48,(unsignedint*)encoding_14);

//期

LCD501_PutChar(32,48,'

LCD501_Bitmap(80,51,(unsignedint*)encoding_0f);

//欢

LCD501_Bitmap(92,51,(unsignedint*)encoding_10);

//迎

LCD501_Bitmap(104,51,(unsignedint*)encoding_11);

//使

LCD501_Bitmap(116,51,(unsignedint*)encoding_12);

//用

LCD501_PutChar(72,32,'

LCD501_PutChar(96,32,'

LCD501_PutChar(120,32,'

'

LCD501_PutChar(124,32,'

Disp_Time();

*P_INT_Ctrl=C_IRQ5_2Hz|C_IRQ4_1KHz;

__asm("

intirq"

while

(1)

{

*P_Watchdog_Clear=0x0001;

}

return0;

}

voidIRQ4(void)__attribute__((ISR));

voidIRQ5(void)__attribute__((ISR));

voidIRQ4(void)

inttime_dly;

intsign=0;

sign=0;

//如果为4、6、9、11月,则31日进位,如果为1、3、5、7、8、10、12月,则32日进位,如果为2月,29日进

if(Clock.month==4)

sign=1;

if(Clock.month==6)

if(Clock.month==9)

if(Clock.month==11)

if((*P_INT_Ctrl&

C_IRQ4_1KHz)!

=0x0000)

*P_INT_Clear=C_IRQ4_1KHz;

//清中断

if(Key_time%=50)//20Hz判断按键是否按下

{

if((*P_IOA_Data&

0x0007)!

=0x0000)//软件去抖动,

{

for(time_dly=0;

time_dly<

5000;

time_dly++);

//去抖动延时,

}

if((*P_IOA_Data&

0x0001)!

=0x0000)//如果按下KEY1

{

Set_mode++;

Set_mode%=8;

}

0x0002)!

=0x0000)//如果按下KEY2

if(Set_mode==0)

{

Contr++;

Contr=(Contr>

31)?

0:

Contr;

LCD501_SetContrast(Contr);

}

//如果为设置时间模式

if(Set_mode==1)

Clock.year++;

if(Set_mode==2)

{Clock.month++;

if(Clock.month==13)//13月进位

Clock.month=1;

if(Set_mode==3)

{Clock.day++;

if((Clock.month==2)&

&

(Clock.day==29))//2月29日进位

Clock.day=1;

}

if((sign==1)&

(Clock.day==31))

if((sign==0)&

(Clock.day==32))

if(Set_mode==4)

{Clock.hour++;

if(Clock.hour==24)

Clock.hour=0;

if(Set_mode==5)

{Clock.minute++;

if(Clock.minute==60)

Clock.minute=0;

if(Set_mode==6)

{Clock.second++;

if(Clock.second==60)

Clock.second=0;

if(Set_mode==7)

{Clock.week++;

if(Clock.week>

7)

Clock.week=1;

}

if((*P_IOA_Data&

0x0004)!

=0x0000)//如果按下KEY3

{Contr--;

31:

if(Set_mode==1)//如果为设置时间模式

Clock.year--;

if(Set_mode==2)

Clock.month--;

if(Clock.month==0)

{Clock.month=12;

}

if(Set_mode==3)

Clock.day--;

(Clock.day==0))//3月0日变成2月29日

{

Clock.day=28;

(Clock.day==0))//4、6、9、11月0日变成前一月的31日

Clock.day=30;

(Clock.day==0))//1、3、5、7、8、10、12月0日变成前一月的31日

Clock.day=31;

if(Set_mode==4)

Clock.hour--;

if(Clock.hour<

0)

Clock.hour=23;

if(Set_mode==5)

Clock.minute--;

if(Clock.minute<

Clock.minute=59;

if(Set_mode==6)

Clock.second--;

if(Clock.second<

Clock.second=59;

if(Set_mode==7)

{Clock.week--;

if(Clock.week<

1)

Clock.week=7;

}

while((*P_IOA_Data&

=0x0000);

Key_time++;

voidIRQ5(void)//2Hz时基中断控制时间

C_IRQ5_2Hz)!

=0x0000)

*P_INT_Clear=C_IRQ5_2Hz;

Count_time++;

Count_time%=2;

if(Set_mode==0)//如果是时钟显示模式

if(Count_time==1)

Clock.second++;

Clock_Fix();

Disp_Time();

if(Set_mode>

0)//如果是设置时间模式

Disp_Time();

if(Count_time)

{

LCD501_PutString(0,16,"

//年跳动

LCD501_PutString(48,16,"

//月跳动

LCD501_PutString(80,16,"

//日跳动

LCD501_PutString(56,32,"

//时跳动

LCD501_PutString(80,32,"

//分跳动

if(Set_mode==6)

LCD501_PutString(104,32,"

//秒跳动

if(Set_mode==7)

LCD501_PutString(40,48,"

//星期跳动

voidClock_Init()

Clock.year=2010;

Clock.month=12;

Clock.day=31;

Clock.hour=23;

Clock.minute=59;

Clock.second=45;

Clock.week=3;

voidClock_Fix()//定义修正时间函数,如果时间产生溢出,则按时间计算规则进行处理

intflag;

flag=0;

if(Cloc

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

当前位置:首页 > 职业教育 > 其它

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

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