用51单片机和1602液晶做的数字钟.docx
- 文档编号:1827586
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:10
- 大小:129.30KB
用51单片机和1602液晶做的数字钟.docx
《用51单片机和1602液晶做的数字钟.docx》由会员分享,可在线阅读,更多相关《用51单片机和1602液晶做的数字钟.docx(10页珍藏版)》请在冰豆网上搜索。
用51单片机和1602液晶做的数字钟
Un
课程设计报告
数字钟
名
口,
号
级
指导教师:
高雪飞
、设计题目和要求二、设计原理与实现功能
、元器件介绍
四、
电路设计
五、
软件设计
六、
设计总结
、设计题目和要求
题目用STC89C52单片机和1602液晶做的数字时钟
要求:
1.准确计时,以数字形式显示时、分、秒的时间;
2.小时的计时要求为“24翻1”,分和秒的计时为60进制。
二、设计原理与实现功能
设计原理:
控制芯片采用STC89C52R单片机,晶振频率为11.0592MHZ采用C语言编程,显示模块采用通用型1602液晶,发声模块采用无源蜂鸣器。
参考资料:
51单片机C语言编程,1602datasheet,网络。
本装置使用的1602液晶为5v电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口,关于1602液晶的接口信号说明,主要技术参数,基本操作时序,RAM地址映射图,数据指针设置,初始化设置,写操作时序和其他设置请查阅1602的相关资料。
计时部分采用T0计时器中断方式1,T0定时器既有定时功能又有计数功能,通过设置与它们相关的特殊功能寄存器可以选择启用定时功能或计数功能。
当定时器的计数器计满后,会产生中断,通知CPU亥如何处理。
关于51单片机的
寄存器和中断功能及操作说明请查阅相关资料。
蜂鸣器的发声为单片机的一个引脚加一个三极管控制。
(1.要画出结构框图;2.数字钟的实现方法不止一种,因此必须说明自己
所设计的数字钟采用何种方法、何种原理)
实现功能:
开启装置,则在1602液晶上有左向右划过“helloworldIloveprograming”文字,之后上下两行显示年月日,星期和时间,其中年月日星期只能通过程序更改,时分秒自动从0开始计时,按秒更新,时分秒可用装置的两个按键进行调节,分别为时间设置键,数值增大键,闹钟的时间设置只能通过程序进行更改,一旦液晶显示时间和程序设定时间完全一致,蜂鸣器发声。
he11口word!
HovePrograning
2015-12-6Sunday
16:
13527
(1.基本功能必须实现,在基本要求的基础上可以拓展功能,如报时、校时等;2.具体介绍所实现功能,例如用什么显示等等)
三、元器件介绍
STC89C52单片机X1,通用型1602液晶XI,无源蜂鸣器XI,8055型PNP型三极管XI,弹性小按键X3,5V电源XI,10K电阻X3,2K电阻X1,万能板或PCB板X1,30PF无极性电容X2,10卩F有极性电容X1,10K滑动变阻器X1,发光二极管XI。
其中单片机和1602液晶是重点。
(1.选取的元器件名称、型号、功能等;2.对重点的几个芯片要详细介绍。
)
四、电路设计
原理图由单片机最小系统模块,液晶模块,蜂鸣器模块,按键部分组成。
(1.画出电路原理图;2.功能讲解。
)
五、软件设计
#includevreg52.h>//导入reg52.h头文件,
内部所有的功能寄存器
#defineucharunsignedchar//宏定义
#defineuintunsignedint
ucharcodetable1[]="helloword!
";//ucharcodetable2□二"llovePrograming";//ucharcodetable3[]="2015-12-6Sunday";//ucharcodetable4[]="00:
00:
00";//
ucharnum,count,hour,minute,sound,key1num;sbitlcden=P3八4;//sbitlcdrs=卩3八5;//sbitkey1=卩3八6;//sbitkey2=P3八7;//sbitbeep=P2八3;//voiddelay(uintk);//
该头文件中定义了52系列单片机
系统开机时显示的界面系统开机时显示的界面
定义日期
定义初始时间
液晶使能端
液晶数据/命令选择端时间设置按键时间增大键蜂鸣器信号
延时函数
voidwrite_command(ucharcommand);//向液晶写命令函数
设置闹钟函数
voidwrite_data(uchardate);//向液晶写数据函数voidwrite_time(uchartime,ucharx);//向液晶写时间voidinit();//初始化函数voidkeyscan();//键盘扫描函数voidalarm(ucharhours,ucharminutes,ucharsounds);//voidmain()//主函数
{
init();//首先初始化while
(1)//死循环
{keyscan();//轮询的方式键盘扫描,一切的轮询都可用中断来处理alarm(21,45,0);
21:
45:
00
count=0;//把count清零重新计时sound++;
if(sound==60)//秒到了60则进位一分钟{sound=0;minute++;
分到了60则进位一小时
if(minute==60)//
{
minute=0;
新的一天开始
hour++;if(hour==24)//{
hour=0;
}
write_time(hour,4);//写入小时的变化到液晶
}
write_time(minute,7);//写入分钟的变化到液晶}write_time(sound,10);//写入秒的变化到液晶}
voiddelay(uintk)//
{
uintx,y;
for(x=k;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_command(ucharcommand)//写命令{
lcdrs=0;//置以低电平设定为写命令模式P仁command;//将要写的命令送到数据总线上delay(5);//lcden=1;//delay(5);//lcden=0;//
}
延时函数
稍作延时以待数据稳定
给液晶使能端一高电平才能将数据总线上的数据传入液晶
稍作延时
关闭使能端
voidwrite_data(uchardate)//
{
lcdrs=1;//低电平为写数据模式P1=date;//将数据传入数据总线delay(5);
lcden=1;
delay(5);
写数据到液晶
用于将时分秒写入液晶数据
lcden=0;}voidwrite_time(uchartime,ucharx)//{
ucharshi,ge;//定义十位和各位shi=time/10;//取time的十位ge=time%10;//取time的各位write_command(0x80+0x40+x);//定位数据指针即液晶显示的位置,根据x的不同写入的数据将在液晶上显示在不同的位置
write_data(0x30+shi);//0x30用于将整形的数字转化为字符型的数字,写入时分秒的十位
write_data(0x30+ge);//根据ascii码,从48即0x30起为数字,写入时分秒的个位}voidinit()//初始化函数{
设置液晶16X2显示,5X7点阵,8位数据接口设置液晶开显示,不显示光标设置液晶写一个字符后地址指针自动加1设置液晶显示清零,数据指针清零重新定义光标即数据指针
将光标定位在第一行飞显示区域地址处
lcden=0;//关闭使能端write_command(0x38);//write_command(0x0c);//write_command(0x06);//write_command(0x01);//write_command(0x80);//write_command(0x80+0x10);//for(num=0;num<16;num++){
将table1写入,必须一位一位的写
将光标定位在第二行飞显示区域地址处
将table2写入,必须一位一位的写
write_data(table1[num]);//
delay(5);
}write_command(0x80+0x50);//for(num=0;num<16;num++)
{
write_data(table2[num]);//
delay(5);
}
for(num=0;num<16;num++)
{write_command(0x18);//液晶整屏左移指令
delay(200);//没200ms移动一位,共移动16位,刚好简要显示的数据全部移入液晶可显示区域
}
write_command(0x80);//将光标定位在第一行显示区域地址处for(num=0;num<16;num++)
{write_data(table3[num]);//delay(5);
}write_command(0x80+0x40);//for(num=0;num<16;num++)
将table2写入,必须一位一位的写
{write_data(table4[num]);//delay(5);
}
for(num=0;num<24;num++)//再次整屏左移,不过要移动24位液晶才能显示0x80地址所显示的数据
{
write_command(0x18);
delay(200);
}
TMOD=0x01;
TH0=(65536-50000)/256;//给定时器0装初值用于精确计时
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
voidkeyscan()//键盘扫描函数
{
if(key1==0)
{
delay(5);//按键的延时去抖
if(key1==0)
{
key1num++;//时间设置键按下次数记录
while(!
key1);//等待按键释放后才进行操作
switch(key1num)//根据key1num的不同值进行不同操作
{
case1:
//第一次按下
TR0=0;//关掉定时器0使数字钟停止走时间write_command(0x80+0x40+11);//光标定位到秒位置write_command(0x0f);//光标开始闪烁提示用户调整
{while(!
key2);//等待按键释放后才进行操作
switch(key1num)//根据key1num的值确定光标的位置,从而确定对时分秒的哪一个进行调整
{
case1:
//设置秒的值
sound++;
if(sound==60)
sound=0;
write_time(sound,10);
write_command(0x80+0x40+11);//将光标冲重新返回到秒的位置,因为写数据指针自动加
break;
case2:
//设置分钟的值
minute++;
if(minute==60)
minute=0;write_time(minute,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 1602 液晶 数字