51单片机实验秒表设计.docx
- 文档编号:26196464
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:1.90MB
51单片机实验秒表设计.docx
《51单片机实验秒表设计.docx》由会员分享,可在线阅读,更多相关《51单片机实验秒表设计.docx(15页珍藏版)》请在冰豆网上搜索。
51单片机实验秒表设计
.
实验报告
一、实验名称
10秒计时的秒表设计
二、实验内容
精确到0.1秒的秒表
三、相关模块
led数码管、usb、独立键盘
四、实验代码
#include
eg52.h
//对数据类型进行声明定义typedefunsignedintu16;
typedefunsignedcharu8;
sbitLSA=P2^2;
sbitLSB=P2^3;
sbitLSC=P2^4;
sbitk1=P3^1;
sbitk2=P3^0;
sbitk3=P3^2;
sbitk4=P3^3;
u8codesmgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u16s,sec;
unsignedinti;
资料Word
.
unsignedintj;
unsignedinta,b,c,d;
u8mb[2];
voidTimer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC;//给定时器赋初值,定时1ms
TL0=0X18;
TR0=0;//打开定时器
}
voiddelay(u16n)
{
while(n--);
}
voidDigDisplay1(u16i)
{
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case
(1):
LSA=1;LSB=0;LSC=0;break;
资料Word
.
case
(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
}
if(i==1)
{
P0=smgduan[mb[i]]+0x80;//发送段码
}
else
{
P0=smgduan[mb[i]];
}
间隔一段时间扫描delay
(1);//资料Word
.
P0=0x00;//消隐
}
voidDigDisplay2(u16i)
{
i=i+3;
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case
(1):
LSA=1;LSB=0;LSC=0;break;
case
(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(7):
资料Word
.
LSA=1;LSB=1;LSC=1;break;
}
if(i==4)
{
P0=smgduan[a]+0x80;
}
else
{
P0=smgduan[b];
}
delay
(1);
P0=0x00;
}
voidDigDisplay3(u16i)
{
i=i+6;
switch(i)
{
case(0):
LSA=0;LSB=0;LSC=0;break;
case
(1):
LSA=1;LSB=0;LSC=0;break;
资料Word
.
case
(2):
LSA=0;LSB=1;LSC=0;break;
case(3):
LSA=1;LSB=1;LSC=0;break;
case(4):
LSA=0;LSB=0;LSC=1;break;
case(5):
LSA=1;LSB=0;LSC=1;break;
case(6):
LSA=0;LSB=1;LSC=1;break;
case(7):
LSA=1;LSB=1;LSC=1;break;
}
if(i==7)
{
P0=smgduan[c]+0x80;
}
else
{
P0=smgduan[d];
}
delay
(1);
资料Word
.
P0=0x00;
}
voidkey1()
{
delay(10);
if(k1==0)
{
TR0=!
TR0;
while(!
k1);
}
}
voidkey2()
{
delay(10);
if(k2==0)
{
s=0;
sec=0;
while(!
k2);
}
}
voidkey3()
资料Word
.
{
delay(10);
if(k3==0)
{
if(j==0)j=1;
elsej=0;
if(j==1)
{
a=mb[1];
b=mb[0];
}
if(j==0)
{
c=mb[1];
d=mb[0];
}
while(!
k3);
}
}
voidkey4()
{
delay(10);
资料Word
.
if(k4==0)
{
s=0;
sec=0;
a=0;
b=0;
c=0;
d=0;
while(!
k2);
}
}
voidmain()
{
Timer0Init();
i=0;
j=0;
while
(1)
{
delay(10);
key1();
if(TF0==1)
{
资料Word
.
TF0=0;
TH0=0XFC;//给定时器赋初值,定时1ms
TL0=0X18;
s++;
}
if(s==60)
{
s=0;
sec++;
if(sec==100)sec=100;
}
key2();
mb[0]=sec_x0010_;
mb[1]=(sec/10)_x0010_;
key3();
DigDisplay1(i);
DigDisplay2(i);
DigDisplay3(i);
i++;
i=i%2;
key4();
}
资料Word
.
}
五、实验效果
K1作用:
启动、开始或暂停计时
K2作用:
计数位清零
K3作用:
记录当前时间并显示
K4作用:
清零所有的数码管
资料Word
.
资料Word
.
资料Word
.
六、实验遇到的问题
经过前几次的实验,0到10秒的计数已经不成问题,本次实验的难点主要在几个按键的功能实现上。
其中最难的便是K3按键,K3按键不仅需要保存当前时间,还要将时间覆盖现实到数码管上。
为此,我分别使用了abcd四个变量来保存当前时间,并用3个显示函数来实现数据的分别显示。
虽然这使得代码略显复资料Word
.
杂,但却不失为一个简单有效的办法。
资料Word
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 实验 秒表 设计