模板51单片机课程结课设计报告.docx
- 文档编号:17736595
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:31
- 大小:347.39KB
模板51单片机课程结课设计报告.docx
《模板51单片机课程结课设计报告.docx》由会员分享,可在线阅读,更多相关《模板51单片机课程结课设计报告.docx(31页珍藏版)》请在冰点文库上搜索。
模板51单片机课程结课设计报告
《单片机技术》
课程结课设计报告
题目:
电子时钟
班级
学号
姓名
指导教师张琦
第一部分设计任务和要求
1.1设计内容
利用STC89C51单片机和LCD1602电子显示屏实现电子时钟,可由按键进行调时和12/24小
时切换。
1.2设计要求
1•能实现年、月、日、星期、时、分、秒的显示;
2•能实现调时功能;
3.能实现12/24小时制切换;
4•能实现8:
00—22:
00整点报时功能。
1.3系统运行流程
程序首先进行初始化,在主程序的循环程序中首先调用数据处理程序,然后调用显示程序,在
判断是否有按键按下。
若有按键按下则转到相应的功能程序执行,没有按键按下则调用时间程序。
若没到则循环执行。
计时中断服务程序完成秒的计时及向分钟、小时的进位和星期、年、月、日的进位。
调时闪烁中断服务程序用于被调单元的闪烁显示。
调时程序用于调整分钟、小时、星期、日、
月、年,主要由主函数组成通过对相关子程序的调用,如图所示。
实现了对时间的设置和修改、LCD显示数值等主要功能。
相关的调整是靠对功能键的判断来实现的。
第二部分设计方案
2.1总体设计方案说明
1.程序设计及调试
根据单片机课程设计内容和要求,完成Protues仿真电路的设计和用Keil软件编写程序,并进行仿真模拟调试。
2.硬件焊接及调试
根据仿真电路图完成电路板的焊接,并进行软、硬件的调试,只到达到预期目的。
3.后期处理
对设计过程进行总结,完成设计报告。
2.2单片机系统方框图
2.2单片机系统流程图
开始
初始化
*
时钟子程序
按键扫描子
程序
结束
主流程图
键盘扫描流程图
时钟流程图
第三部分系统硬件设计
3.1最小系统
复位时单片机的初始化操作,只要给两个机器周期以上的高电平信号,就可单片机复位。
本次采用的是12M晶振,路。
C1
十
“口
C2—I—
HI―L
世r
"RS
X1
CRYSTAL
KJALI
XT心
RST引脚加上
以使STC89C51
按钮复位电
RST
F'L-IJ
ALEEA
3.2LCD显示电路
LCD显示屏的DO到D7与单片机P0口相连,LCD显示屏EN口与单片机P3.4口相连,RS与P3.5
相连。
通过滑动变阻器改变LCD显示屏的显示对比度
♦
wi
Ik
PO.WADO
PO.1/AD1尸C.2/AP2FO.3/AD3PO
POLADSPG.&/AD6FG.7/AD7
32
LCD1
LMO4I5L
A
O
4
39
38
27
1
RESPACk-B
A
单片机P2.2口相连,LED灯与单片机P2.3口相连。
第四部分仿真电路图与仿真结果
用Keil和Protues进行仿真调试,仿真结果完全达到预期目的
I**—・TF「・
2013-66-2LFRI
14:
00:
LI
:
-二i-
■■-«r=
吃纳。
r-.<.■>
F2£jmi3
F2I-WU
P2?
M15
P3W
R4
ms?
-'L.i心a-'L-
c1245t1円円P1円P1P1円PI
LCD1
LMDfEL
F-L.^ii-,
4^
T
RP1
第五部分系统程序
lj
-D
4—
[f
53.
HF-
■IF
P3.WWDIK3.1JTBD巧工珂丽巧.•湎F
P94/T0
ra&n
#include
#defineuchar
unsignedchar#defineuint
unsignedintsbitlcdrs=P3A5;//定义1602液晶RS端
sbitlcden=P3A4;〃定义1602液晶LCDEN端
sbits仁P3A0;//定义按键--功能
键
sbits2=P3A1;//定义按键--增加键sbits3=P3A2;//定义按键--减小键sbits4=P3A3;//定义按键--闹钟键sbitbeep=P2A2;//定义蜂鸣器端sbitled=P2A3;//定义LED灯端
ucharcount,s1num,s4num;
charyear,month,day,week,miao,shi,fen,pshi;
ucharcodetable[]="20--”;〃定义初始上电时液晶默认显示状态
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidzhuanhuan()
{
if(shi==0)
pshi=12;
if(shi<=12&&shi>=1)
pshi=shi;
if(shi>12)
pshi=shi-12;
}
voiddi()//蜂鸣器发声函数
{
beep=0;
delay(300);
beep=1;
delay(300);
}
voidwrite_com(ucharcom)//液晶写命令函数
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)//液晶写数据函数
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void_shi()//写"AM"、"PM"函数
if(shi>=12)
{write_com(0x80+0x40+1);〃写出"PM"write_date(P);
write_date('M');
}
else
{
write_com(0x80+0x40+1);〃写出"AM"write_date('A');
write_date('M');
}
}
voidwrite_ymd(ucharadd1,uchardate1)〃写年月日函数{
ucharshi,ge;
shi=date1/10;〃分解一个2位数的十位和个位
ge=date1%10;
write_com(0x80+add1);〃设置显示位置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);//送去液晶显示个位
}
voidwrite_week(charweek)//写液晶星期显示函数
{
write_com(0x80+12);
switch(week)
{
case1:
write_date('M');delay(5);write_date('O');delay(5);write_date('N');
break;
case2:
write_date('T');delay(5);
write_date('U');delay(5);write_date('E');
break;
case3:
write_date('W);delay(5);
write_date('E');delay(5);write_date('D');
break;
case4:
write_date('T');delay(5);
write_date('H');delay(5);write_date('U');
break;
case5:
write_date('F');delay(5);
write_date('R');delay(5);write_date(T);
break;
case6:
write_date('S');delay(5);
write_date('A');delay(5);write_date('T');
break;
case7:
write_date('S');delay(5);
write_date('U');delay(5);write_date('N');
break;
}
}
voidwriteym()
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
write_ymd(3,year);〃年若变化则重新写入}
write_ymd(6,month);//月若变化则重新写入}
voidinit()//初始化函数
{
ucharnum;
lcden=0;
year=13;//初始化种变量值
month=6;
day=21;
week=5;
shi=13;
fen=59;
miao=58;
count=0;
s1num=0;
s4num=0;
write_com(0x38);〃初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);〃设置显示初始坐标for(num=0;num<15;num++)〃显示年月日星期{
write_date(table[num]);
delay(5);
}
delay(5);
write_com(0x80+0x40+6);〃写出时间显示部分的两个":
"
write_date(':
');
delay(5);
write_com(0x80+0x40+9);write_date(':
');
delay(5);
write_week(week);
write_ymd(3,year);〃分别送去液晶显示write_ymd(6,month);
write_ymd(9,day);
write_sfm(10,miao);〃分别送去液晶显示write_sfm(7,fen);
write_sfm(4,shi);
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);〃释放确认
if(s1num==1)〃第一次被按下时
TRO=O;//关闭定时器write_com(0x80+3);〃光标定位到年位置write_com(OxOf);//光标开始闪烁
}
if(s1num==2)〃第二次按下光标闪烁定位到月位置
{
write_com(0x80+6);
}
if(s1num==3)〃第三次按下光标闪烁定位到日位置
{
write_com(0x80+9);
}
if(s1num==4)〃第四次按下光标闪烁定位到星期位置
{
write_com(0x80+12);
}
if(s1num==7)〃第七次被按下时光标定位到秒位置
{write_com(0x80+0x40+10);
}
if(s1num==6)〃第六次按下光标闪烁定位到分位置
{
write_com(0x80+0x40+7);
}
if(s1num==5)〃第五次按下光标闪烁定位到时位置
{
write_com(0x80+0x40+4);
}
if(s1num==8)〃第七次按下
{
s1num=0;//记录按键数清零write_com(0x0c);〃取消光标闪烁
TR0=1;//启动定时器使时钟开始走
}
}
}
if(s1num!
=0)〃只有功能键被按下后,增加和减小键才有效
{
if(s2==0)
{
delay(5);
if(s2==0)〃增加键确认被按下
while(!
s2);〃按键释放
if(s1num==1)〃若功能键第一次按下
{
year++;//则调整年加1if(year==100)〃若满100后将清零
year=0;
write_ymd(3,year);〃每调节一次送液晶显示一下write_com(0x80+3);〃显示位置重新回到调节处
}
if(s1num==2)〃若功能键第二次按下
{
month++;//则调整月加1
if(month==13)〃若满12后将置一
month=1;
write_ymd(6,month);//每调节一次送液晶显示一下write_com(0x80+6);〃显示位置重新回到调节处
}
if(s1num==3)〃若功能键第三次按下
{
day++;//则调整日加1if(year%4==0&&month==2){
if(day==30)//若满29后将置一
day=1;
}
if(year%4!
=0&&month==2)
{
if(day==29)//若满28后将置一
day=1;
}
if(month!
=2&&month!
=4&&month!
=6&&month!
=9&&month!
=11){
if(day==32)//若满31后将置一
day=1;
}
if(month==4||month==6||month==9||month==11)
{
if(day==31)//若满30后将置一day=1;
}write_ymd(9,day);;//每调节一次送液晶显示一下write_com(0x80+9);〃显示位置重新回到调节处
}
if(s1num==4)〃若功能键第四次按下
week++;//则调整星期加1
if(week==8)〃若满8后将置一
week=1;
write_week(week);〃每调节一次送液晶显示一下write_com(0x80+12);〃显示位置重新回到调节处
}
if(s1num==7)〃若功能键第七次按下
{
miao++;//则调整秒加1if(miao==60)〃若满60后将清零
miao=0;
write_sfm(10,miao);〃每调节一次送液晶显示一下write_com(0x80+0x40+10);〃显示位置重新回到调节处
}
if(s1num==6)〃若功能键第二次按下
{
fen++;//则调整分钟加1if(fen==60)//若满60后将清零fen=O;
write_sfm(7,fen);〃每调节一次送液晶显示一下write_com(0x80+0x40+7);〃显示位置重新回到调节处
}
if(s1num==5)〃若功能键第五次按下
{
shi++;
if(shi==24)〃若满24后将清零
{
shi=0;
}
if(s4num==0)
{
write_sfm(4,shi);;〃每调节一次送液晶显示一下write_com(0x80+0x40+4);〃显示位置重新回到调节处}
if(s4num==1)
{
zhuanhuan();
_shi();
write_sfm(4,pshi);;〃每调节一次送液晶显示一下write_com(0x80+0x40+4);〃显示位置重新回到调节处}
}
}
}
delay(5);
if(s3==0)〃确认减小键被按下
{
while(!
s3);〃按键释放
if(s1num==1)〃若功能键第一次按下
{
year--;//则调整秒减1
if(year==-1)〃若减到负数则将其重新设置为99
year=99;
write_ymd(3,year);〃每调节一次送液晶显示一下write_com(0x80+3);〃显示位置重新回到调节处
}
if(s1num==2)〃若功能键第二次按下
{
month--;//则调整分钟减1
if(month==O)〃若减到负数则将其重新设置为59
month=12;
write_ymd(6,month);//每调节一次送液晶显示一下write_com(0x80+6);〃显示位置重新回到调节处
}
if(s1num==3)〃若功能键第二次按下
{
day--;//则调整日加1
if(year%4==0&&month==2)
{
if(day==0)//若满29后将置一day=29;
}
if(year%4!
=0&&month==2)
{
if(day==0)//若满28后将置一day=28;
}
if(month!
=2&&month!
=4&&month!
=6&&month!
=9&&month!
=11){
if(day==0)//若满31后将置一day=31;
}
if(month==4||month==6||month==9||month==11)
{
if(day==0)//若满30后将置一day=30;
}
write_ymd(9,day);;//每调节一次送液晶显示一下
write_com(0x80+9);〃显示位置重新回到调节处
}
if(s1num==4)〃若功能键第二次按下
{
week--;//则调整小时减1if(week==O)〃若减到负数则将其重新设置为23
week=7;
write_week(week);〃每调节一次送液晶显示一下write_com(0x80+12);〃显示位置重新回到调节处
}
if(s1num==7)〃若功能键第一次按下
{
miao--;//则调整秒减1
if(miao==-1)〃若减到负数则将其重新设置为59
miao=59;
write_sfm(10,miao);〃每调节一次送液晶显示一下write_com(0x80+0x40+10);〃显示位置重新回到调节处
}
if(s1num==6)〃若功能键第二次按下
{
fen--;//则调整分钟减1
if(fen==-1)〃若减到负数则将其重新设置为59
fen=59;
write_sfm(7,fen);〃每调节一次送液晶显示一下write_com(0x80+0x40+7);〃显示位置重新回到调节处
}
if(s1num==5)〃若功能键第二次按下
{
shi--;
if(shi==-1)//若满24后将清零
shi=23;
if(s4num==0)
{
write_sfm(4,shi);;//每调节一次送液晶显示一下write_com(0x80+0x40+4);〃显示位置重新回到调节处}
if(s4num==1)
{
zhuanhuan();
_shi();
write_sfm(4,pshi);;//每调节一次送液晶显示一下write_com(0x80+0x40+4);〃显示位置重新回到调节处}
}
if(s1num==O)
{
if(s4==0)
{
delay(5);
if(s4==0)〃确认功能键被按下
{
s4num++;〃功能键按下次数记录
while(!
s4);〃释放确认
if(s4num==1)〃第一次被按下时
{
zhuanhuan();
_shi();
write_sfm(4,pshi);
}
if(s4num==2)〃第二次按下
{
s4num=0;//记录按键数清零write_com(0x80+0x40+1);write_date('');
write_date('');
write_sfm(4,shi);
}
}
}
}
}
voidmain()//主函数
{
init();//首先初始化各数据
while
(1)//进入主程序大循环
{
keyscan();〃不停的检测按键是否被按下
if(s1num!
=0)
led=0;
else
led=miao%2;
if((shi>7&&shi<23)&&(fen==0)&&(miao==0)){
di();
}
}
}
voidtimer0()interrupt1//定时器0中断服务程序
TH0=(65536-50000)/256;〃再次装定时器初值
TL0=(65536-50000)%256;
count++;〃中断次数累加
if(count==20)〃20次50毫秒为1秒
{
count=0;
miao++;
if(miao==60)〃秒加到60则进位分钟
{
miao=0;//同时秒数清零
fen++;
if(fen==60)//分钟加到60则进位小时
{
fen=0;//同时分钟数清零
shi++;
if(shi==24)〃小时加到24则小时清零
{
shi=0;
week++;
if(week==8)
{
week=1;
}
write_week(week);//星期若变化则重新写入day++;
if(year%4==0&&month==2)〃判断是否为闰年的2月
{
if(day==30)
{
writeym();
}
write_ymd(9,day);〃日若变化则重新写入
}
if(year%4!
=0&&month==2)〃判断是否为平年的2月
{
if(day==29)
{
writeym();
}
write_ymd(9,day);//日若变化则重新写入
}
if(month!
=2&&month!
=4&&month!
=6&&month!
=9&&month!
=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模板 51 单片机 课程 设计 报告