LCD12864液晶电子钟.docx
《LCD12864液晶电子钟.docx》由会员分享,可在线阅读,更多相关《LCD12864液晶电子钟.docx(24页珍藏版)》请在冰豆网上搜索。
![LCD12864液晶电子钟.docx](https://file1.bdocx.com/fileroot1/2023-2/8/3b59cfa7-3384-4bb5-a025-8bd0f5629e5a/3b59cfa7-3384-4bb5-a025-8bd0f5629e5a1.gif)
LCD12864液晶电子钟
长沙学院
《单片机原理及应用》
课程设计说明书
题目
LCD12864液晶显示电子钟设计
系(部)
专业(班级)
姓名
学号
指导教师
起止日期
《单片机原理及应用》课程设计任务书
系(部):
专业:
课题名称
LCD12864液晶显示电子钟设计
设计内容及要求
1、课题内容:
设计一种基于AT89S52单片机的液晶显示电子时钟,要求如下:
(1)、能正确显示时间、日期和星期显示格式为:
时间:
XX小时:
XX分:
XX秒;日期:
XX年:
XX月:
XX日;星期:
X。
(2)、时间能够由按键调整,误差小于1S。
(3)、闹钟功能:
时间运行到与闹钟设定时间时,闹钟响(持续响3秒)。
(4)、报时功能:
时间运行到正点时间时,闹钟响,几点钟就响几声(每
声持续响2秒,每两声之间时间间隔1秒)。
液晶显示器第一行显示“数字电子钟”;第二行显示“当前时间”;第三
行显示日期和星期;第四行显示最近一个闹钟的设定时间。
2、要求:
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过,并提交一篇课程设计说明书。
设计工作量
1、汇编或C51语言程序设计;
2、程序调试;
3、在Proteus上进行仿真成功,进行实验板下载调试;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序
分析、仿真分析、调试过程,参考文献、设计总结等。
进度安排
起止日期
设计内容(或预期目标)
备注
第一天
课题介绍,答疑,收集材料,C51介绍
第二天
设计方案论证,练习编写C51程序
第三天——第六天
程序设计
第六天——第八天
程序调试、仿真
第九天——第十天
系统测试并编写设计说明书
教研室意见
年月日
系(部)主管领导意见
年月日
一、整体方案设计
1、单片机的选择
单片微型计算机主要由微处理器、存储器、I/O接口电路等组成。
鉴于在本学期的学习和实习中主要是以MCS——51系列的单片机为对象,故而本次课程设计选择以AT89C51为主的单片机。
2、单片机结构
单片机主要包括中央处理器、程序存储器、数据存储器、定时/计数器、并行接口、串行接口和中断系统等几大处理单元和地址总线、数据总线、控制总线等三大总线。
芯片内部包括下列硬件资源:
(1)、8位CPU。
(2)、4KB的片内程序存储器ROM、可寻址64KB程序存储器和64KB外部数据存储器。
(3)、128B内部RAM.
(4)、21个SFR.
(5)、4个8位并行I/O口。
(6)、一个全双工的异步串行口。
(7)、两个16位定时/计数器。
(8)、5个中断源,两个优先级。
如下图1是51单片机的简化结构框图
图1
二、前期准备
为了更好的完成课程设计,设计之初我们并没有直接进行设计课题的设计,而是对单片机的各种功能先做了一定的了解和系统仿真,为课题研究打下基础。
系统仿真主要包括三大部分,第一部分是对串行输出、按键计数、输出方波、彩灯花样的仿真,第二部分是对LCD1206显示和12864显示的仿真,第三部分是对点阵显示的仿真。
第一部分的准备比较简单,基于单片机实验已经做过类似的实验,仿真做的比较成功。
如下图图2所示是输出周期为20ms的方波波形。
图2
第二部分的准备相对复杂些,主要是了解LCD1602和12864的显示功能。
仿真显示的内容采用了有个人特色的姓名、学号、班级等信息的显示。
如下图3所示利用LCD1602显示了姓名拼音、班级和学号;
图4(a)、(b)所示利用12864显示了姓名、学号、班级,并且用按键切换的方式分页显示了我比较喜欢的一首柳宗元的古诗《江雪》。
图3
(a)
(b)
图4(a)、(b)
第三部分的准备相对第二部分又稍显简单,主要还是对点阵显示的了解和掌握。
如下图5(a)、(b)、(c)所示,利用点阵显示了我的姓名。
(a)(b)
(c)
图5(a)、(b)、(c)
三、程序设计
做好了前期准备,接下来就是针对12864液晶电子钟显示的程序编写。
考虑到之前的实习焊接了单片机最小系统和按键模块,正好在此次设计中可以用到,故而此次设计跟之前的仿真跟有所不同,针对实物来编写和设计程序。
整个系统需要一个系统时钟,作为控制器的时钟标准。
控制输出的时间设定、系统时钟的校准、控制输出准许与否等,都需要输入设备,这里以四个独立式按键为输入设备。
1、键盘约定
按键0为时间调整键,按键1为闹钟时间调整键,
按键2为数字加键,按键3为数字减键。
2、界面显示
(1)、走时:
系统在没有操作之前为走时状态,显示界面样式为00。
(2)、设置系统时间:
功能键为按键0,显示界面样式为00时00分00秒、00年00月00日、00。
最后显示的是星期。
(3)、控制输出的设定:
功能键为按键1,显示界面为00时00分00秒。
当闹铃时间设定好了之后,最后再按一下直至数字稳定不闪烁即设置成功。
当闹铃时间到时,蜂鸣器会发出声音。
3、全局变量的定义
走时系统需要使用5个变量:
S010.1秒计数单元
y3秒计数单元
y2分计数单元
y1小时计数单元
4、系统时钟
在时间控制系统中,系统时钟完成两件事,一是“走时”,提供标准时钟;二是为显示界面提供闪烁的秒信号。
这个程序可以通过Timer_A中断来实现。
所使用的变量单元在主程序中有定义,为全局变量。
5、闹钟控制时间的设定
在系统中设置闹铃时间,每当走时时间与设置的闹铃控制时间相同且允许闹铃时,则输出到蜂鸣器。
程序编译成功后下载到芯片,实物显示如下图6(a)、(b)所示。
图6(a)(b)
四、总结与体会
在此次课程设计中,收获自然是不必多说,我觉得最主要的是在其中应用知识的过程体会、新知识的了解和自身理论知识的不足的感悟。
在设计过程中,我觉得巩固最深的就是中断,让我对中断的理解层次提高了。
中断技术是计算机的一个很重要的技术,在自动检测、实时控制、应急处理等方面都要用到。
某一中断源申请中断有效时,系统硬件叫自动置位TCON或者SCON中的有关相应标志位。
在编程时要注意其标志位的变化的影响。
在之前我一直认为中断是系统硬件内部才能够实现。
但是此次实践改变了我的错误认知,外部中端可借用定时器溢出中断扩展也可以采用查询法扩展,还可采用8259等多功能芯片扩展外部中断源。
这时我就想到了一句古话“温故而知新”和一个成语“坐井观天”。
复习也是学习新知识的一个主要环节,没有对旧知识的复习,新学的知识就会缺少源头,导致我们没办法对所学新知识的理解的和掌握。
我想在复习中也能深化自己对知识的理解。
在温故的基础上通过领会贯通,通过举一反三,通过比照分析,通过联想分析,就会有新的发现,新的领悟,新的启示,从而进入新的境界,掌握新的知识。
而且我们都知道知识只有真正的理解了,真正的弄懂了,运用到实践中去了,证实了,才算是学会了,掌握了,这时才可以说你已经把这门知识学到手了。
这正是课程设计的目的之一。
我想我在某些学习方面不是个主动的人,但是,经过此次课程设计,我觉得我必须去主动地去探求,而不是被动地接受。
在学习之上加上我自己的思考,加上我自己的判断,加上我自己的总结。
阅历和经历决定了一个人的视野,一个人要想开阔视野必须要走出去实践,拓宽眼界,发挥想象思维,认识世界。
受此影响,我想我以后的视野一定能够拓宽很多。
参考文献
【1】曾屹.刘辉主编.《单片机原理与应用》[M].中南大学出版社.2012年第2版
【2】臧春华.邵杰.魏小龙主编.《综合电子系统设计与实践》.[M].北京航空航天大学出版社2009.11
【3】李华主编.《MCS——51系列单片机实用接口技术》[M].北京航空航天大学出版社1993.8
程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^6;
sbiten=P2^7;
sbitwd=P2^0;
sbitbeet=P2^2;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
charhour=23,minute=59,second=58,count=0;
charshi=0,fen=0,miao=0,hm;
intyear=2013;
charmonth=12,day=30,mm=0,cc=7;
uinttemp;
floatf_temp;
ucharcodetable1[]={"数字电子钟"};
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
voidfengmingqi()
{
beet=0;delay
(1);beet=1;delay
(1);
}
voidxieling_shu(ucharaa,ucharbb)
{
if(aa==1){rs=0;}
if(aa==0){rs=1;}
P0=bb;delay
(1);
en=1;delay
(1);
en=0;delay
(1);
}
voidxieludizhi(ucharx,uchary)
{
switch(x)
{
case1:
xieling_shu(1,0x80+y);return;
case2:
xieling_shu(1,0x90+y);return;
case3:
xieling_shu(1,0x88+y);return;
case4:
xieling_shu(1,0x98+y);return;
}
}
voidxiezifuchuan(uchar*dd)
{
while(*dd!
='\0')
{
xieling_shu(0,*dd++);
}
}
voidqingping()
{
xieling_shu(1,0x01);
xieling_shu(1,0x01);
xieling_shu(1,0x01);
delay(20);
}
voidinit_12864()
{
xieling_shu(1,0x30);
xieling_shu(1,0x30);
xieling_shu(1,0x0C);
xieling_shu(1,0x01);
xieling_shu(1,0x06);
}
voidinit_zifu()
{
xieludizhi(1,0);xiezifuchuan("数字电子钟");delay
(1);
xieludizhi(2,0);xiezifuchuan("时分秒");delay
(1);
xieludizhi(3,0);xiezifuchuan("年月日星期");delay
(1);
xieludizhi(4,0);xiezifuchuan("闹钟时分秒");delay
(1);
}
voiddisplay()
{
xieludizhi(3,0);
xieling_shu(0,0x30+hour/10);
xieling_shu(0,0x30+hour%10);
xieludizhi(0,':
');
xieling_shu(0,0x30+minute/10);
xieling_shu(0,0x30+minute%10);
xieludizhi(0,':
');
xieling_shu(0,0x30+second/10);
xieling_shu(0,0x30+second%10);
xieludizhi(2,0);
xieling_shu(0,0x30+year/1000);
xieling_shu(0,0x30+year%1000/100);
xieling_shu(0,0x30+year%100/10);
xieling_shu(0,0x30+year%10);
xieludizhi(2,3);
xieling_shu(00,0x30+month/10);
xieling_shu(00,0x30+month%10);
xieludizhi(2,5);
xieling_shu(00,0x30+day/10);
xieling_shu(00,0x30+day%10);
}
voiddisplay1()
{
xieludizhi(3,0);
xieling_shu(0,0x30+shi/10);
xieling_shu(0,0x30+shi%10);
xieling_shu(0,':
');
xieling_shu(0,0x30+fen/10);
xieling_shu(0,0x30+fen%10);
xieling_shu(0,':
');
xieling_shu(0,0x30+miao/10);
xieling_shu(0,0x30+miao%10);
}
voidxingqi()
{
switch(cc)
{
case1:
xieludizhi(3,7);xiezifuchuan("01");return;
case2:
xieludizhi(3,7);xiezifuchuan("02");return;
case3:
xieludizhi(3,7);xiezifuchuan("03");return;
case4:
xieludizhi(3,7);xiezifuchuan("04");return;
case5:
xieludizhi(3,7);xiezifuchuan("05");return;
case6:
xieludizhi(3,7);xiezifuchuan("06");return;
case7:
xieludizhi(3,7);xiezifuchuan("07");return;
}
}
voidanjian()
{
if(key4==0){delay
(1);hm=-hm;while(key4==0);}
if(key1==0)
{
delay
(1);mm++;
if(hm!
=0){if(mm>=4)mm==0;}
if(mm==1){xieludizhi(3,3);xieling_shu(0,0x5f);}
if(mm==2){TR0=1;xieludizhi(3,2);xieling_shu(0,0x5f);}
if(mm==3){xieludizhi(3,0);xieling_shu(0,0x5f);}
if(mm==4){xieludizhi(2,5);xieling_shu(0,0x5f);}
if(mm==5){xieludizhi(2,3);xieling_shu(0,0x5f);}
if(mm==6){xieludizhi(2,1);xieling_shu(0,0x5f);}
if(mm==7){xieludizhi(3,7);xieling_shu(0,0x5f);}
if(mm==8){xieludizhi(2,7);xieling_shu(0,0x02);}
if(mm>=9){xieludizhi(2,7);xieling_shu(0,0x02);mm=0;}
while(key1==0);
}
if(mm==1&&key2==0)
{
if(hm==0){TR0=0;delay
(1);if(key2==0){second++;if(second>=60){second=0;}}}
if(hm!
=0){delay
(1);if(key2==0){miao++;if(miao>=60){miao=0;}}}
while(key2==0);
}
if(mm==1&&key3==0)
{
if(hm==0){TR0=0;delay
(1);if(key3==0){second--;if(second<=-1){second=59;}}}
if(hm!
=0){delay
(1);if(key3==0){miao--;if(miao<=-1){miao=59;}}}
while(key3==0);
}
if(mm==2&&key2==0)
{
if(hm==0){delay
(1);if(key2==0){minute++;if(minute>=60){minute=0;}}}
if(hm!
=0){delay
(1);if(key2==0){fen++;if(fen>=60){fen=0;}}}
while(key2==0);
}
if(mm==2&&key3==0)
{
if(hm==0){delay
(1);if(key3==0){minute--;if(minute<=-1){minute=59;}}}
if(hm!
=0){delay
(1);if(key3==0){fen--;if(fen<=-1){fen=59;}}}
while(key3==0);
}
if(mm==3&&key2==0)
{
if(hm==0){delay
(1);if(key2==0){hour++;if(hour>=24){hour=0;}}}
if(hm!
=0){delay
(1);if(key2==0){shi++;if(shi>=24){shi=0;}}}
while(key2==0);
}
if(mm==3&&key3==0)
{
if(hm==0){delay
(1);if(key3==0){hour--;if(hour<=-1){hour=23;}}}
if(hm!
=0){delay
(1);if(key3==0){shi--;if(shi<=-1){shi=23;}}}
while(key3==0);
}
if(mm==4&&key2==0)
{
delay
(1);if(key2==0){day++;if(day>=31){day=1;}}
while(key2==0);
}
if(mm==4&&key3==0)
{
delay
(1);if(key3==0){day--;if(day<=0){day=31;}}
while(key3==0);
}
if(mm==5&&key2==0)
{
delay
(1);if(key2==0){month++;if(month>=13){month=1;}}
while(key2==0);
}
if(mm==5&&key3==0)
{
delay
(1);if(key3==0){month--;if(month<=0){month=12;}}
while(key3==0);
}
if(mm==6&&key2==0)
{
delay
(1);if(key2==0){year++;}
while(key2==0);
}
if(mm==6&&key3==0)
{
delay
(1);if(key3==0){year--;}
while(key3==0);
}
if(mm==7&&key2==0)
{
delay
(1);if(key2==0){cc++;if(cc>=8){cc=1;}}
while(key2==0);
}
if(mm==7&&key3==0)
{
delay
(1);if(key3==0){cc--;if(cc==0){cc=7;}}
while(key3==0);
}
}
voiddsreset(void)
{
uinti;
wd=0;
i=103;
while(i>=0)i--;
wd=1;
i=4;
while(i>0)i--;
}
bittempreadbit(void)
{
uinti;
bitdat;
wd=0;i++;
wd=1;i++;i++;
dat=wd;
i=8;
while(i>0)i--;
return(dat);
}
uchartempreadvoid()
{
uchari,j,dat;
dat=0;
for(i=1;j<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtempwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
wd=0;
i++;i++;
wd=1;
i=8;while(i>0)i--;
}
else
{
wd=0;
i=8;while(i>0)i--;
wd=1;
i++;i++;
}
}
}
voidmain()
{
ucharbuff[4];
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=50000/256;
TL0=50000%256;
init_12864();
init_zifu();
hm=0;
if(hm==0)display();
elsedisplay1();
anjian();
xingqi();
if(minute==59&&second==59)
{
fengmignqi();
}
if(shi==hour&&fen==minute&&miao>=second&&miao<=second+3)
{
fengmignqi();
}
}
voidtime()interrupt1
{
TH0=-5000/256;
TL0=-5000%256;
count++;
if(count==20)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour=24)
{
hour=0;
day++;
cc++;
if(cc===8)cc=1;
if(day==31)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
}
}
}
}