基于51单片机的数字秒表课程设计.docx
- 文档编号:12201387
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:27
- 大小:327.69KB
基于51单片机的数字秒表课程设计.docx
《基于51单片机的数字秒表课程设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数字秒表课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
基于51单片机的数字秒表课程设计
电气与自动化工程学院
卓越工程师培养计划
暑期实训报告
题目秒表系统的设计
年级11级专业自动化
班级卓越班学号*********
姓名俞雷
地点大学生创新实验室
日期2012年8月12日~2012年8月20日
一、单片机简介
单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。
并且已经深入到工业生产的各个环节以及人民生活的各层次中,如车间流水线控制、自动化系统等、智能型家用电器(冰箱、空调、彩电)等。
管脚图如图1.1所示。
图1.1AT89C52单片机引脚图
(1)电源地组Vcc和Vss;VCC—(40)脚接+5V电压;VSS—(20)脚接地
(2)时钟电路组XTAL1和XTAL2
(3)控制信号组RST/ALE/PSEN和EA
(4)I/O端口P0,P1,P2和P3
二、设计目标
1、设计目的:
1.利用单片机定时器中断实现秒表计时功能。
2.方案一:
通过LED显示程序的调整,熟悉LED动态显示的控制过程。
方案二:
通过对1602设置,熟悉1602液晶显示的控制过程。
3.通过键盘程序的调整,熟悉矩阵式键盘的控制,熟悉键盘扫描原理。
4.通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示、1602液晶的显示、键盘扫描和定时器中断等多种功能的综合程序。
2、具体操作:
方案一:
用AT89C51设计一个6位的数码管显示作为“秒表”,显示时间范围为0.00~655.36秒(此处可以通过设置两个变量进行进位操作来达到最大计数9999.99秒),计时精度达到0.01秒。
利用其定时器的原理,数码管以及定时器中断来设计计时器。
将软硬件结合起来,使得系统能实现0.00~655.36秒的计时。
另外,通过独立按键的设计来对秒表进行控制。
key1键控制计时的开始与暂停、key2键控制计时时的保存数据然后可以通过key4键控制数据的输出(可以保存十个,保存十个时秒表可以停止,该功能可用于赛跑中的计时)、key3键控制“清零”和保存按下清零键前的最后一次所计时间。
(特别声明:
每次处于“暂停状态”的时间都可以在此基础之上进行计时)。
方案二:
用AT89C51设计一个1602液晶显示的“秒表”,显示时间范围为0.00~655.36秒(此处可以通过设置两个变量进行进位操作来达到最大计数9999.99秒),计时精度达到0.01秒。
利用其定时器的原理,1602液晶以及定时器中断来设计计时器。
将软硬件结合起来,使得系统能实现0.00~655.36秒的计时。
另外,通过独立按键的设计来对秒表进行控制。
key1键控制计时的开始与暂停、key3键控制“清零”和保存按下清零键前的最后一次所计时间。
(特别声明:
每次处于“暂停状态”的时间都可以在此基础之上进行计时)。
注:
由于开发板的键盘对液晶显示有影响,顾放弃数码管秒表显示中的部分功能。
三、硬件设计
原理图:
(程序可用于在下图在软件中仿真也可以用于开发板)
四、系统的软件设计
1、软件整体设计思路:
将程序模块化与功能,含有多个子程序的调用与嵌套。
通过对按键的是否按下来对秒表进行操作,按键功能在设计目标的具体操作中已经展现。
10毫秒秒定时采用定时器T0中断的工作方式1进行,中断及计数的开启与关闭受控于按键处理程序。
2、软件流程图:
如图所示。
(注:
用1602液晶的方案中无key2与key4)
3、程序:
(1)数码管秒表显示程序:
/**********************************
数码管显示秒表计时
**********************************/
/**********************************
头文件宏定义定义
**********************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
uintt,tt;
uinttable[10];
ucharyi,er,san,si,wu,liu,i,j,k,l,m,flag;
ucharcodetable0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
ucharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
ucharcodetable2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
/**********************************
位定义
***********************************/
sbitdula=P2^6;
sbitwela=P2^7;
sbitkey1=P3^4;//开始与暂停
sbitkey2=P3^5;//保存10次时间
sbitkey3=P3^6;//清零与恢复
sbitkey4=P3^7;//读取保存的数据
/**********************************
函数的申明
**********************************/
voidinit();
voiddisplay(flag);
voiddisplay1();
voidkeyscan1();
voidkeyscan2();
voidshu(uintt);
voiddelay(uchard);
/*********************************
主函数
**********************************/
voidmain()
{
init();
while
(1)
{
display1();
keyscan2();
}
}
/*********************************
初始化函数
**********************************/
voidinit()
{
m=1;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=0;
shu(t);
}
/*********************************
总显示函数
**********************************/
voiddisplay(flag)
{
while(flag)
{
display1();
keyscan1();
}
}
/*********************************
数据显示函数
**********************************/
voiddisplay1()
{
P0=table0[liu];
dula=1;
dula=0;
P0=0xff;
P0=table2[0];
wela=1;
wela=0;
delay(5);
P0=table0[wu];
dula=1;
dula=0;
P0=0xff;
P0=table2[1];
wela=1;
wela=0;
delay(5);
P0=table0[si];
dula=1;
dula=0;
P0=0xff;
P0=table2[2];
wela=1;
wela=0;
delay(5);
P0=table1[san];
dula=1;
dula=0;
P0=0xff;
P0=table2[3];
wela=1;
wela=0;
delay(3);
P0=table0[er];
dula=1;
dula=0;
P0=0xff;
P0=table2[4];
wela=1;
wela=0;
delay(3);
P0=table0[yi];
dula=1;
dula=0;
P0=0xff;
P0=table2[5];
wela=1;
wela=0;
delay(3);
}
/**************************************
动态显示数字循环中的键盘检测
**************************************/
voidkeyscan1()
{
if(key1==0)
{
delay(10);
if(key1==0)
flag++;
while(!
key1);
delay(10);
while(!
key1);
if(flag%2)//判断是否暂停
TR0=1;
else
TR0=0;
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(j==10)
{
j=0;
flag++;
}
else
{
table[j]=t;
j++;
}
}
while(!
key2);
delay(10);
while(!
key2);
}
if(key3==0)
{
delay(10);
if(key3==0)
{
l++;
if(l%2)//判断是否清零还是恢复
{
tt=t;
t=0;
shu(t);
}
else
{
t=tt;
shu(tt);
}
display1();
}
while(!
key3);
delay(10);
while(!
key3);
}
if(key4==0)
{
delay(10);
if(key4==0)
{
if(k==10)k=0;
t=table[k];
shu(t);
display1();
k++;
}
while(!
key4);
delay(10);
while(!
key4);
}
}
/***************************************
主程序中计时暂停时的键盘检测
***************************************/
voidkeyscan2()
{
if(key1==0)
{
delay(10);
if(key1==0)
flag++;
while(!
key1);
delay(10);
while(!
key1);
}
if(flag%2)
TR0=1;
else
TR0=0;
display(flag%2);
if(key4==0)
{
delay(10);
if(key4==0)
{
if(k==10)k=0;
t=table[k];
shu(t);
display1();
k++;
}
while(!
key4);
delay(10);
while(!
key4);
}
}
/***************************************
数字的拆分
***************************************/
voidshu(uintt)
{
liu=t/100000;
wu=t/10000%10;
si=t/1000%10;
san=t/100%10;
er=t/10%10;
yi=t%10;
if(liu==0)liu=10;
if(wu==0)wu=10;
if(si==0)si=10;
}
/***************************************
延时函数
***************************************/
voiddelay(uchard)
{
unsignedchara,b,c;
for(c=d;c>0;c--)
for(b=120;b>0;b--)
for(a=2;a>0;a--);
}
/*****************************************
定时器0工作方式110毫秒计时
******************************************/
voidtime0()interrupt1//计时10毫秒
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t++;
shu(t);
if(t%1000==170)
if(m%2)
{
P1=0xaa;
m++;
}
else
P1=0x55;
}
(2)1602液晶秒表显示程序:
/*****************************************
1602液晶显示秒表计时
******************************************/
/**********************************
头文件宏定义定义
**********************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
uintt,tt;
ucharflag,yi,er,san,si,wu,liu,l,m,num;
ucharcodetable[]="0123456789";
ucharcodetable1[]="***STOPWATCH***";
/**********************************
位定义
***********************************/
sbitdula=P2^6;
sbitwela=P2^7;
sbitLCDE=P3^4;
sbitrs=P3^5;
sbitkey1=P3^6;
sbitkey3=P3^7;
/**********************************
函数的申明
**********************************/
voidinit();
voidwrite_com(ucharcom);
voidwrite_da(ucharda);
voidshu(uintt);
voidkeyscan1();
voiddisplay();
voiddisplay1();
voiddelay(ucharz);
/*********************************
主函数
**********************************/
voidmain()
{
init();
while
(1)
{
keyscan1();
display1();
}
}
/*********************************
初始化函数
**********************************/
voidinit()
{dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0xff;
wela=0;
LCDE=0;
write_com(0x01);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(num=0;num<16;num++)
{
write_da(table1[num]);
delay(3);
}
write_com(0x80+0x45);
delay(5);
shu(t);
display1();
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
}
/*********************************
写指令
**********************************/
voidwrite_com(ucharcom)
{
P0=com;
rs=0;
LCDE=0;
delay(5);
LCDE=1;
delay(5);
LCDE=0;
}
/*********************************
写数据
**********************************/
voidwrite_da(ucharda)
{
P0=da;
rs=1;
LCDE=0;
delay(5);
LCDE=1;
delay(5);
LCDE=0;
}
/*********************************
数的拆分
**********************************/
voidshu(uintt)
{
liu=t/100000;
wu=t/10000%10;
si=t/1000%10;
san=t/100%10;
er=t/10%10;
yi=t%10;
if(liu==0)liu=10;
if(wu==0)wu=10;
if(si==0)si=10;
}
/**************************************
动态显示数字循环中的键盘检测
**************************************/
voidkeyscan1()
{
if(key1==0)
{delay(10);
if(key1==0)
flag++;
while(!
key1);
delay(10);
while(!
key1);
}
if(flag%2)
TR0=1;
else
TR0=0;
if(key3==0)
{delay(10);
if(key3==0)
{l++;
if(l%2)
{tt=t;
t=0;
shu(t);
}
else
{t=tt;
shu(tt);
}
display1();
}
while(!
key3);
delay(10);
while(!
key3);
}
}
/*********************************
总显示函数
**********************************/
voiddisplay()
{
while(flag%2)
{
display1();
keyscan1();
}
}
/*********************************
数据显示函数
**********************************/
voiddisplay1()
{
write_com(0x80+0x45);
delay(5);
write_da(table[liu]);
write_da(table[wu]);
write_da(table[si]);
write_da(table[san]);
write_da(0x2e);
write_da(table[er]);
write_da(table[yi]);
}
/***************************************
延时函数
***************************************/
voiddelay(ucharz)
{uchari;
for(z;z>0;z--)
for(i=110;i>0;i--);
}
/*****************************************
定时器0工作方式110毫秒计时
******************************************/
voidtime0()interrupt1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
t++;
shu(t);
if(t%1000==170)
if(m%2)
{P1=0xaa;
m++;
}
else
P1=0x55;
}
五、系统的调试及设计结果
1602液晶——秒表显示效果图:
上电状态:
过程中灯亮状态:
四位数显示:
LED数码管——秒表显示效果图:
上电初始状态:
三位数显示:
灯亮状态:
六、创新实验室课程设计小结
此次为期九天的实训即将结束了,我对自己在此期间的表现还是比较满意的。
还记得刚开始接触51单片机还是在去年,那时对单片机可谓是一窍不通。
接触多了之后,渐渐的不再觉得它那么的难懂,自己对单片机也有了点认知。
通过对本次的课程设计,也使自己深刻的认识到自己的很多不足之处。
第一天,了解了一些关于robocup比赛的知识,同时也了解了我们院刚刚参加robocup比赛的一些情况,结合这些参赛队伍,毛老师讲了一些关于比赛队伍的小车的设计过程以及实现一些功能所需的条件。
其中,了解了循迹,避障,超声测距等电路
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 数字 秒表 课程设计