51单片机实验秒表设计.docx

上传人:b****5 文档编号:3099241 上传时间:2022-11-17 格式:DOCX 页数:15 大小:1.14MB
下载 相关 举报
51单片机实验秒表设计.docx_第1页
第1页 / 共15页
51单片机实验秒表设计.docx_第2页
第2页 / 共15页
51单片机实验秒表设计.docx_第3页
第3页 / 共15页
51单片机实验秒表设计.docx_第4页
第4页 / 共15页
51单片机实验秒表设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

51单片机实验秒表设计.docx

《51单片机实验秒表设计.docx》由会员分享,可在线阅读,更多相关《51单片机实验秒表设计.docx(15页珍藏版)》请在冰豆网上搜索。

51单片机实验秒表设计.docx

51单片机实验秒表设计

实验报告

一、实验名称

10秒计时的秒表设计

二、实验内容

精确到0.1秒的秒表

三、相关模块

led数码管、usb、独立键盘

四、实验代码

#include"reg52.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;

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;

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);//间隔一段时间扫描

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):

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;

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);

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()

{

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);

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)

{

TF0=0;

TH0=0XFC;//给定时器赋初值,定时1ms

TL0=0X18;

s++;

}

if(s==60)

{

s=0;

sec++;

if(sec==100)sec=100;

}

key2();

mb[0]=sec%10;

mb[1]=(sec/10)%10;

key3();

DigDisplay1(i);

DigDisplay2(i);

DigDisplay3(i);

i++;

i=i%2;

key4();

}

}

5、实验效果

K1作用:

启动、开始或暂停计时

K2作用:

计数位清零

K3作用:

记录当前时间并显示

K4作用:

清零所有的数码管

六、实验遇到的问题

经过前几次的实验,0到10秒的计数已经不成问题,本次实验的难点主要在几个按键的功能实现上。

其中最难的便是K3按键,K3按键不仅需要保存当前时间,还要将时间覆盖现实到数码管上。

为此,我分别使用了abcd四个变量来保存当前时间,并用3个显示函数来实现数据的分别显示。

虽然这使得代码略显复杂,但却不失为一个简单有效的办法。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1