基于凌阳单片机的电子时钟设计2Word文件下载.docx
《基于凌阳单片机的电子时钟设计2Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于凌阳单片机的电子时钟设计2Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。
随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。
在城市的主要营业场所、车站、码头等公共场所使用LCD数字电子钟已经成为一种时尚。
但目前市场上各式各样的LCD数字电子钟大多数用全硬件电路实现,电路结构复杂,功率损耗大等缺点。
因此有必要对数字电子钟进行改进。
本设计基于单片机技术原理,以SPCE061A单片机作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个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)由王瑞和吴勃庆负责编写,王鹏和赵红负责LCD以及中断模块
3.3.2Lcd和中断程序:
F_SPLC501_Initial_IO:
//LCD对应IO口设置程序,作用是把Lcd对应的IO口设置为输出
pushr1to[sp]
r1=[P_IO_Data_Di]
r1|=M_IO_DATA_MASK
[P_IO_Data_Di]=r1//设置对应的数据口为输出
r1=[P_IO_Data_A]
[P_IO_Data_A]=r1//设置对应的数据口为悬浮输出
r1=[P_IO_Data_B]
[P_IO_Data_D]=r1
r1=[P_IO_Ctrl_Di]
r1|=(M_IO_EP+M_IO_AO+M_IO_RW+M_IO_CS)
[P_IO_Ctrl_Di]=r1//设置对应的控制口为输出
r1=[P_IO_Ctrl_A]
[P_IO_Ctrl_A]=r1//设置对应的控制口为悬浮输出
r1=[P_IO_Ctrl_B]
r1|=~(M_IO_EP+M_IO_AO+M_IO_RW+M_IO_CS)
[P_IO_Ctrl_D]=r1
popr1from[sp]
retf
F_SPLC501_Write_Com:
//单片机向LCD写指令
pushr2,r3to[sp]//入栈保护
pushr5to[sp]
r2=[P_IO_Ctrl_B]//得到IOB口的状态
r2&
=~(M_IO_EP+M_IO_CS)//EP、CS变低电平
[P_IO_Ctrl_B]=r2
r2=[P_IO_Ctrl_B]
=~(M_IO_AO+M_IO_RW)
[P_IO_Ctrl_B]=r2//AO、RW变低电平
.ifdefDATA_PORT_HIGHT
r1=r1lsl4
.endif
r3=[P_IO_Data_B]
r3&
=~M_IO_DATA_MASK
r1&
=M_IO_DATA_MASK
r1=r1+r3
[P_IO_Data]=r1//往数据口送数据
nop
r2|=M_IO_EP//EP变高电平
[P_IO_Ctrl]=r2
=~M_IO_EP//EP变低电平
r2|=M_IO_CS//CS变低电平
popr5from[sp]//出栈
popr2,r3from[sp]
retf
F_SPLC501_Write_Data:
/*单片机向LCD写数据,该函数与F_SPLC501_Write_Com类似只是A0设置为高电平,在此不多加描述*/
voidLCD501_Init(unsignedintInitialData)//初始化LCD,参数为LCD的初始化时显示的数据
{
unsignedinti,j;
F_SPLC501_Initial_IO();
//InitialLCDIO
F_SPLC501_Write_Com(M_LCD_ON);
//LCDOn
F_SPLC501_Write_Com(M_LCD_POWER_ALL);
//设置上电控制模式
F_SPLC501_Write_Com(M_LCD_ELE_VOL);
//电量设置模式(显示亮度)
F_SPLC501_Write_Com(0x0012);
//指令数据0x0000~0x003f
F_SPLC501_Write_Com(M_LCD_VDD_SET);
//V5内部电压调节电阻设置
F_SPLC501_Write_Com(M_LCD_COM_NOR);
//Com扫描方式设置
F_SPLC501_Write_Com(M_LCD_SEG_REV);
//Segment方向选择
F_SPLC501_Write_Com(M_LCD_ALL_LOW);
//全屏点亮/变暗指令
F_SPLC501_Write_Com(M_LCD_ALL_NOR);
//正向反向显示控制指令
F_SPLC501_Write_Com(M_LCD_STATIC_OFF);
//关闭静态指示器
F_SPLC501_Write_Com(0x0000);
//指令数据
F_SPLC501_Write_Com(M_LCD_BEGIN_LINE+0);
//设置显示起始行对应RAM
for(i=0;
i<
8;
i++)//往LCD中填充初始化的显示数据
{
F_SPLC501_Write_Com(M_LCD_COL_PAGE+i);
F_SPLC501_Write_Com(M_LCD_COL_LINE_LOW);
F_SPLC501_Write_Com(M_LCD_COL_LINE_HIG);
for(j=0;
j<
128;
j++)
{
F_SPLC501_Write_Data(InitialData);
}
}
CurPaintMode=0;
CurPowerMode=1;
CurLCDSet=8;
CurScroll=0;
CurScrMode=1;
CurASCIIFont=1;
}
voidLCD501_Bitmap(unsignedintx,unsignedinty,unsignedint*word)/*让LCD在指定位置画出位图和文字*/
unsignedintuntype,Shift_Num,Read_Back;
inti,j,m,n;
unsignedintx_low,x_hight;
unsignedinty_whide,y_Number,y_Number_8;
Shift_Num=y&
0x07;
untype=*(word++);
i=untype>
>
j=(untype&
0xff);
if((x+j)>
128||(y+i)>
64||y>
64)
return;
y=(y>
3)+M_LCD_COL_PAGE;
x=x+4;
y_whide=i>
4;
if(i&
0x000f)y_whide+=1;
//test
F_Cover_Initial(i,Shift_Num);
y_Number=i+Shift_Num;
y_Number_8=y_Number;
i=y_Number&
0x0f;
y_Number=y_Number>
if(i)y_Number++;
i=i&
y_Number_8=y_Number_8>
3;
&
y_Number_8!
=8)y_Number_8++;
for(n=0;
n<
j;
n++)
x_low=(x&
0x000f);
//定位列地址设置的低位指令
x_hight=((x>
4)&
0x000f)+0x10;
//定位列地址设置的高位指令
x++;
for(m=0;
m<
m++)Shift_Data_buf[m]=0;
y_Number_8;
m++)
F_SPLC501_Write_Com(y+m);
F_SPLC501_Write_Com(x_low);
//设置初始地址
F_SPLC501_Write_Com(x_hight);
Read_Back=F_SPLC501_Read_Data();
untype=m>
1;
if(m&
0x01)
Shift_Buff[3-untype]=Shift_Buff[3-untype]|(Read_Back<
<
8);
else
Shift_Buff[3-untype]=Read_Back;
F_Data_Cover(word,Shift_Num,y_Number,(y_whide<
4));
Read_Back=Shift_Data_buf[3-untype]>
Read_Back=Shift_Data_buf[3-untype];
word=word+y_whide;
voidLCD501_PutString(intx,inty,unsignedint*string)//让LCD在指定位置显示字符串
unsignedintx_err=6,y_err=8;
if(CurASCIIFont)
x_err=8;
y_err=16;
while(*string!
=0)
if((x+x_err)>
127)
x=0;
y=y+y_err;
if(y>
63)y=0;
LCD501_PutChar(x,y,*string);
string++;
x+=x_err;
四、调试说明
程序开始运行后,会显示两个界面,第一个界面显示出“课程设计计算机接口数字电子时钟”,经过一定的延时,就自动进入第二界面,第二界面将一直持续下去,进入时钟界面,时钟正常计时,当有用户按下KEY1,则进入选择调试模式,循环按KEY1,课选择不同的模式调整,在调试时间参数是可按KEY2来增加参数和KEY3减少参数。
如果在进入第二界面没有按下KEY1键,可以通过按KEY2和KEY3来增加或减少LCD的对比度。
四总结及心得体会
《凌阳16位单片机C语言开发》李晓白北京航空航天大学出版社
《单片机实验与实践教程》夏继强北京航空航天大学出版社,2001
《单片机高级教程》第1版何立民北京航空航天大学出版社,2001
《单片微型计算机原理接口与应用》第1版徐惠民、安德宁北京邮电大学出版社,1996