单片机课程结课设计报告.docx
- 文档编号:9166401
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:26
- 大小:202.48KB
单片机课程结课设计报告.docx
《单片机课程结课设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程结课设计报告.docx(26页珍藏版)》请在冰豆网上搜索。
单片机课程结课设计报告
《单片机技术》
课程结课设计报告
题目:
电子时钟
专业
班级
学号
姓名
指导教师
第一部分设计任务和要求
设计内容
利用STC89C51单片机和LCD1602电子显示屏实现电子时钟,可由按键进行调时和12/24小时切换。
设计要求
1.能实现年、月、日、星期、时、分、秒的显示;
2.能实现调时功能;
3.能实现12/24小时制切换;
4.能实现8:
00—22:
00整点报时功能。
系统运行流程
程序首先进行初始化,在主程序的循环程序中首先调用数据处理程序,然后调用显示程序,在判断是否有按键按下。
若有按键按下则转到相应的功能程序执行,没有按键按下则调用时间程序。
若没到则循环执行。
计时中断服务程序完成秒的计时及向分钟、小时的进位和星期、年、月、日的进位。
调时闪烁中断服务程序用于被调单元的闪烁显示。
调时程序用于调整分钟、小时、星期、日、月、年,主要由主函数组成通过对相关子程序的调用,如图所示。
实现了对时间的设置和修改、LCD显示数值等主要功能。
相关的调整是靠对功能键的判断來实现的。
第二部分设计方案
总体设计方案说明
1.程序设计及调试
根据单片机课程设计内容和要求,完成Piotues仿真电路的设计和用Keil软件编写程序,并进行仿真模拟调试。
2.硬件焊接及调试
根据仿真电路图完成电路板的焊接,并进行软、硬件的调试,只到达到预期
目的。
3・后期处理
对设计过程进行总结,完成设计报告。
主流程图
键盘扫描流程图
时钟流程图
第三部分系统硬件设计
最小系统
复位时单片机的初始化操作,只要给RST引脚加上两个机器周期以上的高电平信号,就可以使STC89C51单片机复位。
本次釆用的是12M晶振,按钮复位电路。
LCD显示电路
LCD显示屏的DO到D7与单片机P0口相连,LCD显示屏EN口与单片机口相
连,RS与相连。
通过滑动变阻器改变LCD显示屏的显示对比度。
LCD1
LM016L
SOUJ0
SOLUS>OLCMCO寸99卜
>>>a:
a:
ujaaaaaaaa
CO
•«V1
1k
PO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3PO.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7
38
37
36
35
34
33
32
39
-
1
2
3
4
5
6
7
8
9
RESPACK-8
RP1
键盘输入电路
本次设计采用独立键盘,键盘按下时,相应的I/O口电平由高变低,一次检
测按键是否被按下。
4个独立按键与单片机一口相连。
蜂鸣器和LED灯电路
蜂鸣器的作用为准点报时产生报警声,LED在秒钟为偶数时或者功能键被按
第四部分仿真电路图与仿真结果
用Keil和Protues进行仿真调试,仿真结果完全达到预期目的。
第五部分系统程序
#iiicludeo
#defineucharunsignedchar
#defineumtunsignedmt
sbitlcdrs=P3A5;〃定义1602液晶RS端
sbitlcden=P3A4;//定义1602液晶LCDEN端
sbitsl=P3z0;〃定义按键-功能键
sbits2=P3Al;〃定义按键-增加键
sbits3=P3A2;〃定义按键-减小键
sbits4=P3A3;〃定义按键一闹钟键
sbitbeep=P2A2;//定义蜂鸣器端
sbitled=P2A3;//定义LED灯端
uchaicouiit,slnum,s4num;
charyear,month,day,week,miao,shi,fen,pshi;
ucharcodetable[]="20--";//定义初始上电时液晶默认显示状态
voiddelay(uintz)〃延时函数
{
uiiitx,y;
fbr(x=z;x>0;x—)
for(y=110;y>0;y-);
}
voidzhuanhuan()
if(slu=O)pshi=12;
if(slii<=12&&shi>=1)pshi=slii;
if(shi>12)pslii=slii-12;
}
voidd“〃蜂鸣器发声函数
{
beep=O;
delay(3OO);
beep=l;
delay(3OO);
}
voidwiite_com(uchai-com)//液晶写命令函数{
lcdrs=O;
lcden=0;
P0=com;
delay(5);
lcden=l;
delay(5);
lcden=0;
}
voidwiite_date(uchai-date)//液晶写数据函数{
lcdrs=l;
lcden=0;
PO=date;
delay(5);
lcden=l;
delay(5);
lcden=0;
}
void_sluQ〃写”AM”、nPMH函数
{
if(slii>=12)
{
(0x80+0x40+1);//写出MPMHwnte_date(P);
write_date(,M,);
}
else
wnte_com(0x80+0x40+1);//写出"AM“wnte^dateCA1);
wiitjda忙(M);
voidwrite_ymd(ucharaddLuclwdatel)//写年月口函数
ucharslii5ge;
slu=datel/10;//分解一个2位数的十位和个位
ge=datel%10;
wiite_com(0x80+add1);//设置显示位置wiite_date(0x30+shi);〃送去液品显示十位wdte_date(0x30+ge);〃送去液晶显示个位
voidwiite_sfm(uchai-add,uchardate)//写时分秒函数
ucharslii5ge;
slu=date/10;//分解一个2位数的十位和个位ge=date%10;
write_com(0x80+0x40+add)^/设置显示位置wiite_date(0x30+shi);〃送去液品显示十位wdte_date(0x30+ge);〃送去液晶显示个位
voidwrite_week(chai-week)〃写液晶星期显示函数
write_com(0x80+12);switch(xveek)
case1:
write_dateCMr);delay(5);wiite_date(,O,);delay(5);wnte_date(,N,);
break;
case2:
wiite_date(T,);delay(5);wiite_date(rU,);delay(5);wntjda忙(E);
break;
case3:
wnte_date(W,);delay(5);write_date(,E,);delay(5);wnte_date(fD,);
break;
case4:
wiite_date(T,);delay(5);wiite_date(fH,);delay(5);wnte_date(rU,);
break;
case5:
wiite_date(,F,);delay(5);
write_date(,R,);delay(5);wnte.date(T);
break;
case6:
write_date('S,);delay(5);write_date(*A,);delay(5);wnte.date(T,);
break;
case7:
wiite_date(,S,);delay(5);write_date(rU,);delay(5);wnte.dateCN1);
break;
}
}
voidwriteymQ
{
day=l;
month++;
if(nionth=13)
{
month=l;
year-H-;
if(yea尸=100)
veai-0:
write_ymd(3,year);//年若变化则重新写入}
wnte_ymd(6,month);//月若变化则重新写入}
void初始化函数
{
ucharnum;
lcden=0;
yea尸13;//初始化种变量值
montli=6;
dav=21;
J7
week=5;
slii=13;
fen=59;
niiao=58;
count=0;
slnum=0;
s4num=0;write_com(0x38);//初始化1602液晶write_com(OxOc);
write_com(0x06);
write_com(0x01);
wiite_com(0x80);//设置显示初始坐标for(num=0;num<15;num++)//显示年月口星期
write_date(table[num]);
delav(5);
delay(5);
wnte_com(0x80+0x40+6);〃写出时间显示部分的两个心,write-date(,/);
delay(5);
write_com(0x804-0x40+9);write-date(,/);
delav(5);
write_week(week);
wiite_ymd(3,year);//分别送去液晶显示write_ymd(6,month);
wiite_ymd(9,day);
wiite_sfin(l0,miao);//分别送去液晶显示write_sfin(7,fen);
write_sfin(4,slii);
TMOD=0x01;〃设置定时器0工作模式1
TH0=(65536・50000)/256;〃定时器装初值TL0=(65536・50000)%256;
EA=1;〃开总中断
ETO=1;〃开定时器0中断
TRO=1;〃启动定时器0
}
voidkeyscanQ//按键扫描函数if(sl==O)
delav(5);
if(sl==O)//确认功能键被按F
slnum++;//功能键按卜次数记录
while(!
sl);//释放确认
if(s1num=1)//第一次被按卜•时
TR0=0;〃关闭定时器write_com(0x80+3);//光标定位到年位置wiite_com(0x0f);〃光标开始闪烁
if(slnum==2)//第二次按卜•光标闪烁定位到月位置{
write_com(0x80+6);
}
if(slnum==3)//第三次按下光标闪烁定位到口位置{
write_com(0x80+9);
}
if(slnum=4)//第四次按卜光标闪烁定位到星期位置{
write_com(0x80+12);
}
if(slnum==7)//第七次被按卜•时光标定位到秒位置{
write_com(0x80+0x40+10);
}
if(slnum==6)//第六次按下光标闪烁定位到分位置{
write_com(0x80+0x40+7);
}
if(slnum==5)//第五次按下光标闪烁定位到时位置{
write_com(0x80+0x40+4);
}
if(slnum=8)//第七次按下
{
s1num=0;〃记录按键数清零write_com(0x0c);//取消光标闪烁TR0=l;〃启动定时器使时钟开始走
}
}
}
if(slnum!
=0)//只有功能键被按卞后,增加和减小键才有效{
if(s2==0)
{
delay(5);
if(s2=0)//增加键确认被按F
{
while(!
s2);//按键释放
if(s1iium=1)〃若功能键第一次按下
year++;〃则调整年加1if(yeai-==100)//若满100后将清零
veai-0;
Jz
write_ymd(3,veai);//每调节一次送液晶显示一下write_com(0x80+3);〃显示位置重新回到调节处
}
if(slnum=2)//若功能键第二次按F
{
month++;//则调整月加1if(month==13)//若满12后将置一
month=l;
wiite_ymd(6jnontli);〃每调节一次送液晶显示一卜write_com(0x80+6);〃显示位置重新回到调节处
}
if(slnum=3)//若功能键第三次按F
{
day++;//则调整口加1if(yeai-%4==0&&montli==2){
if(day=30)//若满29后将置一
day=l;
}
if(yeai%4!
=0&&month=2)
{
if(day=29)//若满28后将置一
day=l;
}
if(month!
=2&&month!
=4&&month!
=6&&month!
=9&&month!
=11)
{
if(day=32)//若满31后将置一day=l;
}
if(month==41|month==6||month==9||month=11)
{
if(day=31)//若满30后将置一day=l;
}wnte_ymd(9Jay);;//每调节一次送液晶显示一下write_com(0x80+9);〃显示位置重新回到调节处
}
if(slnum=4)〃若功能键第四次按F
{
week++;//则调整星期加1if(week==8)//若满8后将置一
week=l;
write_week(week);//每调节一次送液晶显示一卜wiite_com(0x80+12);〃显示位置重新回到调节处
if(slnum=7)//若功能键第七次按下
{
111130++;//则调整秒加1if(nuao==60)//若满60后将清零
imao=0;
write_sfhi(10.nuao)y/每调节一次送液晶显示一卞wnte_com(0x80+0x40+10)//显示位置重新回到调节处
}
if(slnum==6)//若功能键第二次按K
{
fen++y/则调整分钟加1if(fen==60)〃若满60后将清零
fen=0;
write_sfm(7,fbn);〃每调节一次送液晶显示一下wnte_com(0x80+0x40+7);//显示位置重新回到调节处
}
if(slnum=5)//若功能键第五次按F
{
shi++;
if(shi==24)//若满24后将清零
{
slu=0;
}
if(s4num==0)
{
WTite_sfin(4,shi);;〃每调节一次送液晶显示一卞wiite_com(0x80+0x40+4);//显示位置重新回到调节处}
if(s4num=l)
{
zhuanhuanQ;
_slu0;
wiite_sfhi(4,pslu);;//每调节一次送液晶显示一下wnte_com(0x80+0x40+4);//显示位置重新回到调节处}
}
}
}
if(s3==0)
delay(5);
if(s3=0)//确认减小键被按F
{
while(!
s3);//按键释放
if(slnum=1)〃若功能键第一次按下
{
year-;//则调整秒减1
if(yeai-==-l)//若减到负数则将其重新设置为99veai-99;
write_ynid(3.year);//每调节一次送液晶显示一Kwrite_com(0x80+3)//显示位置重新回到调节处
}
if(slnum=2)//若功能键第二次按F
{
month-;//则调整分钟减1if(montli==0)〃若减到负数则将其重新设置为59month=12;
write_ymd(6.month);〃每调节一次送液晶显示一Fwrite_com(0x80+6)〃显示位置重新回到调节处
}
if(slnum=3)//若功能键第二次按F
{
day—;//则调整口加1
if(yeai-%4==0&&montli==2)
{if(day=O)〃若满29后将置一dav=29;
Jz
}
if(yeai%4!
=0&&month=2)
{
if(day=O)〃若满28后将置一
dav=28;
Jz
}
if(month!
=2&&month!
=4&&month!
=6&&month!
=9&&month!
=11)
{
if(day=O)〃若满31后将置一
dav=31;
Jz
}
if(month==41|month==6||month==9||month=11)
{if(day=O)〃若满30后将置一dav=30;
Jz
}
wnte_ymd(9,day);;//每调节一次送液晶显示一下
wiite_com(0x80+9)//显示位置重新回到调节处
}
if(slnum=4)//若功能键第二次按F
{
week-;//则调整小时减1if(week==O)//若减到负数则将其重新设置为23week=7;
wiite_week(week);//每调节一次送液晶显示一卜wiite_com(0x80+12);//显示位置重新回到调节处}if(slnum=7)//若功能键第一次按F
{
miao--;//则调整秒减1
if(nuao==-l)//若减到负数则将其重新设置为59miao=59;
wnte_sfhi(10.nuao)y/每调节一次送液晶显示一下wnte_com(0x80+0x40+10)^/显示位置重新回到调节处}
if(slnum=6)〃若功能键第二次按F
{
fen-y/则调整分钟减1
if(fen==-l)//若减到负数则将其重新设置为59fen=59;
wnte_sfhi(7,fen);//每调节一次送液晶显示一下wiite_com(0x80+0x40+7);//显示位置重新回到调节处}
iflslnum=5)//若功能键第二次按K
{
shi—;
if(shi==-l)//若满24后将清零
shi=23;
if(s4num==0)
{wnte_sfin(4,shi);y/每调节一次送液晶显示一下wiite_com(0x80+0x40+4);//显示位置重新回到调节处
}
if(s4num==l)
{
zliuaiiliuanQ;
-SluO;
wiite_sfin(4,pslii);;//每调节一次送液晶显示一下wiite_com(0x80+0x40+4);//显示位置重新回到调节处
}
if(slnum==O)
{
if(s4==0)
{
delay(5);
if(s4==0)//确认功能键被按K
{
s4num++;//功能键按F次数记录while(!
s4)#释放确认if(s4num=1)//第一次被按下时{
zliuaiihuaiiQ;-S1110;write_sfin(4,pslii);
}
if(s4num=2)〃第二次按下
{
s4num=0;//记录按键数清零wiite_com(0x80+0x40+1);wiite.dateC*);wiite.dateC*);write_sfin(4,shi);
}
}
}
}
}
voidmain()//主函数
{
iiiit();//首先初始化各数据while
(1)//进入主程序人循环
{
keyscaiiQ;//不停的检测按键是否被按Fif(slnum!
=O)led=O;
else
led=niiao%2;
if((shi>7&&shi<23)&&(fen==O)&&(miao=0))
diQ;
}
}
voidtimeiOQmtemipt1//定时器0中断服务程序
{
TH0=(65536-50000)/256;//再次装定时器初值
TL0=(65536・50000)%256;
count-H-;//中断次数累加
if(count=20)//20次50毫秒为1秒
{
count=0;
niiao-H-;
if(miao=60)//秒加到60则进位分钟
{
nuao=0;〃同时秒数清零
fen++;
if(fen==60)//分钟加到60则进位小时
{
fen=0;〃同时分钟数清零
shi++;
if(shi==24)//小时加到24则小时清零
{
shi=O;
week++;
if(week=8)
{
week=l;
}
write_week(week);//星期若变化则重新写入
day++;
if(veai5o4==0&&month=2)//判断是否为闰年的2月{
if(day=30)
{
writeym();
}
wnte_ymd(9Jav);//口若变化则重新写入
}
if(yeai%4!
=0&&month=2)//判断是否为平年的2月{
if(day=29)
writeym();
}
wnte_ymd(9Jav);//口若变化则重新写入
}
if(month!
=2&&month!
=4&&month!
=6&&niomh!
=9&&month!
=11)
{
if(day=32)
{writeym();
}
wnte_ymd(9.dav);//口若变化则重新写入
}
if(mont
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程 设计 报告