找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4228|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机秒表程序

[复制链接]
跳转到指定楼层
楼主
ID:70941 发表于 2014-12-27 19:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机秒表程序算作一个中等难度的程序,主要是定时器的了解和定时中断。我使用的硬件配置是8.000MHz晶振,共阳极数码管和STC89s52RC国产宏鑫单片机。测试的定时器0的两种算法:模式0,模式1。
另外有一点体会如果可能还是尽量采用模式1等计数较多的模式,这样对MCU的中断较少节省资源和电力对于电池供电的是非常重要的。

#include<AT89X51.H>
#include<stdio.h>
sfr p0=0x80;
sfr p2=0xA0;
unsigned char code a[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};

//我的数码管对应的P0。0~7为a,b,c,d,e,f,g,Dp
unsigned char minute,second,msecond;
void ds(void)  //延时使得数码管保持亮度,注意不要时长大于定时时长
{
unsigned char i;
for(i=10;i>0;i--);
}
void main(void)
{
   TMOD=0x00; //定时器0,工作方式0 或者 TMOD=0x01  TH0=0xe5 TH0=0xf5
   TH0=0x2f;//
   TL0=0xf5;//
   ET0=1; //开定时中断允许
   EA=1; //开总中断
   TR0=1; //定时器开始定时
   msecond=0;
   second=0;
   minute=0;
   while(1)
      {                    //这就是为什么要用到stdio.h函数
        P0=a[minute/10]; //分离出分钟十位
        P3=0xfe;
        ds();
        P3=0xff;
  ds();

        P0=a[minute%10];//分离出分钟个位
        P3=0xfd;
        ds();

    P3=0xff;
  ds();

        P0=a[second/10]; //分离出秒十位
        P3=0xfb;
        ds();
      P3=0xff;
  ds();


  P0=a[second%10];
  P3=0xf7;
        ds();
    P3=0xff;
  ds();


  P0=a[msecond/10];
  P3=0xef;
  ds();
    P3=0xff;
  ds();


  P0=a[msecond%10];
  P3=0xdf;
  ds();
  P3=0xff;
  ds();
      }
}
void t0(void) interrupt 1 using 0 //定时器0,第0组寄存器  中断
{
   msecond++;
   if(msecond==100)
     {
      msecond=0;
      second++;
      if(second==60)
        {
         second=0;
         minute++;
         if(minute==60)
   minute=0;
        }
     }
   TH0=0x2f;//必须重新赋值才可以让定时器循环工作 同样可改写TH0=0xe5 TH0=0xf5
   TL0=0xf5;
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:251133 发表于 2018-1-16 22:44 | 只看该作者
这要数倒多少啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表