单片机秒表程序(自动切换时间

原创 2015年11月19日 16:11:42
/* 
write by cjdsn
 时间计算
1/22.1184=0.0000005425
1/0.5425=1843317
1843317/40=46083
//我的是阳极显示,0开1关
*/


#include<reg52.h>  
unsigned char code Tab[12]=


{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xff}; 
 //数码管显示0~9的段码表
unsigned char int_time;        //记录中断次数
unsigned char second;        //储存秒
unsigned char t,h;
sbit pd=P2^0;
sbit pc=P2^1;
sbit pb=P2^2;
sbit pa=P2^3;
sbit p27=P2^7;
/******************************************************************


*****
函数功能:快速动态扫描延时,延时约0.6毫秒
*******************************************************************


*****/
void delay(void)
{
  unsigned char i;
  for(i=0;i<200;i++)
        ;
}
/******************************************************************


*****
函数功能:显示秒
入口参数:k
出口参数:无
*******************************************************************


*****/
 void DisplaySecond(unsigned char k)
{
   pb=0;        //P2.1引脚输出低电平
P0=Tab[k/10];          //显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
   pb=1;
   pa=0;      //P2.0引脚输出低电平
P0=Tab[k%10];         //显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
pd=0;
P0=Tab[t/10];  //分 十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pd=1;
pc=0;
P0=Tab[t%10];  //分 个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
///////////////////////////////////
pc=0;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
//====================================//
/*
P2=0xff;     //关闭所有数码管
P0=0xff;        //显示个位
*/
//====================================//
}


///////////////////////////////////////////////////////////////////


/////////////////


 void Displayh()
{
   pb=0;        //P2.1引脚输出低电平
P0=Tab[t/10];          //显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
   pb=1;
   pa=0;      //P2.0引脚输出低电平
P0=Tab[t%10];         //显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
pd=0;
P0=Tab[h/10];  //分 十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pd=1;
pc=0;
P0=Tab[h%10];  //分 个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
///////////////////////////////////
pc=0;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
}


////////////////////////////////  显示小数点
displayms(void)
 {
P2=1;
p27=1;
pa=0;
pb=1;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
 }


//==========================================================//


 
void main(void)     
   {
   P2=1;
   p27=1;
     TMOD=0x01;                 //使用定时器T0
    TH0=(-46083)/256;    //将定时器计时时间设定为


46083×1.085微秒
//=50000微秒=50毫秒
TL0=(-46083)%256;
EA=1;                 
      ET0=1;                 
          TR0=1;                   
  int_time=0;     //中断次数初始化
second=0;   //秒初始化
t=59;

while(1)
{       if(h<=0){
      DisplaySecond(second);//调用秒的显示子程序
  }
else Displayh();
}
 }  
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
  void interserve(void ) interrupt 1 using 1  
  {
    TR0=0;    //关闭定时器T0
    int_time ++;        //每来一次中断,中断次数int_time自加1


断次数清0  
if(int_time==40)   //够20次中断,即1秒钟进行一次检测结果采样
 {
        int_time=0;    //
second++;    //秒加1
if(h>0){displayms();}
if(second==60)
   {  second =0; //秒等于60就返回0
 t++;}
if(t==60){t=0;h++;
if(h==24)h=0;}
 }      
  TH0=(-46083)/256;   //重新给计数器T0赋初值
TL0=(-46083)%256;
TR0=1;     //启动定时器T0
 }  
版权声明:本文为博主原创文章,未经博主允许不得转载。

用AT89C51单片机设计一个秒表:00.0~99.9

求用单片机设计一个秒表AT89C51要求1、按开关K1秒表开始计时,再按开关K1计时暂停,按开关K2秒表复位。    2、如果可以的话顺便发一下电路图    3、最好是用汇编编写程序谢谢 悬赏分:...
  • baidu_33836580
  • baidu_33836580
  • 2016年01月25日 11:40
  • 2753

基于51单片机的99-00倒计时秒表

;有位网友写了一个倒计时秒表的程序,程序中的变量,采用了逐次加一的方法。;变量加一,怎么能够倒计时呢?;原来,程序中段码的排列次序,反过来了。;于是:;当变量是0的时候,查找出来9的段码,送去显示;;...
  • baidu_33836580
  • baidu_33836580
  • 2016年01月25日 11:49
  • 1726

单片机:c语言实现秒表计数(按键开始,结束,重置)

实现秒表计数功能,使用定时器和外部中断实现。8号按键代表计时开始/结束,C号按键代表重置为0,为了演示方便,这里上限定为15秒。 代码中有详细的注释: #include sbit WEI=P...
  • NK_test
  • NK_test
  • 2015年11月27日 13:20
  • 5185

利用51单片机制作一个秒表的详细过程

利用51单片机制作一个秒表的详细过程 前面的话: 和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难...
  • wangwangpengpeng
  • wangwangpengpeng
  • 2017年07月25日 12:53
  • 2077

10.1 单片机数字秒表程序

不同数据类型间的相互转换 在 C 语言中,不同数据类型之间是可以混合运算的。当表达式中的数据类型不一致时,首先转换为同一种类型,然后再进行计算。C 语言有两种方法实现类型转换,一是自动类型转换,另外...
  • softn
  • softn
  • 2016年07月07日 05:36
  • 1386

keil测量单片机程序运行的实际时间

1、单片机程序执行实际时间可以用设置断点测试
  • u014327527
  • u014327527
  • 2014年10月24日 15:51
  • 680

单片机程序架构--时间片轮询法

转载地址:http://bbs.eeworld.com.cn/thread-311494-1-1.html 对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不...
  • yuexiazhufeng
  • yuexiazhufeng
  • 2016年03月17日 14:28
  • 3715

【单片机】时钟及温度的显示

回头看我所写的文章,基本都是软件方面的,是个典型的“欺软怕硬”的人。然而,在最开始的时候,我学习的是硬件。在前面文章《我的2013–一起从心开始》一文中写道,我在大一暑假的时候开始了单片机的学习,在大...
  • tengweitw
  • tengweitw
  • 2015年05月21日 20:25
  • 3498

嵌入式单片机程序架构之时间片轮询法

时间片轮询法,在很多书籍中有提到,而且有很多时候都是与操作系统一起出现,也就是说很多时候是操作系统中使用了这一方法。不过我们这里要说的这个时间片轮询法并不是挂在操作系统下,而是在前后台程序中使用此法。...
  • wangshuwang
  • wangshuwang
  • 2015年01月18日 12:30
  • 1879

51单片机定时控制灯

让第一个小灯亮0.5秒,再熄灭0.5秒。 我们先随便写一个小灯闪烁的程序,以第一个小灯为例: #include sbit L1=P1^0; void main() { int a; ...
  • Valieli
  • Valieli
  • 2016年09月08日 19:01
  • 495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单片机秒表程序(自动切换时间
举报原因:
原因补充:

(最多只允许输入30个字)