单片机电子钟设计.docx
- 文档编号:26566701
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:22
- 大小:140.83KB
单片机电子钟设计.docx
《单片机电子钟设计.docx》由会员分享,可在线阅读,更多相关《单片机电子钟设计.docx(22页珍藏版)》请在冰豆网上搜索。
单片机电子钟设计
上海建桥学院
本科实训报告
课程名称:
单片机大实验
学号:
1121030
姓名:
石宵晨
专业班级:
机制B11-1
指导老师:
尹静
实训总评成绩:
2014年4月1日
实训项目名称
设计可调试的电子钟
时间
2014.2.30~4.3
实训目的及要求
1、熟练运用液晶显示器的工作原理,选择液晶显示器。
2、熟练使用kill编写控制程序。
3、利用TX-1C开发板完成电子钟的设计。
实训内容描述
1、采用89C52单片机驱动液晶显示器DS16012,实现电子数字钟的设计。
2、设计4个按键,用来分别调试:
秒、分、时和日期。
1)先完成在液晶上显示日期;
2)让时间秒走起来
3)让液晶显示时间
4)再完成调控
3、在Keilμ集成开发环境下编译的目标程序,下载到开发板上调试设计结果。
实训方法与步骤
1、对实训任务进行分析,了解开发板的连接方法及原理。
89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠
的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它、结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体、系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器、等更多的功能,适合于类似马达控制等应用场合。
89C52内置8位中央处理单元、256字、节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16、位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结
CPU而RAM定时器、串行口和中断系统维持其功能。
掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。
2、分析液晶显示的工作原理(液晶显示原理图)
使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只有并行接口,无串行接口。
1602字符液晶读写状态表
操作
输入
输出
读状态
RS=L,RW=H,E=H
D0~D7=状态字
写指令
RS=L,RW=L,D0~D7=指令码,E=高脉冲
无
读数据
RS=H,RW=H,E=H
D0~D7=数据
写数据
RS=H,RW=L,D0~D7=数据,E=高脉冲
无
3、分析程序流程(主程序、需要哪些子程序及相互的调用关系)
1)本实验中单片机操作1602液晶来显示数据,TX-1C是有实验板上独立按键S2和S3的检测端同时连接1602液晶的LCDEN和RS端,所以此时检测按键时将与操作液晶产生冲突,因此我们在选择按键时选择了与1602液晶没有关联的键,S4和S5两个独立按键,但数量却只有两个,所以最后我们利用矩阵按键来分解才出独立按键。
所以我们矩阵按键的最右边一列设置为独立按键,在程序最开始处用软件将“RD”端置地,依次检测“P3.0,P3.1,CSD,INTI”
2)延时程序:
主要用于防抖动,和一些简短的延时。
3)蜂鸣器发声函数:
低电平通电。
4)液晶写命令函数:
通过RS,lcden置0来写命令,将要写的命令送到数据总线上,稍作延时以待数据稳定,再使能端一高脉冲稍作延时再将使能端置0。
5)液晶写数据函数:
通过RS置1来实现写数据。
6)写日期函数,写时分秒函数:
先定义无符号字符:
shi,ge;通过数字分离法法分离2位数的十位和个位,并设置显示的位置,分别送去液晶显示。
7)初始化函数:
通过软件将矩阵按键第4列一端置低用以分解出独立按键,关闭两锁存器锁存端
,防止操作液晶时数码管会出乱码,设置16x2显示,5x7点阵,8位数据接口,以及
显示光标移动的设置,并且写出“:
”以及“-”的位置的函数,通过定时器0,工作
方式1来控制电子钟自动走。
8)按键扫描函数:
每当按键释放蜂鸣器发出滴声。
功能键按第一下光标移至秒,按
第二下光标移至分,以此类推。
同时设置只有功能键被按下后,增加和减小键才有效;
再分别写秒,分,时,日,月,年的调整程序,当满一定数字时,清零。
9)主函数:
首先调用初始化数据,再循环调用按键程序。
10)定时器0中断服务程序:
工作方式选择表
M1M0
方式
说明
00
0
13位定时器(TH的8位和TL的低5位)
01
1
16位定时器/计数器
10
2
自动重装入初值的8位计数器
11
3
T0分成两个独立的8位计数器,T1在方式3时停止工作
我们选择了选择定时器0,工作方式1,计算初值,采用中断方式进行溢出次数累计;计时是通过累加和数值比较实现的;中断服务程序用来进行计时操作,
11)具体程序请见附页。
4、编写程序,在Keil集成开发环境下调试、编译程序并生成*.hex文件。
5、利用STC单片机下载程序,将*.hex文件下载开发板,观查设计结果。
实训
结果
分析
与
结论
在1602液晶上显示电子钟,在通电时,时间会自动运行:
计时满60秒后,秒自
动清零,同时分钟自动加1,计数满60分钟后,分钟自动清零,同时小时自动加1;
计数满24小时后,小时自动清零同时日自动加1,以此类推。
我们设计的电子钟能够实现调试年,月,日,小时,分钟以及秒的工作。
显示格式:
1.按键功能:
S9:
功能键
(按第一次启动调试功能,光标在秒处,每按一次功能键,光标便移动一格,光标移
至年,再按一下为确认,电子钟开始计时)
S13:
增大键
S17:
减小键
(每按一次键蜂鸣器便发出一次“滴”声报警)
2、整个程序主要分为:
1)延时程序2)液晶写命令函数
3)液晶写数据函数4)写日期函数
5)写时分秒函数6)初始化函数
7)按键扫描函数8)主函数
个人实训总结
我们开展了为期4周的单片机大实验。
2人为一组,我们小组的课题是设计液晶显示日期、时间并可调试的电子钟。
首先,我们对课题进行了分析,分析了任务要求并理出了简单的设计思路。
电子钟最关键的就是对89C52芯片中的定时器的利用。
接着,我们就接着我们的设计思路,开始编写程序,调试程序。
想法永远是很美好的,到自己开始写程序时,我们又开始迷茫了,因为单片机课程是上学期学习的,很多知识点已经忘记了,我们又进行了重新的学习。
后来我们找到了书上的一段相似的程序,然后进行了改编。
最后我们的程序顺利的调试出来了。
通过这次的单片机大实验,使我加深了对单片机的认识,并且熟悉了单片机系统的设计流程,收获丰硕。
功能上基本达标:
时钟的显示,调时功能。
时钟显示功能,精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷。
随着现在互联网的越来越发达。
网络在本次设计中起到了很大作用,很多芯片资料,传统的纸质图书里是没有的。
如何在浩如烟海的网络中提取我们需要的知识也是我必须要提高的,网络作为一个平台,由于大家的无私奉献,才使得它丰富多彩,包罗万象。
但从这么多的资料中找到我想要的却不是那么容易,以后得着重加强这方面的能力。
从这次的设计中,我真正的体会到,什么叫书到用时方恨少,还有就是理论联系实践的重要性,如何把我们所学的理论知识运用到实际生活当中,这是最难的,也是我最缺的。
实践出真知,光有书本上的知识是远远不够的,我明白了,作为一个理工科学生,我必须多动手多实践。
教师评语
附页
//晶振:
TX-1C实验板上实际晶振为11.0592M,
//这里为了方便计算时间,我们假设晶振为12M.
#include
#defineucharunsignedchar
#defineuintunsignedint
#include"24c02.h"
sbitdula=P2^6;//定义锁存器锁存端
sbitwela=P2^7;
sbitrs=P3^5;//定义1602液晶RS端
sbitlcden=P3^4;//定义1602液晶LCDEN端
sbits1=P3^0;//定义按键--功能键
sbits2=P3^1;//定义按键--增加键
sbits3=P3^2;//定义按键--减小键
sbitrd=P3^7;
sbitbeep=P2^3;//定义蜂鸣器端
ucharcount,s1num;
charmiao,shi,fen,nian0,nian,yue,ri;
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddi()//蜂鸣器发声函数
{
beep=0;
delay(100);
beep=1;
}
voidwrite_com(ucharcom)//液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)//液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_nyr(ucharadd,uchardate)//写日期函数
{
ucharshi,ge;
shi=date/10;//分解一个2位数的十位和个位
ge=date%10;
write_com(0x80+add);//设置显示位置
write_date(0x30+shi);//送去液晶显示十位
write_date(0x30+ge);//送去液晶显示个位
}
voidwrite_sfm(ucharadd,uchardate)//写时分秒函数
{
ucharshi,ge;
shi=date/10;//分解一个2位数的十位和个位
ge=date%10;
write_com(0x80+0x40+add);//设置显示位置
write_date(0x30+shi);//送去液晶显示十位
write_date(0x30+ge);//送去液晶显示个位
}
voidinit()//初始化函数
{
ucharnum;
rd=0;//软件将矩阵按键第4列一端置低用以分解出独立按键
dula=0;//关闭两锁存器锁存端,防止操作液晶时数码管会出乱码
wela=0;
lcden=0;
fen=0;//初始化分种变量值
miao=0;
shi=0;
nian0=0;
nian=0;
yue=0;
ri=0;
count=0;
s1num=0;
init_24c02();
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//设置显示初始坐标
write_com(0x80+0x40+6);//写出时间显示部分的两个冒号
write_date(':
');
delay(5);
write_com(0x80+0x40+9);
write_date(':
');
delay(5);
write_com(0x80+6);//写出时间显示部分的两个-
write_date('-');
delay(5);
write_com(0x80+9);
write_date('-');
delay(5);
miao=read_add
(1);//首次上电从AT24C02中读取出存储的数据
fen=read_add
(2);
shi=read_add(3);
ri=read_add(4);
yue=read_add(5);
nian=read_add(6);
nian0=read_add(7);
write_sfm(10,miao);//分别送去液晶显示
write_sfm(7,fen);
write_sfm(4,shi);
write_nyr(0x0a,ri);
write_nyr(0x07,yue);
write_nyr(0x04,nian);
write_nyr(0x02,nian0);
TMOD=0x01;//设置定时器0工作模式1
TH0=(65536-50000)/256;//定时器装初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
voidkeyscan()//按键扫描函数
{
if(s1==0)
{
delay(5);
if(s1==0)//确认功能键被按下
{s1num++;//功能键按下次数记录
while(!
s1);//释放确认
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//第一次被按下时
{
TR0=0;//关闭定时器
write_com(0x80+0x40+10);//光标定位到秒位置
write_com(0x0f);//光标开始闪烁
}
if(s1num==2)//第二次按下光标闪烁定位到分钟位置
{
write_com(0x80+0x40+7);
}
if(s1num==3)//第三次按下光标闪烁定位到小时位置
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
write_com(0x80+0x0a);
}
if(s1num==5)
{
write_com(0x80+0x07);
}
if(s1num==6)
{
write_com(0x80+0x04);
}
if(s1num==7)
{
write_com(0x80+0x02);
}
if(s1num==8)//第8次按下
{
s1num=0;//记录按键数清零
write_com(0x0c);//取消光标闪烁
TR0=1;//启动定时器使时钟开始走
}
}
}
if(s1num!
=0)//只有功能键被按下后,增加和减小键才有效
{
if(s2==0)
{
delay(5);
if(s2==0)//增加键确认被按下
{
while(!
s2);//按键释放
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//若功能键第一次按下
{
miao++;//则调整秒加1
if(miao==60)//若满60后将清零
miao=0;
write_sfm(10,miao);//每调节一次送液晶显示一下
write_com(0x80+0x40+10);//显示位置重新回到调节处
write_add(1,miao);//数据改变立即存入24C02
}
if(s1num==2)//若功能键第二次按下
{
fen++;//则调整分钟加1
if(fen==60)//若满60后将清零
fen=0;
write_sfm(7,fen);//每调节一次送液晶显示一下
write_com(0x80+0x40+7);//显示位置重新回到调节处
write_add(2,fen);//数据改变立即存入24C02
}
if(s1num==3)//若功能键第三次按下
{
shi++;//则调整小时加1
if(shi==24)//若满24后将清零
shi=0;
write_sfm(4,shi);;//每调节一次送液晶显示一下
write_com(0x80+0x40+4);//显示位置重新回到调节处
write_add(3,shi);//数据改变立即存入24C02
}
if(s1num==4)//若功能键第四次按下
{
ri++;//则调整日加1
if(ri==32)//若满32后将置1
ri=1;
write_nyr(0x0a,ri);//每调节一次送液晶显示一下
write_com(0x80+0x0a);//显示位置重新回到调节处
write_add(4,ri);//数据改变立即存入24C02
}
if(s1num==5)//若功能键第五次按下
{
yue++;//则调整月加1
if(yue==13)//若满13后将置1
yue=1;
write_nyr(0x07,yue);//每调节一次送液晶显示一下
write_com(0x80+0x07);//显示位置重新回到调节处
write_add(5,yue);//数据改变立即存入24C02
}
if(s1num==6)//若功能键第六次按下
{
nian++;//则调整年后2位加1
if(nian==100)
nian=0;
write_nyr(0x04,nian);//每调节一次送液晶显示一下
write_com(0x80+0x04);//显示位置重新回到调节处
write_add(6,nian);//数据改变立即存入24C02
}
if(s1num==7)//若功能键第七次按下
{
nian0++;//则调整年后2位加1
if(nian0==100)
nian0=0;
write_nyr(0x02,nian0);//每调节一次送液晶显示一下
write_com(0x80+0x02);//显示位置重新回到调节处
write_add(7,nian0);//数据改变立即存入24C02
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)//确认减小键被按下
{
while(!
s3);//按键释放
di();//每当有按键释放蜂鸣器发出滴声
if(s1num==1)//若功能键第一次按下
{
miao--;//则调整秒减1
if(miao==-1)//若减到负数则将其重新设置为59
miao=59;
write_sfm(10,miao);//每调节一次送液晶显示一下
write_com(0x80+0x40+10);//显示位置重新回到调节处
write_add(1,miao);//数据改变立即存入24C02
}
if(s1num==2)//若功能键第二次按下
{
fen--;//则调整分钟减1
if(fen==-1)//若减到负数则将其重新设置为59
fen=59;
write_sfm(7,fen);//每调节一次送液晶显示一下
write_com(0x80+0x40+7);//显示位置重新回到调节处
write_add(2,fen);//数据改变立即存入24C02
}
if(s1num==3)//若功能键第二次按下
{
shi--;//则调整小时减1
if(shi==-1)//若减到负数则将其重新设置为23
shi=23;
write_sfm(4,shi);//每调节一次送液晶显示一下
write_com(0x80+0x40+4);//显示位置重新回到调节处
write_add(3,shi);//数据改变立即存入24C02
}
if(s1num==4)//若功能键第四次按下
{
ri--;//则调整日减1
if(ri==-1)//若减到负数则将其重新设置为31
ri=31;
write_nyr(0x0a,ri);//每调节一次送液晶显示一下
write_com(0x80+0x0a);//显示位置重新回到调节处
write_add(4,ri);//数据改变立即存入24C02
}
if(s1num==5)//若功能键第五次按下
{
yue--;//则调整月减1
if(yue==-1)//若减到负数则将其重新设置为12
yue=12;
write_nyr(0x07,yue);//每调节一次送液晶显示一下
write_com(0x80+0x07);//显示位置重新回到调节处
write_add(5,yue);//数据改变立即存入24C02
}
if(s1num==6)//若功能键第六次按下
{
nian--;//则调整小时减1
if(nian==-1)
nian=99;
write_nyr(0x04,nian);//每调节一次送液晶显示一下
write_com(0x80+0x04);//显示位置重新回到调节处
write_add(6,nian);//数据改变立即存入24C02
}
if(s1num==7)//若功能键第三次按下
{
nian0--;//则调整小时减1
if(nian0==-1)
nian0=99;
write_nyr(0x02,nian0);//每调节一次送液晶显示一下
write_com(0x80+0x02);//显示位置重新回到调节处
write_add(7,nian0);//数据改变立即存入24C02
}
}
}
}
}
voidmain()//主函数
{
init();//首先初始化各数据
while
(1)//进入主程序大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子钟 设计