基于凌阳单片机的电子时钟设计3Word文档下载推荐.docx
- 文档编号:8207588
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:22
- 大小:279.49KB
基于凌阳单片机的电子时钟设计3Word文档下载推荐.docx
《基于凌阳单片机的电子时钟设计3Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于凌阳单片机的电子时钟设计3Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。
同时,该时钟系统还具有功耗小、成本低的特点,具有很强的实用性,而且系统具有一定的可扩展性。
电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。
随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。
在城市的主要营业场所、车站、码头等公共场所使用LCD数字电子钟已经成为一种时尚。
但目前市场上各式各样的LCD数字电子钟大多数用全硬件电路实现,电路结构复杂,功率损耗大等缺点。
因此有必要对数字电子钟进行改进。
三系统设计
小组分工:
本小组成员有赵红,王瑞、吴勃庆、王鹏。
组长为赵红,其中小组四人共同设计主框架、搭建硬件电路;
王瑞和吴勃庆负责主程序的编写,赵红和王鹏负责Lcd子程序部分以及中断部分;
所有组员分工明确,齐心协力共同完成本次课程设计。
3.2硬件设计
试验箱
总体接线
1.1PLCD501模组的硬件平面图
这一模块可以使用lcd或者led数码管来实现。
我组最后选择用lcd液晶显示来显示时间以及日期。
之所以选择lcd来实现,是因为它具有很多优点。
低压微功耗,平板型结构,被动显示型(无眩光,不刺激人眼,不会引起眼睛疲劳)而且显示信息量大(因为像素可以做得很小)无电磁辐射(对人体安全,利于信息保密)。
具体的实现方法是利用C语言的编程(代码见程序system.c)。
下面的硬件设计将详细的介绍lcd的模块的接口电路以及具体的接线方法。
1.2模组的内部设置的点阵图
3.2.1Lcd的电路
这部分的主要接线如下:
IOA8-15接液晶显示模块DB0-DB7
IOB4接液晶显示模块AO
IOB5接液晶显示模块的R/W
IOB6接液晶显示模块的EP
DB0-DB7为双向数据口,AO为数据/使命控制位,R/w为读/写信号,EP是全能端(低电平有效)
要这部分工作时Key接线与IOA低八位相连就可以了。
Lcd模块接口电路
程序下载后会显示日期、时间。
按Key1可以进入时间调整界面。
3.2.3按键电路
按键电路直接与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个信号使能端口,具体接法如下图:
按键采用凌阳61板上提供的三个按键,接口电路如下:
3.3软件设计及流程图
软件部分由三个部分组成:
主程序部分、2Hz时基中断部分、1KHz时基中断部分,主程序部分主要负责初始化LCD和显示界面,2Hz时基中断部分负责时间的计数,1KHz时基中断部分负责按键的扫描,下面是这三个程序的流程图:
2.2.1主程序流程图:
2Hz时基中断
1KHz时基中断
主程序(main.c)编写首先进行函数声明,定义文件中用到的变量以及常数数组,再编写真正的主体部分。
首先进行键盘以及液晶显示的初始化。
置2hz的中断,开2hz的中断。
2.2.2主要程序及注释:
2.2.2.1时钟计数程序:
//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;
flag=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子 时钟 设计