1、51单片机实验秒表设计说明实验报告一、实验名称10秒计时的秒表设计二、实验内容精确到0.1秒的秒表三、相关模块led数码管、usb、独立键盘四、实验代码#include reg52.h typedef unsigned int u16; /对数据类型进行声明定义typedef unsigned char u8;sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;sbit k1=P31;sbit k2=P30;sbit k3=P32; sbit k4=P33;u8 code smgduan17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0
2、7, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;u16 s,sec;unsigned int i;unsigned int j;unsigned int a,b,c,d;u8 mb2;void Timer0Init() TMOD|=0X01;/选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0XFC; /给定时器赋初值,定时1ms TL0=0X18; TR0=0;/打开定时器 void delay(u16 n) while(n-); void DigDisplay1(u16 i) switch(i) case(0): LSA=0;LSB=0;
3、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=smgduanmbi+0x80;/发送段码 else P0
4、=smgduanmbi; delay(1); /间隔一段时间扫描 P0=0x00;/消隐void DigDisplay2(u16 i) 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(
5、6): LSA=0;LSB=1;LSC=1; break; case(7): LSA=1;LSB=1;LSC=1; break; if (i=4) P0=smgduana+0x80; else P0=smgduanb; delay(1); P0=0x00;void DigDisplay3(u16 i) 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
6、; 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=smgduanc+0x80; else P0=smgduand; delay(1); P0=0x00;void key1() delay(10); if(k1=0) TR0=!TR0; while(!k1); void key2() delay(10); if(k2=0) s=
7、0; sec=0; while(!k2); void key3() delay(10); if(k3=0) if (j=0) j=1; else j=0; if (j=1) a=mb1; b=mb0; if (j=0) c=mb1; d=mb0; while(!k3); void key4() delay(10); if(k4=0) s=0; sec=0; a=0; b=0; c=0; d=0; while(!k2); void main() Timer0Init(); i=0; j=0; while(1) delay(10); key1(); if(TF0=1) TF0=0; TH0=0XF
8、C; /给定时器赋初值,定时1ms TL0=0X18; s+; if(s=60) s=0; sec+; if(sec=100)sec=100; key2(); mb0=sec%10; mb1=(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