51单片机制作一个秒表

51单片机制作一个秒表,第1张

//功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式

#include"reg51.h"

#define uchar unsigned char

#define uint unsigned int

uchar count=0  //对50ms定时时间进行计数

uchar miao=0     //秒计数器

//函数名:timer_1()

//函数功能:定时器T1的中断函数,T1在工作方式1下每50秒产生中断,执行该中断函数

//形式参数:无

//返回值:无

void timer_1() interrupt 3   //T1的中断类型号为3

{

 TH1=(65536-50000)/256   //重新设置T1计数初值高8位

 TL1=(65536-50000)%256   //重新设置T1计数初值低8位

 count++      //50ms计数器加1

 if(count==20)     //1s时间到

 {

  count=0     //50ms计数器清0

  miao++         //秒计数器加1

  if(miao==100)miao=0  //miao计数到100,则从0开始计数

 }

}

bit b=0

void int_0() interrupt 0

{

 if(b == 0){TR1 = 0b = 1}

 else

 {

  b = 0

  TR1 = 1

 }

}

void int_1() interrupt 2

{

 miao=0

 count = 0

 TH1=(65536-50000)/256 

 TL1=(65536-50000)%256

 TR1=1

}

//函数名:disp

//函数功能:将i的值显示在两个静态连接的数码管上

//形式参数:i,取值范围0~99

//返回值:无

void disp(uchar i)

{

 uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

 //定义0~9显示码,共阳极数码管

 P1=led[i/10]   //显示i高位

 P2=led[i%10]   //显示i地位

}

void main()

{

 TMOD=0x10    //设置T1在工作方式1 

 TH1=(65536-50000)/256 //设置T1计数初值高8位,定时时间50ms 

 TL1=(65536-50000)%256 //设置T1计数初值低8位

 ET1=1     //开放T1中断允许

 EX0 = 1

 IT0 = 1

 EX1 = 1

 IT1=1

 EA=1     //开放总中断允许

 TR1=1     //启动T1开始计时

 while(1)

 {

  disp(miao)   //显示秒计数器值

 }

}

这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。

#include <reg51.H>

sbit P3_5 =P3^5

unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

                          0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}

unsigned char second

unsigned char keycnt

unsigned int tcnt

void main(void)

{

unsigned char i,j

TMOD=0x02

ET0=1

EA=1

second=0

P1=dispcode[second/10]

P2=dispcode[second%10]

while(1)

{

if(P3_5==0)

{

for(i=20i>0i--)

for(j=248j>0j--)

if(P3_5==0)

{

keycnt++

switch(keycnt)

{

case 1:

TH0=0x06

TL0=0x06

TR0=1

break

case 2:

TR0=0

break

case 3:

keycnt=0

second=0

P1=dispcode[second/10]

P2=dispcode[second%10]

break

}

while(P3_5==0)

}

}

}

}

void t0(void) interrupt 1 using 0

{

tcnt++

if(tcnt==4000)

{

tcnt=0

second++

if(second==100)

{

second=0

}

P1=dispcode[second/10]

P2=dispcode[second%10]

}

}

方法:首先:要学会数码管的显示程序

然后:按键的 *** 作,注意软件的消抖(具体的是延时,10ms左右)。

假设有k1~停表,k2~复位,k3~继续运行

先说停表和继续运行的

停表:如果k1按下,TR0=0

继续运行:如果k3按下,TR0=1

复位:直接用硬件复位单片机或者k2按下,数据清零。

要实现数据的循环:只要定时器计数到最大值时,再把最小值赋给它!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/11405314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存