资源描述
课 程 设 计(论文)
课程名称 微机原理和单片机综合设计和实践
题目名称 LCD显示电子钟
01月10日
广东工业大学华立学院
课程设计(论文)任务书
题目名称
LCD显示电子钟
学系学部
专业班级
姓 名
学 号
一、课程设计(论文)内容
以89C52单片机控制时钟,在LCD显示器上显示目前时间。设计要求:
使用文字型LCD显示器显示目前时间。
设计能支持年月日星期时分秒时钟,时钟要含有时间调整功效。
用4个功效键操作来设置目前时间。功效键K1~K4功效以下。
(1)K1-改变时间。
(2)K2-增加。
(3)K3-降低。
(4)K4-清零。
二、课程设计(论文)要求和数据
1.总体设计方案、系统原理框图;
2.硬件电路各部分电路原理图;
3.程序步骤图;
4.源程序;
5.结论
三、课程设计(论文)应完成工作
1.分析任务书,给出总体设计方案,画出系统原理框图;
2.硬件电路设计,给出关键电路原理图;
3.软件设计,给出程序步骤图,完成程序设计和软件调试;
4.完成调试;
5.完成课程设计汇报撰写,立即上交课程设计汇报。
四、课程设计(论文)进程安排
序号
设计(论文)各阶段内容
地点
起止日期
1
下达设计任务书,了解设计要求,查阅资料
1-107
12.30
2
给出方案设计,完成系统总体设计
1-107
1.3
3
硬件电路设计
1-107
1.4-1.5
4
软件设计:先给出各部分程序步骤图
1-107
1.6
5
软件设计:编写代码
1-107
1.7-1.8
6
撰写课程设计汇报
1-112
1.9-1.10
五、应搜集资料及关键参考文件
[1]张毅刚,彭喜源,谭晓昀.MCS-5系列单片机实用设计[M].哈尔滨工业大学出版社, .
[2]胡汉才.单片机原理及接口技术[M].清华大学出版社,.
[3]何立民.MCS-51系列单片机应用系统设计[M].北京航空航天大学出版社,.
[4]杨亭.电子CAD职业技能判定教程[M].广东科技出版社,.
发出任务书日期: 12月30 日 指导老师署名:
计划完成日期: 01 月10 日 教学单位责任人签章:
目录
1 系统需求分析 1
1.1 电子时钟研究背景和意义 1
1.2 系统实用功效分析 1
2 设计要求和方案 2
2.1 设计要求 2
2.1.1 基础要求 2
2.1.2发挥部分 2
2.2 系统基础方案选择 2
2.2.1 芯片选择 2
2.2.2 显示模块选择方案 2
2.2.3 时钟信号选择方案 3
2.3 电路设计最终方案决定 3
3 系统硬件设计和实现 3
3.1 数字钟电路设计框图 3
3.2 系统硬件概述 4
3.3 硬件电路结构设计 4
3.3.1 单片机主控制模块设计 4
3.3.2 显示模块设计 4
3.3.3 LCD原理说明 5
3.3.4 开关模块说明 6
4 系统软件设计 7
4.1 程序步骤框图 7
4.2 LCD初始化和及显示程序 7
5 系统调试 9
5.1软件调试 9
5.2硬件调试 9
参考文件 10
附录 11
1 系统需求分析
1.1 电子时钟研究背景和意义
20实际末,电子技术取得了飞速发展。再起推进下现代电子产品几乎渗透到了社会哥哥领域,有力推进和提升社会生产力发展和信息化程度,同时也是现代电子产品性能深入提升,产品更新换代节奏谱也越来越快。时间对大家来说是那么宝贵,工作忙碌性和繁杂轻易使大家忘记目前时间。然而碰到重大事情时候,一旦忘记时间,就会给自己或是她人造成很大麻烦。平时我们要求上班按时,聚会或召开会议肯定要提立即间、火车要准点抵达,航班要按时起飞,工业生产中,很多步骤全部需要时间来确定工序替换时刻。所以说能随时正确指导时间并利用时间,是我们生活中必不可少。
想知道时间,手表当然是很好选择,不过在忙碌当中,我们还需要一个“助理”时不时给我们体形式将,所以,计时器最好能够用有一个定时系统,随时提醒轻易忘记时间人。最早能够定时、宝石时钟属于机械式钟表,但这种时钟受到机械结构、动力合体技限制,在功效性能和在造价上全部没有措施和电子时钟相比。
电子时钟是采取电子电路实现对时、分、秒进行数字显示即使装置,广泛应用月个人家庭、车站、码头办公室等公共场所,成为大家日常生活活动中不可少必需品。因为数字集成电路发展和石英晶体振荡器广泛使用,是数字时钟精度远远查过老师钟表,钟表数字化跟大家生产生活带来了极大方便,而且大大扩展了钟表原先时钟功效。诸如整点提醒、定时报警、定时广播、自动启闭路灯,定时开关烘箱、同多动力设备、甚至多种定时电气自动开启等,全部这些,全部是以钟表数字化为基础。所以研究数字钟及扩大其应用,有着很现实意义。
1.2 系统实用功效分析
单片机模块中最常见是数字时钟,数字时钟是一个用单片机原理实现时、分、秒计时装置,和机械式时钟相比含有更高正确性和直观性,且无机械装置,含有更更长使用寿命,所以得到了广泛使用。
数字时钟是采取单片机原理实现对.年、月、日、周、时、分、秒,数字显示及到时提醒计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为大家日常生活中不可少必需品,因为数字集成电路发展和石英晶体振荡器广泛应用,使得数字钟精度,远远超出传统钟表, 钟表数字化给大家生产生活带来了极大方便,而且大大地扩展了钟表原先报时功效。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至多种定时电气自动启用等,全部这些,全部是以钟表数字化为基础。所以,研究数字时钟及扩大其应用,有着很现实意义。
2 设计要求和方案
2.1 设计要求
2.1.1 基础要求
1 设计能支持年月日星期时分秒时钟,时钟要含有时间调整功效。
2.1.2发挥部分
1 闹钟时间精度。
2 时钟功耗小于0.5MA/5V。
2.2 系统基础方案选择
本时钟设计具体有两种方法。一是经过单纯数字电路来实现;二是使用单片机来控制实现。此次设计选择了较为简单单片机控制;而选择这一方法后还要进行各个芯片选择。以下是我在这次设计中所用方案。
2.2.1 芯片选择
采取AT89C52芯片,其为高性能CMOS 8位单片机,该芯片内含有4k bytes可反复擦写只读程序存放器(PEROM)、128 bytes随机存取数据存放器(RAM)、 32位可编程I/O口线、2个16位定时/计数器、6个中止源、可编程串行UART通道及低功耗空闲和掉电模式,其最大优势就是AT89C52提供了8K字节可擦写Flash闪速存放器空间、8个中止源、及256*8字节内部存放器(RAM),处理了我们对可反复擦写Flash闪速存放器空间大小和中止源不够问题担心。
2.2.2 显示模块选择方案
方案一:采取LED数码管显示,显示较为清楚,不过因为设计要求时钟功效比较关键,所以用如用LED进行显示会使得硬件电路较为复杂,且在软件实现上也较难,为实现功效带来了一定困难。
方案二:采取LCD,电路比较简单,且在软件设计上也相对简单,含有低功耗功效,能够满足设计最优要求。所以,在设计中我采取显示模块是LCD显示。
2.2.3 时钟信号选择方案
方案一:直接采取单片机定时计数器提供秒信号,使用程序实现年、月、日、周、时、分、秒计数。采取此种方案可降低芯片使用,节省成本,实现时间误差较小,但程序设计较为复杂。
方案二:采取DS1302时钟芯片实现时钟, DS1302芯片是一个高性能时钟芯片,可自动对秒、分、时、日、周、月、年和闰年赔偿年进行计数,而且精度高,256位RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA。且硬件电路连接较为简单,程序设计轻易实现。
2.3 电路设计最终方案决定
综上各方案所述,对此次数字时钟方案选定为: 采取AT89C52作为主控制系统; 并由其定时计数器提供时钟; LCD作为显示电路,来实现功效。
3 系统硬件设计和实现
3.1 数字钟电路设计框图
LCD动态扫描显示模块
AT89C52
主控制器
开关调整模块
晶振电路
模块
复位电路
图3-1电路设计框图
3.2 系统硬件概述
该电路是由AT89C52单片机为控制关键,含有在线编程功效,低功耗,能在3V超低压工作;时钟电路也由AT89C52单片机提供,降低芯片使用,节省成本,它能够对年、月、日、周、日、时、分、秒进行计时,含有闰年赔偿功效。时间显示部份采取液晶LM016L(LCD)。
3.3 硬件电路结构设计
3.3.1 单片机主控制模块设计
此次单片机数字时钟设计采取AT89C52为主控制芯片,并由其定时器提供时钟,利用LCD进行时间按显示。下图为用Proteus软件画原理图:
图3-2仿真电路图
3.3.2 显示模块设计
图(3-4)所表示,该设计采取液晶显示装置即把时钟信号和温度信号同时显示在液晶显示器上,不仅结构简单清新可见,而且省电也轻易控制。数据传输采取P0口进行控制, 其引脚VSS接地,VEE接VCC,RS和RW、E是显示器控制端分别由单片机引脚P1.0、P1.1、P1.3进行控制。而VDD是作为液晶显示器灰度调整引脚,接一变阻器来改变其显示清楚度。
图3-3 LM016L液晶显示器
3.3.3 LCD原理说明
在实际应用中,用户极少直接设计LCD显示器驱动接口,通常是直接使用专用LCD显示驱动器和LCD显示模块。其中,LCD显示模块LCM(Liquid Crystal Display Module)是把LCD显示器、背景光源、线路板和驱动集成电路等部件组成一个整体,作为一个独立部件使用,含有功效较强、易于控制、接口简单等优点,在单片机系统中应用较多。其内部结构图2-8所表示。LCD显示模块只留一个接口和外部通信。显示模块经过这个接口接收显示命令和数据,并按指令和数据要求进行显示。外部电路经过这个接口读出显示模块工作状态和显示数据。LCD显示模块通常带有内部显示RAM和字符发生器,只要输入ASCII码就能够进行显示。LCD显示模块按功效显示可分为:LCD段式显示模块、LCD字符型显示模块、LCD图形显示块三类。液晶显示器因其功耗低、重量轻而成为便携式应用中主流显示技术。这里所用字符型液晶模块是一个用5x7点阵图形来显示字符液晶显示器,依据显示容量能够分为1行16个字、2行16个字、2行20个字等等。液晶显示有点振式和字符式两种,在这里采取字符式液晶显示器1602来实现显示电路功效。
LCD
驱动器
LCD
显示器
LCD
控制器
VSS
VDD
VL
RS
R/W
E
D0-D7
图3-4 LCD显示电路
因为1602液晶显示器是本身带有驱动模块液晶屏,它只有并口线和部分控制线,和单片机连接有两种不一样方法,直接访问方法和间接访问方法。直接访问方法就是微处理器把液晶显示模块看成存放器或I/O设备直接挂在总线上,模块8位数据总线和微处理器数据总线相连,用读操作 或写操作 信号和地址信号共同产生控制信号。
3.3.4 开关模块说明
校时电路关键靠键盘来控制。键盘是一组按键集合。共有四个按键,分别是:改变时间、增加、降低、清零。它是嵌入式计算机系统中不可缺乏外围电路。是实现人机对话纽带,借助键盘能够向计算机输入程序、置数、逻辑操作和写入程序和程序检测等。
4 系统软件设计
4.1 程序步骤框图
开始
初始化程序
主键值检测
依据主键进行散转
有则主键值加一
时间秒钟调整
时间分钟调整
时间小时调整
时间周调整
时间日调整
时间月调整
时间年调整
显示周
显示日
显示月
显示年
时间显示
时间显示主界面
图4-1 主程序步骤
4.2 LCD初始化和及显示程序
1 LCD初始化
void ini()/*LCD初始化函数
{
rw=0;
en=0;
P1=0xff;
writeCG();
write_order(0x38);/*端口写入
write_order(0x0c); /*端口写入
write_order(0x06); /*端口写入
write_order(0x01); /*端口写入
}
2 LCD显示程序
void open()/*定义一个LCD显示函数
{
uchar num; /*定义一个无符号字符变量num
write_order(0x80+0x10); /*调用write_order函数
for(num=0;opens[num]!='\0';num++)/*循环打开
{
write_date(opens[num]);
delay(20);
}
for(num=0;num<16;num++)/*对端口0x1c写入
{
write_order(0x1c);
delay(200);
}
for(num=0;num<5;num++)/*对端口0x18写入 {
write_order(0x18);
delay(200);
}
for(num=0;num<4;num++)/*对端口0x18写入
{
write_order(0x1c);
delay(200);
}
for(num=0;num<3;num++)/*对端口0x18写入
{
write_order(0x18);
delay(200);
}
for(num=0;num<2;num++)/*对端口0x1c写入
{
write_order(0x1c);
delay(200);
}
for(num=0;num<1;num++)/*对端口0x18写入
{
write_order(0x18);
delay(100);
}
write_order(0x80+0x53);
for(num=0;opens1[num]!='\0';num++)/*循环延时写入数据
{ write_date(opens1[num]);
delay(500);}
5 系统调试
5.1软件调试
打开程序调试软件keil uVision2,在里面新建一个工程,命名为:数字时钟.Uv2。接着新建文件,编写对应程序。编写好各个程序进行编译和连接。但若是在该过程中,看见我们编好程序有错误,那么就依据她对应提醒来修改错误,直到该程序能够正确编译为止。
能够正常编译程序说明没有什么问题了,此时我们在点击相关栏目,让它生成我们在硬件仿真时所需要.HEX文件。到此步,我们软件调试就完成了。
5.2硬件调试
打开Proteus 7 Professional软件,根据方案所选电路元件来设计整体电路,线把个芯片按一定位置放好,然后对对应对象进行连接,连接时需仔细,以免调试时发生错误。做好以后把编程所生成。HEX文件加载到AT89C52中,运行仿真软件,查看运行效果。假如运行犯错那么就依据她对应提醒来修改错误,直到仿真成功为止。
参考文件
[1] 边春远、王志强,MCS-51单片机应用开发实用子程序[M],人民邮电出版社.
[2] 马忠梅主编,单片机C语言应用程序设计[M],北京航空航天大学出版社.
[3] 李朝青主编,单片机原理及接口技术(第3版)[M], 北京航空航天大学出版社.
[4] 谭浩强,C语言程序设计(第四版)[M], 清华大学出版.
[5] 马忠梅、张凯,单片机C语言应用程序设计[M],北京航空航天大学出版社.
[6] 廖先芸,电子技术实践和实训[M],高等教育出版社.
附录
主程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P3^5;
sbit lcden=P3^4;
sbit dula=P2^6;
sbit wela=P2^7;
sbit s0 =P1^0;
sbit s1 =P1^1;
sbit s2 =P1^2;
sbit s3 =P1^3;
uchar code table1[]="-08-28 Wen";
uchar code table2[]="21:31:30";
uchar num,t0;
char sec,minute,hour,day,week,month;
uint year;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//写入指令子函数
void write_order(uchar order)
{
lcdrs=0;
P0=order;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
//写入数据子函数
void write_data(uchar data1)
{
lcdrs=1;
P0=data1;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
//初始化子函数
void init()
{
sec=0;
minute=0;
hour=0;
week=0;
day=1;
month=1;
year=;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
wela=0;
dula=0;
lcden=0;
write_order(0x38); //设置显示模式
write_order(0x0c); //开显示开光标,光标闪烁
write_order(0x01); //显示清屏
write_order(0x06); //光标显示效果
write_order(0x80); //定义第一行写入数据地址
for(num=0;num<14;num++)
{
write_data(table1[num]);
delay(2);
}
write_order(0x80+0x43); //定义第一行写入数据地址
for(num=0;num<8;num++)
{
write_data(table2[num]);
delay(2);
}
}
void change(uchar addr,uchar data1) //改变 时 分 秒 天 月 子函数
{
uchar x,y;
x=data1/10;
y=data1%10;
write_order(0x80+addr);
delay(1);
write_data(0x30+x);
delay(1);
write_data(0x30+y);
delay(1);
}
void yearchange(uchar addr,uint year) //改变年子函数
{
uchar x,y,z,w;
x=year/1000;
y=year%1000/100;
z=year%100/10;
w=year%10;
write_order(0x80+addr);
delay(1);
write_data(0x30+x);
delay(1);
write_data(0x30+y);
delay(1);
write_data(0x30+z);
delay(1);
write_data(0x30+w);
delay(1);
}
void weekchange(uchar z) //改变周数子函数
{
switch(z)
{
case 0:
{
write_order(0x80+0x0b);
delay(1);
write_data('M');
delay(1);
write_data('o');
delay(1);
write_data('n');
delay(1);
}
break;
case 1:
{
write_order(0x80+0x0b);
delay(1);
write_data('T');
delay(1);
write_data('u');
delay(1);
write_data('e');
delay(1);
}
break;
case 2:
{
write_order(0x80+0x0b);
delay(1);
write_data('W');
delay(1);
write_data('e');
delay(1);
write_data('n');
delay(1);
}
break;
case 3:
{
write_order(0x80+0x0b);
delay(1);
write_data('T');
delay(1);
write_data('h');
delay(1);
write_data('u');
delay(1);
}
break;
case 4:
{
write_order(0x80+0x0b);
delay(1);
write_data('F');
delay(1);
write_data('r');
delay(1);
write_data('i');
delay(1);
}
break;
case 5:
{
write_order(0x80+0x0b);
delay(1);
write_data('S');
delay(1);
write_data('a');
delay(1);
write_data('t');
delay(1);
}
break;
case 6:
{
write_order(0x80+0x0b);
delay(1);
write_data('S');
delay(1);
write_data('u');
delay(1);
write_data('n');
delay(1);
}
break;
default:break;
}
}
void display()
{
if(t0==20)
{
t0=0;
sec++;
if(sec==60)
{
sec=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
week++;
if(week==7)
{
week=0;
}
if(day==31)
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
yearchange(0,year);
}
change(0x05,month);
}
change(0x08,day);
weekchange(week);
}
change(0x43,hour);
}
change(0x46,minute);
}
change(0x49,sec);
}
}
//键盘扫描子函数,修改时间
void keyscan()
{
uchar snum;
if(s0==0)
{
delay(5);
if(s0==0)
{
while(!s0);//松手检测
snum++;
}
if(snum==1) //选定 秒
{
TR0=0;
write_order(0x80+0x40+9);
write_order(0x0f);
}
if(snum==2) //选定 分
{
write_order(0x80+0x40+6);
write_order(0x0f);
}
if(snum==3) //选定 时
{
write_order(0x80+0x40+3);
write_order(0x0f);
}
if(snum==4) //选定 星期
{
write_order(0x80+0x0b);
write_order(0x0f);
}
if(snum==5) //选定 天
{
write_order(0x80+0x08);
write_order(0x0f);
}
if(snum==6) //选定 月
{
write_order(0x80+0x05);
write_order(0x0f);
}
if(snum==7) //选定 年
{
write_order(0x80);
write_order(0x0f);
}
if(snum==8) //恢复 计时
{
TR0=1;
write_order(0x0c);
snum=0;
}
}
if(snum!=0) //增加 时 分 秒 天 月 年
{
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!s1);
if(snum==1)
{
sec++;
if(sec==60)
sec=0;
change(0x49,sec);
write_order(0x80+0x40+9);
}
if(snum==2)
{
minute++;
if(minute==60)
minute=0;
change(0x46,minute);
write_order(0x80+0x40+6);
}
if(snum==3)
{
hour++;
if(hour==24)
hour=0;
change(0x43,hour);
write_order(0x80+0x40+3);
}
if(snum==
展开阅读全文