单片机实训报告.docx
- 文档编号:26949711
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:17
- 大小:111.48KB
单片机实训报告.docx
《单片机实训报告.docx》由会员分享,可在线阅读,更多相关《单片机实训报告.docx(17页珍藏版)》请在冰豆网上搜索。
单片机实训报告
单片机实训报告
姓名:
学号:
班级:
指导老师:
实习时间2011年12月
实训题目
一、实训目的
二、整体设计
三、硬件电路图
四、程序流程图
五、源程序
六、实训体会
一、实训目的
通过数字钟的设计与制作,将前面所学的单片机内部定时器资源、I/O端口、键盘和现实接口等知识融会贯通,锻炼独立设计、制作和调试应用系统的能力,深入领会单片机应用系统的硬件设计、模块化程序设计及软硬件调试方法等,并掌握单片机应用系统的开发过程。
本设计主要实现以下功能:
(1)自动计时,由6位LED显示器显示时、分、秒;
(2)具有校准功能,可以设置当前时间;
(3)具备定时启闹功能,可以设置启闹,启闹1分钟后自动关闭闹钟。
二、整体设计
1.设计要求
(1)自动计时,由6位LED显示器显示时、分、秒。
(2)具备校准功能,可以设置当前时间。
----按键调整时间
(3)具备定时启闹功能,可以设置启闹时间,闹60秒后自动关闭闹铃。
2.系统总体设计方案
3.系统方案选择
(1)单片机选型及最小系统
选用MCS-51系列主流芯片STC89C52RC,内部带有4KB的FlashROM,无须外扩程序存储器。
由于数字钟无需大量运算和暂存数据,片内128字节RAM可以满足设计要求。
(2)计时方案选择
(1)实现时钟功能,各大厂家推出了一系列实时时钟电路,如DS1287、DS12887、DS1302、PCF8563、S35190等。
这些芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据每秒自动更新一次,不需程序干预。
单片机可通过中断或查询方式读取计时数据。
(2)利用单片机内部定时器进行中断定时,配合软件延时实现时、分、秒计时功能。
(3)显示及键盘方案
<1>利用单片机并行I/O口,实现LED动态显示
该方案直接使用单片机并行口作为显示接口,无需外扩接口芯片,但占用资源较多,且动态扫描显示方式需占用CPU时间。
在非实时测控或单片机具有足够并行口资源的情况下可以采用。
所以选用LED数码管。
<2>利用液晶LCD1602显示,实现液晶显示,该方案显示信息量大,编程麻烦。
<3>设计按键,按键采用4×4键盘,使显示结果更简洁。
功能键:
时间设定,首先按下是时钟秒的调节;其次为时钟分的调节;再次为时钟时的调节;
加1键:
加1键为每次按下功能键时,分别对时、分、秒进行加1;
减1键:
减1键为每次按下功能键时,分别对时、分、秒进行减1;
时钟与闹铃转换键:
闹钟设置/启闹/停闹键。
三、硬件电路图
四、程序流程图
键盘模块
显示模块
五、源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitp10=P1^0;
sbitp14=P1^4;
sbitp15=P1^5;
sbitp16=P1^6;
sbitp17=P1^7;
sbitp3=P3^3;
uchart0;//定义hangliekeyt0
uintn,x,p,w,z,h;
inti,j,m,a,b,c,d,k,e,f,r,y,a1,b1,c1,d1,e1,f1,u,h1,k1,r1,v;
ucharcodetab[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
voiddelay(uintq);//延时函数声明
voidsaomiao();//键盘扫描函数声明
voidxianshi();
voidnaozongxianshi();
voiddingshi();
voidsaomiao();
/******************显示******************/
voidxianshi()
{
a=h%10;
b=h/10;
c=k%10;
d=k/10;
e=r%10;
f=r/10;
P0=tab[a];
delay
(1);
P0=tab[b]+0x01;
delay
(1);
P0=tab[c]+0x02;
delay
(1);
P0=tab[d]+0x03;
delay
(1);
P0=tab[e]+0x04;
delay
(1);
P0=tab[f]+0x05;
delay
(1);
}
/********************闹钟显示******************/
voidnaozongxianshi()
{
a1=h1%10;
b1=h1/10;
c1=k1%10;
d1=k1/10;
e1=r1%10;
f1=r1/10;
P0=tab[a1];
delay
(1);
P0=tab[b1]+0x01;
delay
(1);
P0=tab[c1]+0x02;
delay
(1);
P0=tab[d1]+0x03;
delay
(1);
P0=tab[e1]+0x04;
delay
(1);
P0=tab[f1]+0x05;
delay
(1);
}
/*************定时器t0*******************/
voiddingshi()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
voidtimer()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
m++;
if(m==20)
{
m=0;
h++;
if(h==60)
{
h=0;
k++;
if(k==60)
{
k=0;
r++;
if(r==24)
r=0;
}
}
}
}
/*********键盘扫描函数*************/
voidsaomiao()
{
unsignedcharhang=0,lie=0,key=0;
P1=0x0f;//赋初值
if(P1!
=0x0f)//判断是否有键按下
{
hang=P1;//读行号
P1=0xf0;//行列反转
lie=P1;//读列号
key=hang|lie;//读键值
}
switch(key)//根据键值不同调用不同的处理函数
{
case0xee:
n=1;break;
case0xde:
n=2;break;
case0xbe:
n=3;break;
case0x7e:
n=4;break;
case0xed:
n=5;break;
case0xdd:
n=6;break;
case0xbd:
n=7;break;
case0x7d:
n=8;break;
case0xeb:
n=9;break;
case0xdb:
n=10;break;
case0xbb:
n=11;break;
case0x7b:
n=12;break;
case0xe7:
n=13;break;
case0xd7:
n=14;break;
case0xb7:
n=15;break;
case0x77:
n=16;break;
}
}
/*********延时函数*************/
voiddelay(uinto)
{
for(i=0;i for(j=500;j>0;j--); } /*************功能选择键********************/ voidgongnengjian() { if(n==5) { if(n! =5); n=0; u++; if(u==3) { u=1; } delay(30); } } /*********时间调试+闹钟调试***************/ voidshijiantiaoshi() { if(u==1) { if(n==1) { if(n! =1); n=0; k++; delay(30); if(k==60) { r=r+1; k=0; if(r==24) { r=0; } } } if(n==2) { if(n! =2); n=0; k--; delay(30); if(k==0) { k=59; } } if(n==3) { if(n! =3); n=0; r++; delay(30); if(r==24) { r=0; } } if(n==4) { if(n! =4); n=0; r--; delay(30); if(r==-1) { r=23; } } xianshi(); } /**********************闹钟**********************/ if(u==2) { if(n==1) { if(n! =1); n=0; k1++; delay(30); if(k1==60) { k1=0; r1=r1+1; if(r1==24) { r1=0; } } } if(n==2) { if(n! =2); n=0; k1--; delay(30); if(k1==0) { k1=59; } } if(n==3) { if(n! =3); n=0; r1++; delay(30); if(r1==24) { r1=0; } } if(n==4) { if(n! =4); n=0; r1--; delay(30); if(r1==-1) { r1=23; } } naozongxianshi(); } } /*************闹钟**********************/ voidnaozhong() { if((k==k1)&&(r==r1)) { for(v=0;v<50;v++) { p3=0; } p3=1; } } /********主函数*****************/ voidmain() { dingshi(); while (1) { saomiao(); gongnengjian(); shijiantiaoshi(); naozhong(); } } 六、实训体会 十天的单片机实训结束了,这次让我学到了很多东西,为期10天的单片机实训虽然不是很长,但是让我感觉到了原来编程不是很简单,先开始的显示时钟不是很难,下面的闹钟设置及调试部分就花费了相当长的时间,本来还以为编程会很简单的,等到实际操作起来才知道它的复杂性,没有想像中的那么得心应手,理解流程是有思维的前提。 我们竭尽全力思考,在老师的精心指导以及同学的互助下,程序基本编写成功,这是我们共同努力的结果,我不得不感慨单片机的重要性与高难度性,所以为期10天的单片机实训没有浪费,我从中学到了很多知识,也让我对单片机有了更深一步的了解。 这次实训中出现了很多问题,第一、是在学习上,没动脑,这次实训所遇到的多半问题多数都是由于我们不够严谨。 第二,实训中,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,加上足够的挑战困难的勇气,就没有什么办不到的。 “世上无难事,只怕有心人”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 报告