液晶时钟.docx
- 文档编号:3434182
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:17
- 大小:1.15MB
液晶时钟.docx
《液晶时钟.docx》由会员分享,可在线阅读,更多相关《液晶时钟.docx(17页珍藏版)》请在冰豆网上搜索。
液晶时钟
单片机设计项目
—基于8051的液晶时钟设计
一,功能介绍
LCD显示电子钟的基本功能
1,实现时钟功能;
2,实现计数功能;
3,具有一定的计时精度。
二,芯片介绍
1)基本资源的使用
本次实验采用了80c51型单片机,1602LCD液晶显示屏,蜂鸣器。
为了实现时钟,定时,秒表的功能,用到了单片机的外部中断,计时器中断,及I/O端口.
资源
功能
外中断
外部中断INT0
计数器开始及清零
定时器
定时器T0
时钟定时基准
定时器T1
整点报时的音符产生
I/O端口
P1,P2
LCD接口,蜂鸣器
2)芯片介绍
8051单片机引脚图与引脚功能简介
单片机的40个引脚大致可分为4类:
电源、时钟、控制和I/O引脚。
⒈电源:
⑴VCC-芯片电源,接+5V;
⑵VSS-接地端;
⒉时钟:
XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。
⒊控制线:
控制线共有4根,
⑴ALE/PROG:
地址锁存允许/片内EPROM编程脉冲
①ALE功能:
用来锁存P0口送出的低8位地址
②PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵PSEN:
外ROM读选通信号。
⑶RST/VPD:
复位/备用电源。
①RST(Reset)功能:
复位信号输入端。
②VPD功能:
在Vcc掉电情况下,接备用电源。
⑷EA/Vpp:
内外ROM选择/片内EPROM编程电源。
①EA功能:
内外ROM选择端。
②Vpp功能:
片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋I/O线
80C51共有4个8位并行I/O端口:
P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输
入输出和控制信号(属控制总线)。
内容来自单片机之家
LCD管脚及控制字;
LCD管脚的定义
控制字
1602液晶模块的读写操作,屏幕和光标的操作都是通过指令编程来实现的。
指令1:
清显示,指令码01H,光标复位到地址00H位置
指令2:
光标复位,光标返回到地址00H
指令3:
光标和显示位置设置I/D,光标移动方向,高电平右移,低电平左移,S:
屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效。
指令4:
显示开关控制。
D:
控制整体的显示开与关,高电平表示开显示,低电平表示关显示。
C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时显示移动的文字,低电平时移动光标
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时为双行显示,F:
低电平时显示5X7的点阵字符,高电平时显示5X10的显示字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙。
LCD实现滚动显示;
方法一:
采用LCD1602控制命令,显示后画面移动一个字符;
方法二:
循环使用显示不同位置,形成滚动效果。
三,Proteus仿真截图
(1)扬声器模块
(2)液晶显示模块
(3)晶振及复位电路模块
(4)按键模块
(5)原理图
(6)自动布局效果
(7)自动布线效果
(8)调整后布线效果
(9)PCB3D效果图
四,部分源程序
voidinit()//初始化函数
{
ucharnum;
rw=0;lcden=0;a=0;b=0;freq=0;tab=0;
year=2012;month=6;day=30;
shi=23;fen=59;miao=45;xq=6;
rn();///*闰年2月调整*/
daymax=dayup[month];
initlcd();
delay
(2);
for(num=0;num<15;num++)
{
wrdat(date[num]);
delay
(2);
}
wrcom(0x80+0x43);
for(num=0;num<8;num++)
{
wrdat(time[num]);
delay
(2);
}
TMOD=0X21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
PT0=1;
TH1=0xce;
TL1=0xce;
ET0=1;
ET1=1;
IT0=1;
EA=1;
TR0=1;
}
voidtimer0()interrupt1//定时器T0中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)//a=20
{
a=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
TR1=1;
if(shi==24)
{
shi=0;
day++;
//日期上限
if(day>=daymax)
{
day=1;month++;
if(month>=13)
{
month=1;
year++;
if(year>=3000)
year=2000;
newy();
rn();///*闰年2月调整*/
}
daymax=dayup[month];
sfm(0x05,month);
}
sfm(0x08,day);
xq=xq+1;//刷新星期
if(xq==7)
xq=0;
reweek();
}
sfm(0x43,shi);
}
sfm(0x46,fen);
}
sfm(0x49,miao);
}
}
voidsfm(ucharadd,uchardat)//写年月日函数
{
ucharh,l;
h=dat/10;l=dat%10;
wrcom(0x80+add);
delay
(2);
wrdat(0x30+h);
delay
(2);
wrdat(0x30+l);
delay
(2);
wrcom(0x80+add);
}
voidnewy()//更新年函数
{
ucharh,l;
h=year/100;l=year%100;
wrcom(0x80);
delay
(2);
wrdat(0x30+h/10);
delay
(2);
wrdat(0x30+h%10);
delay
(2);
wrdat(0x30+l/10);
delay
(2);
wrdat(0x30+l%10);
delay
(2);
wrcom(0x80);
}
voidinitlcd()//初始化液晶函数
{
wrcom(0x38);
wrcom(0x0c);
wrcom(0x06);
wrcom(0x80);
wrcom
(1);
}
voidwrcom(ucharcom)//液晶写命令函数
{
rs=0;
P0=com;
delay
(1);
lcden=1;
delay(5);
lcden=0;
}
voidwrdat(uchardat)//液晶写数据函数
{
rs=1;
P0=dat;
delay
(1);
lcden=1;
delay(5);
lcden=0;
}
voiddelay(ucharz)//延时函数
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidreweek()//更新星期函数
{ucharnum,fir;
fir=xq*4;
wrcom(0x80+0x0c);
delay
(2);
for(num=3;num>0;num--)
{
wrdat(week[fir]);
fir++;
delay
(2);
}
wrcom(0x80+0x0c);
}
voidrn()////闰年调整
{
if(year%100==0)
{
if(year%400==0)
dayup[2]=30;
else
dayup[2]=29;
}
else
{
if(year%4==0)
dayup[2]=30;
else
dayup[2]=29;
}
daymax=dayup[month];
}
voidint0()interrupt0//中断0函数
{
count++;
flacount(count);
}
voidclear()//清除计数函数
{
wrcom(0x80+0x4d);
delay
(2);
wrdat('');
delay
(2);
wrdat('');
delay
(2);
wrdat('');
delay
(2);
switch(keynum)
{
case1:
wrcom(0x80+0x49);break;
case2:
wrcom(0x80+0x46);break;
case3:
wrcom(0x80+0x43);break;
case4:
wrcom(0x80+0x0c);break;
case5:
wrcom(0x80+0x08);break;
case6:
wrcom(0x80+0x05);break;
case7:
wrcom(0x80+0x02);break;
case8:
wrcom(0x80+0x00);
}
}
voidflacount(uintval)//更新计数值函数
{
ucharbai,shi,ge;
bai=val/100;
shi=val%100/10;
ge=val%10;
wrcom(0x80+0x4d);
delay
(2);
wrdat(0x30+bai);
delay
(2);
wrdat(0x30+shi);
delay
(2);
wrdat(0x30+ge);
delay
(2);
switch(keynum)
{
case1:
wrcom(0x80+0x49);break;
case2:
wrcom(0x80+0x46);break;
case3:
wrcom(0x80+0x43);break;
case4:
wrcom(0x80+0x0c);break;
case5:
wrcom(0x80+0x08);break;
case6:
wrcom(0x80+0x05);break;
case7:
wrcom(0x80+0x02);break;
case8:
wrcom(0x80+0x00);
}
}
voidtimer1()interrupt3//50us定时器T1函数
{
b++;
if(b==mus[freq])
{
b=0;
spk=~spk;
}
tab++;
if(tab==8000)
{
tab=0;
freq++;b=0;
if(freq==4)
{
freq=0;tab=0;
TR1=0;TL1=0xce;
spk=0;
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 液晶 时钟