LED1602液晶万年历.docx
- 文档编号:30170912
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:21
- 大小:656.91KB
LED1602液晶万年历.docx
《LED1602液晶万年历.docx》由会员分享,可在线阅读,更多相关《LED1602液晶万年历.docx(21页珍藏版)》请在冰豆网上搜索。
LED1602液晶万年历
《单片机》
课程设计报告
LED1602液晶数字万年历
专业11应用电子技术
班级1班
学生姓名刘伟
指导教师邓鹏
提交日期2013.5.24
目录
一设计目的¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨3
二设计任务和要求¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨3
三设计原理分析¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨3
3.1最小系统的构建¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨3
3.2液晶1602原理¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨4
四硬件资源及其分配¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨6
五protues硬件图¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨6
六程序清单¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨6
七参考文献¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨15
八体会心得¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨15
九元件清单¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨15
一设计目的
1.1通过单片机课程设计,熟练掌握C51语言的编程方法和keil4的运用方法,将理论联系到实践中去,提高我们的动手和动脑能力。
1.2通过数字秒表的设计,掌握外围器件如1602液晶的编程思想,独立键盘的编程思想及它们和单片机I/O口的使用方法,还有简单程序的程序编写,最终提高我们的逻辑抽象能力。
二设计任务和要求
2.1设计一个能在1602液晶上可以跑动的以独立键盘调整年月日时分秒的数字万年历
2.2要求:
利用单片机实现上述任务即可
三设计原理分析
3.1最小系统的构建
基本组成:
89c51芯片,始终系统电路,复位电路,串口通信电路,电源电路。
时钟系统是一个由震荡器产生的89c52系统工作所需的时钟信号;复位电路产生的复位功能;串口通信电路通过电路电脑与单片机连接通信作用。
以下是原理图:
3.2液晶1602原理
3.21液晶显示原理及各参数引脚介绍
一:
液晶显示器各种图形的显示原理
线段的显示:
点阵图形式液晶有M*N个显示单元组成,假设LED显示屏有64行,每行有128列,每八列对应一个字节的8位,即每行由16个字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相应,每一个字节的内容和显示屏上相应位置的亮暗对应,例如屏上的第一行的亮暗由RAM区的000H——00FH的16个字节的内容决定,当(000H)=FFH,(001H),(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LED现实的基本原理。
二:
1602LED的引脚及功能
1602led分为背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的比不带背光的厚,是否带背光在应用中并无差异,两者尺寸差别如下图
2LED1602的主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5——5.5V电压
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
3引脚功能说明
1602led采用标准的14脚无背光或16脚带背光借口,各引脚接口如下
3.25电路图
通过最小喜用与1602各个端口的连接,确保1602液晶征程工作,再根据1602液晶时序图在keil4中写出相关程序,及可通过80c51来控制液晶显示。
四硬件资源及其分配
主要用到的硬件:
80c51的P3端口,P2端口,1602液晶,独立键盘
硬件分配:
P0口全部作为1602液晶的数据传输口,P2口的0,1,2作为1602的控制端口,P3口的0,1作为独立键盘的接口
五protues硬件图
六程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcden=P2^2;
sbitrs=P2^0;
sbitrw=P2^1;
sbitk1=P3^0;
sbitk2=P3^1;
ucharcount,nian=13,yue=5,ri=15,day=3,shi=14,fen,miao,k1num;
ucharcodetable[]="2013-05-15WED";
ucharcodetable1[]="14:
00:
00";//预设时间
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=6;y>0;y--);
}
voidwrite_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delay(50);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
ucharnum;
rw=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x01);
write_com(0x06);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay
(2);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay
(2);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidwrite_sfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);//详细见码表
write_date(0x30+ge);
}
voidwrite_nyr(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);//详细见码表
write_date(0x30+ge);
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
voidkeyscan()
{
if(k1==0)
{
delay(50);//延时消抖
if(k1==0)
{
k1num++;
while(!
k1);
if(k1num==1)//进入年设置选项
{
TR0=0;//时间停止
write_com(0x80+2);
write_com(0x0f);//此时设置为显示光标,光标闪烁
}
}
if(k1num==2)//进入月设置选项
{
write_com(0x80+5);
}
if(k1num==3)//日设置选项
{
write_com(0x80+8);
}
if(k1num==4)//星期设置选项
{
write_com(0x80+12);
}
if(k1num==5)//时设置选项
{
write_com(0x80+0x40+4);
}
if(k1num==6)//分设置选项
{
write_com(0x80+0x40+7);
}
if(k1num==7)//秒设置选项
{
write_com(0x80+0x40+10);
}
if(k1num==8)//退出设置
{
k1num=0;
write_com(0x0c);
TH0=(65536-50000)/256;//设置完成后再次讲定时器装初值,以免影响及时准确度
TL0=(65536-50000)%256;
TR0=1;//时间继续走
}
}
if((k1num!
=0)&&(k1num!
=8))//判定是否进入设置状态
{
if(k2==0)//按键2,加数据
{
delay(20);
if(k2==0)
{
while(!
k2);
if(k1num==1)//调节年的数据
{
nian++;
if((nian==0)||(nian>99))
nian=0;
write_nyr(2,nian);
write_com(0x80+2);
}
if((k1num==2))//调节月的数据
{
yue++;
if((yue==0)||(yue>12))
yue=1;
write_nyr(5,yue);
write_com(0x80+5);
}
if(k1num==3)//调节日的数据
{
ri++;
if((ri==0)||(ri>31))
ri=1;
write_nyr(8,ri);
write_com(0x80+8);
}
if(k1num==4)//调节星期的数据
{
day++;
if((day==0)||(day>7))
day=1;
write_com(0x80+12);
switch(day)
{
case1:
write_date(0x4D);
write_date(0x4F);
write_date(0x4E);
write_com(0x80+12);
break;
case2:
write_date(0x54);
write_date(0x55);
write_date(0x45);
write_com(0x80+12);
break;
case3:
write_date(0x57);
write_date(0x45);
write_date(0x44);
write_com(0x80+12);
break;
case4:
write_date(0x54);
write_date(0x48);
write_date(0x55);
write_com(0x80+12);
break;
case5:
write_date(0x46);
write_date(0x52);
write_date(0x54);
write_com(0x80+12);
break;
case6:
write_date(0x53);
write_date(0x41);
write_date(0x54);
write_com(0x80+12);
break;
case7:
write_date(0x53);
write_date(0x55);
write_date(0x4E);
write_com(0x80+12);
break;
}
}
if(k1num==5)
{
shi--;
if((shi==0)||(shi>24))
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
if(k1num==6)
{
if((fen==00)||(fen>59))
fen=60;
fen--;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(k1num==7)
{
if((miao==00)||(miao==59))
miao=60;
miao--;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
}
}
}
}
voidmain()
{
uchara,b;
init();
while
(1)
{
keyscan();
if((yue==1)||(yue==3)||(yue==5)||(yue==7)||(yue==8)||(yue==10)||(yue==12))//判断月份的天数
a=31;
if((yue==4)||(yue==6)||(yue==9)||(yue==11))
a=30;
if(yue==2)//判断是否为闰年
{
if(nian%4==0)
b=29;
else
b=28;
}
if(count==20)//定时器计数满20次为一秒,秒数加一
{
count=0;
miao++;
if(miao==60)//秒等于60的时候将miao清零,同时fen加一,下同
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
day++;
ri++;
if(day==8)//星期的选择,用的case语句
day=1;
switch(day)
{
case1:
write_com(0x80+12);
write_date(0x4D);
write_date(0x4F);
write_date(0x4E);
write_date(0x0c);
break;
case2:
write_com(0x80+12);
write_date(0x54);
write_date(0x55);
write_date(0x45);
write_date(0x0c);
break;
case3:
write_com(0x80+12);
write_date(0x57);
write_date(0x45);
write_date(0x44);
write_date(0x0c);
break;
case4:
write_com(0x80+12);
write_date(0x54);
write_date(0x48);
write_date(0x55);
write_date(0x0c);
break;
case5:
write_com(0x80+12);
write_date(0x46);
write_date(0x52);
write_date(0x54);
write_date(0x0c);
break;
case6:
write_com(0x80+12);
write_date(0x53);
write_date(0x41);
write_date(0x54);
write_date(0x0c);
break;
case7:
write_com(0x80+12);
write_date(0x53);
write_date(0x55);
write_date(0x4E);
write_date(0x0c);
break;
}
}
}
}
if(yue==2)//是否为2月的判断
{
if(ri>b)
{
ri=1;
yue++;
}
}
if(yue!
=2)
{
if(ri>a)
{
ri=1;
yue++;
}
}
if(yue==13)
{
yue=1;
nian++;
if(nian==100)
{
nian=0;
}
}
write_nyr(2,nian);//将数据写入1602
write_nyr(5,yue);
write_nyr(8,ri);
write_sfm(4,shi);
write_sfm(7,fen);
write_sfm(10,miao);
}
}
}
七参考文献
郭天祥《89c51单片机》
《单片机原理及应用》
1602液晶资料
八设计心得体会
通过单片机课程设计,不仅加深了我们对单片机的理解,而且将理论很好的应用实
际当中去。
以前看到电子手表和电子万年历的时候,总以为是神神奇的事,但是经过我们自己的探索,现在通过单片机做一个属于在记得万年历,那真是一种不寻常的愉悦感。
我们学会将理论很好的联系实际,并不断的去开动自己的大脑,做自己力所能及的别人却没想到的事,从而不断的战胜和超越自己。
同时,更重要的是,我们在这一设计过程中,学会了坚持不懈,永不言弃,并且我们了解到设计结果不是最重要的,更应该注重的是整个过程。
设计过程,好比是我们成长的历程,总有一些不如意的事,这也许就是我们党的一种磨练吧。
九原件清单
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LED1602 液晶 万年历
![提示](https://static.bdocx.com/images/bang_tan.gif)