您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子元器件>数码管>

利用单片机的定时器设计一个0-99的数码管秒表

2022年08月17日 18:14 MCU学习笔记 作者:MCU学习笔记 用户评论(0

单片机作业:利用单片机的定时器设计一个0-99的秒表,按下按键S1秒表开始从零计时,按下按键S2秒表停止,并显示最终秒计时值。

接口信息

数码管断码端接单片机的P0口,位选端接单片机的P2.4、P2.5、P2.6、P2.7。数码管的千位和百位显示秒计数,十位个位显示的定时器中断计数。

2.程序代码

定时器初始化为工作模式1,定时器定时时间为20ms,也就是定时器每溢出一次的时间为20ms,则溢出50次即为1秒钟。通过查询溢出标志位的值即可。
 

void timer_inial()

{

TMOD = 0X01;//

TH0=0XB8;//定时0.02s

TL0=0X00;

}

定时器溢出处理函数:每次溢出之后,要手动清除溢出标志位,然后重装初始值。同时秒计数值加1,累加50次即为一秒中。
 

void second_cal_show()

{

  if(TF0==1)

{

TF0=0;

       TH0=0XB8;

TL0=0X00;

time_count++;

if(time_count>=50)//50次一秒

{

  time_count=0;

 time_S++;

}

}

}

主函数:主要是定时器初始化,然后循环执行按键启动、按键停止、定时器溢出处理和刷新数码管显示函数。

void main()

{

timer_inial();

while(1)

{

start();

stop();

second_cal_show();

LEDdisplay(time_S*100+time_count);

}

}

以下为作业全部代码:

#include

#include

//定义二个位变量,分别对应按键开始按键和停止复位按键

sbit key_set=P3^2;

sbit key_reset=P3^3;

unsigned char time_count=0;

unsigned int time_S=0;

#define LED_PORT P0

sbit wela_1 = P2^4;

sbit wela_2 = P2^5;

sbit wela_3 = P2^6;

sbit wela_4 = P2^7;

sbit dp=P0^7;

//LED显示字模 0-F 共阳模式

unsigned code table[]= {0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void timer_inial();//定时器初始化

void delay(unsigned int i);//延时函数

void start();

void stop();

void second_cal_show();

/*******************************************************************************

* 函 数 名 :Delayms

* 函数功能 :实现 ms级的延时

* 输    入 :ms

* 输    出 :无

*******************************************************************************/

void Delay_ms(unsigned int ms)

{

unsigned int i,j;

for(i=0;i

#if FOSC == 11059200L

for(j=0;j<114;j++);

#elif FOSC == 12000000L

  for(j=0;j<123;j++);

#elif FOSC == 24000000L

for(j=0;j<249;j++);

#else

for(j=0;j<114;j++);

#endif

}

/*******************************************************************************

* 函 数 名 :LEDdisplay

* 函数功能 :循环显示各个位上的数据

* 输    入 :num要显示的数据

* 输    出 :无

*******************************************************************************/

void LEDdisplay(unsigned int num)

{

unsigned char qian,bai,shi,ge;

qian=num/1000;

bai=num%1000/100;

shi=num%100/10;

ge=num%10;

wela_1 = 1;   //关闭所有数码管

wela_2 = 1;

wela_3 = 1;

wela_4 = 1;

wela_4=0;  //显示千位

LED_PORT=table[qian];

Delay_ms(1);

LED_PORT = 0xff;

wela_4=1;

wela_3=0;  //显示百位

LED_PORT=table[bai];

Delay_ms(1);

LED_PORT = 0xff;

//dp=0;

wela_3=1;

wela_3=0;  //显示百位

dp=0;

Delay_ms(1);

LED_PORT = 0xff;

wela_3=1;

wela_2=0;  //显示十位

LED_PORT=table[shi];

Delay_ms(1);

LED_PORT = 0xff;

wela_2=1;

wela_1=0;  //显示个位

LED_PORT=table[ge];

Delay_ms(1);

LED_PORT = 0xff;

}

void main()

{

timer_inial();

while(1)

{

start();

stop();

second_cal_show();

LEDdisplay(time_S*100+time_count);

}

}

void timer_inial()

{

TMOD = 0X01;//

TH0=0XB8;//定时0.02s

TL0=0X00;

}

//延时函数

void delay(unsigned int i)

{

unsigned int k;

  for(k=0;k

}

void start()

{

if(0==key_set)

{

delay(1200);//10ms消抖

if(0==key_set)//再次检测按键是否按下

{

while(!key_set);//等待按键释放

  TR0=1;

  time_S=0;

  time_count=0;

}

}

}

void stop()

{

  if(0==key_reset)

{

delay(1200);//10ms消抖

if(0==key_reset)//再次检测按键是否按下

{

while(!key_reset);//等待按键释放

  TR0=0;

}

}

}

void second_cal_show()

{

  if(TF0==1)

{

TF0=0;

  TH0=0XB8;

TL0=0X00;

time_count++;

if(time_count>=50)//50次一秒

{

  time_count=0;

time_S++;

}

}

}



审核编辑:刘清

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

( 发表人:刘芹 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!