单片机_电子时钟(LCD显示)课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程名称单片机
题目电子时钟(LCD显示)学生
指导教师
年级 2018级
专业计算机科学与技术
二级学院信息工程学院
信息工程学院
2020年12 月23 日
《单片机》课程设计任务书
摘要
本设计使用11.0592MHz晶振与单片机AT89C51相连接,以AT89C51芯片为核心,采用LCD1602的并行操作方式显示。
通过使用该单片机,实现将时间显示在LCD1602液晶上,并且按秒实时更新。
AT89C51单片机功耗小,电压可选用4~6V电压供电。
通过板子上的按键可随时调节时钟的时、分,按键设计4个有效按键,分别有开始设置键、设置小时键、设置分钟键、确认设置键盘,通过使用中断定时器进行计时,实现时间显示。
针对LCD液晶显示屏,设置了初始化函数,数据传送函数及指令传送函数,进而实现LCD液晶显示屏显示功能。
在每次的按键按下时,LCD液晶显示屏会随之改变,进而实现功能。
关键词:AT89C51 电子时钟数码管按键
目录
1 概述 (1)
1.1方案设计 (1)
1.2设计目的 (1)
1.3设计内容 (1)
2.硬件设计 (1)
2.1 元器件 (1)
2.2 硬件 (2)
3 软件设计 (3)
3.1 主设计流程 (3)
3.2 初始化流程图 (3)
3.3 时间显示主程序 (5)
4 调试结果分析 (6)
4.1运行结果 (6)
4.2仿真分析 (7)
5 总结 (8)
参考文献 (9)
附录 (10)
1 概述
1.1方案设计
(1)单片机选型
选用AT89C51单片机,指令简单,易学易懂,外围电路简单,硬件设计方便,IO 口操作简单,成本低,程序烧写简单,对于设计开发非常实用。
(2)显示方案
LCD液晶显示器是一种功耗极低的显示器件,它不仅省电,还能显示文字、曲线、图形等大量的信息,易于彩色化,所以采用LCD显示器来显示时间。
(3)计时方案
利用AT89C51内部定时/计数器进行中断定时,配合软件延时实现时分秒的计时。
该方案可以节省硬件成本。
(4)按键设计
系统采用独立式按键,共设计了四个按键,分别是“当前时间”、“分钟+”、“小时+”,用来设置校时功能,这样可以使电路更简单。
1.2设计目的
通过对电子时钟系统进行编程与Protues仿真,进一步掌握单片机的组成,P1、P0、P2、P3口的应用,定时中断程序的编写及应用,对之前学习的单片机课程进行回顾与应用;初步掌握Protues仿真方法以及用keil软件编写程序的方法。
1.3设计内容
本次设计的系统由单片机系统、数码管显示系统、按钮等组成,通过按键来控制单片机实现数字时钟的时、分、秒显示,12、24制转换,设定时间、闹钟等不同功能,并通过P0口的输出在LED上显示。
该设计具有结构简单、使用方便等特点。
2.硬件设计
2.1 元器件
首先单片机采用最常用AT89C51,晶振频率采12MHz,复位电路电容用10uF,再加上时钟电路和电源构成单片机最小系统。
CRYSTAL、LED、CAP、RES、 CAP-ELEC、POT-HG,用以上元器件用作搭建基本框架。
2.2 硬件
51芯片:AT89C51
图2.1 最小系统
按钮:BUTTON
图2.2 按键图
16lcd显示:LM016L
图2.3 LCD显示图
总体电路结构图:
图2.4 总体电路结构图
3 软件设计3.1 主设计流程
主程序流程图:
3.1 主程序流程图
3.2初始化流程图
系统初始化模块的主要功能是完成系统的初始化以及设定系统的工作状态,初始化部分包括以下方面的内容:
(1)单片机定时器0初始化以及各种I/0口定义;
(2) 1602 液晶初始化清屏及设定工作方式;
(3)系统进入正常工作状态。
图3.2 LCD初始化流程图
3.3 时间显示子程序
图3.3 时间显示流程图
图3.4 设置时间流程图
4 调试结果分析4.1运行结果
图4.1 运行结果
4.2仿真分析
以此种单片机为例,这种单片机的电子时钟设计的整体的电路基本分为电路内部模块,电路显示模块和电子时钟的按键这一模块。
主要是通过按键的调制来设计时间,由数码管来显示时间。
通过单片机的程序实际,来确定不同地方显示的数字以及内容。
而按键的功能在通过对于不同的按键进行调节,来对时间进行设置,时钟不超过12分钟和秒钟不差过60,通过按键的程序不同,例如长按调节键可以进入不模式设置,通过俺的次数不同,可以改变时间等等。
当然,在按键方面还有开关的设计。
这些原理都是基于单片机的基础之上的。
模拟路、数字电路和c语言知识为单片机的3大基础理论知识。
这3大基础理论知识在对电路设计中着起到了极为重要的作用。
对于单机片的学习是事离不开c语言和VB等编程的。
只有掌握了这些技术,则能够更好的将单片机运用于到电子时钟的仿真设计中去。
5 总结
自己在设计过程中出现的问题,如何解决的该问题,通过课设学到了什么,有什么收获。
通过这次对《电子时钟(LCD显示)》的设计与制作过程,加强了我们动手、思考和解决问题的能力。
在设计过程中我们利用仿真软件进行原理图及PCB图的绘制,最后再利仿真软件进行检查,看程序是否能显示其功能。
在设计过程中让我进一步深刻的学习各种软件的利用以及各种软件给我们带来的便利。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
以后会更加努力!本课程设计能够顺利完成,是因为有各指导老师的耐心指导、讲解和同学的热心帮助和支持。
参考文献
[1]付家才.单片机控制工程实践技术[M].北京:化学工业出版社2004.3.
[2]李光才.单片机课程设计实例指导[M].北京:北京航空航天大学出版2004.2
[3]朱定华.单片机原理及接口技术实验[M].北京:北方交通大学出版社2002.11.
[4]刘湘涛.江世明.单片机原理与应用[M]. 北京:电子工业出版社,2006.5
[5]靳达.单片机应用系统开发实例导航北京:人民邮电出版社,2003.10
[6]张俊谟.单片机中级教程原理与应用北京:北京航空航天大学出版社,2000.6
附录
#include<reg51.h>
unsigned char table1[]={"2020/12/23"};
unsigned int s=0,m=0,h=0; //秒、分、时
sbit lcden=P1^2;sbit lcdrs=P1^0;sbit lcdrw=P1^1;sbit LED=P0^7;
sbit key1=P3^0;sbit key2=P3^2;sbit key3=P3^4;sbit key4=P3^6; unsigned int k;unsigned int num=0;
void delay(unsigned int xms){
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(unsigned char com){//向液晶显示屏写命令或者数据lcdrs=0; //选择命令模式lcdrw=0; //选择写操作
P2=com; //将要写的命令发送到数据总线
delay(5); //稍作延时等待数据稳定
lcden=1; //使能端给一高脉冲,初始化
delay(5); //稍做延时lcden=0; //将使能段置0,以完成高脉冲} void write_date(unsigned char date){
lcdrs=1; lcdrw=0; P2=date; delay(5);
lcden=1; delay(5); lcden=0;}
void init(){ lcden=0; write_com(0x01); write_com(0x38);
write_com(0x06); write_com(0x0c);}
void display(){ //显示
write_com(0x80+0x4B); write_date((s%10)+48); write_com(0x80+0x4A); write_date((s/10)+48); write_com(0x80+0x49); write_date(':');
write_com(0x80+0x48); write_date((m%10)+48); write_com(0x80+0x47); write_date((m/10)+48); write_com(0x80+0x46); write_date(':');
write_com(0x80+0x45); write_date((h%10)+48); write_com(0x80+0x44); write_date((h/10)+48);}
void keyScan(){
if(key2==0){ delay(10);//分钟if(key2==0){ m++;while(!key2); }} //小时
if(key3==0){ delay(10); if(key3==0){ h++;while(!key3); }}} void setTime(){if(key1==0){ delay(10); if(key1==0){ while(1){ display(); keyScan(); sureTime();}while(!key1); } }}
int sureTime(){setTime();if(key4==0){ delay(10); if(key4==0) { while(1){ display();setTime();LED=~LED; }while(!key4); }}} void T0_isr() interrupt 1{
TH0=(65536-50000)/256; //50毫秒
TL0=(65536-50000)%256;
num++;
if(num==20){ //秒
s++; num=0; }
if(s==60){ //分
m++; s=0; }
if(m==60){ //时
h++; m=0;s=0; }
if(h==24){
h=0; m=0; s=0; }}
void main(){
TMOD=0x01;
TH0=(65536-50000)/256;//给初值大约50毫秒
TL0=(65536-50000)%256;
TR0=1; //启动定时器
EA=1;
ET0=1; //开中断
init();
while(1){
LED=~LED;
write_com(0x80+0x03);
for(k=0;k<10;k++){
write_date(table1[k]);
delay(5);
}
display();
setTime(); } }。