找回密码
 立即注册

QQ登录

只需一步,快速开始

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

利用单片机定时器设计秒表 四位共阴数码管 小数点后一位、带蜂鸣器

[复制链接]
跳转到指定楼层
楼主
本人单片机作品之一,纯原创手打
一、实验目的
自主设计电路,设计一个用于秒表及拓展功能的定时计数器。

二、实验内容
设计原理图及编写代码,实现以下功能:
采用中断方式实现1分钟的秒表定时器,从00显示至59,再返回00开始循环。
扩展部分:
1、为秒表增加多一位小数位;
2、每一秒闪烁一次LED,每10秒响一次蜂鸣器。

三、实验方法及步骤
使用四位共阴数码管、AT89C51单片机、按钮、蜂鸣器、三极管、LED、电阻等原件设计出以下电路:



编写单片机代码,仿真运行。
#include<reg51.h>
#include<stdio.h>
sbit P20=P2^0;          //四位数码管位选
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;

sbit start=P2^4;           //开始
sbit reset=P2^5;         //复位

sbit redled=P1^0;          //控制led亮不亮
sbit sounder=P1^1;        //控制蜂鸣器响不响

unsigned char led_times,sounder_times,sounder_flag,ge,shi,bai,qian;      
/*负责判断led亮、sounder响,千位百位在小数点前,十位是小数点后一位 小数点后一位是100ms,十倍10ms*/
unsigned char code led[ ]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //共阴段选码

void display();
void delay_ms(unsigned int ms)  //消隐用延时
{
   unsigned char a;
   while(ms--)
      for(a=125;a>0;a--);
}

void T0_init( )        //定时器T0初始化
{
   TMOD=0x01;
   TH0=0xD8;       //10ms定时
   TL0=0xF0;
   EA=1;
   ET0=1;
   redled=0;//初始led不亮
   sounder=0;//初始不响
}

void main()
{         
   T0_init( );
   while(1){         
      display( );
      while(!start)//开始/暂停键
      {           
         display( );
         if(start)
         TR0=!TR0;
      }
      while(!reset)         //清零键
      {
         display( );
         if(reset)
         TR0=0;
         qian=0;
         bai=0;
         shi=0;
         ge=0;
      }
      if(bai==10){        //满十进位
         bai=0;
         qian++;
         }
      if(qian==6){      //一分钟最多六十,十位满六重新循环
         qian=0;bai=0;shi=0;ge=0;
         //TR0=0;
         }
      }
}


void display( )
{
   P23=0;        //位选
   P0=led[0];        //反正只要求小数点后一位,干脆最后一位就一直是0
   delay_ms(5); //消隐

   P23=1;        //位选
   P22=0;
   P0=led[shi];
   delay_ms(5); //消隐

   P22=1;        //位选
   P21=0;
   P0=led[bai]|0x80;//或运算,为的是段选码和dp位,都置一,为了让百位的小数点亮起来
   delay_ms(5); //消隐

   P21=1;        //位选
   P20=0;
   P0=led[qian];
   delay_ms(5); //消隐
   P20=1;
}

void T0int( ) interrupt 1 //定时器T0中断 方式1
{
   TH0=0xD8;       //重新给a,10ms定时  65536-55536(a)  
   TL0=0xF0;
   ge++;
   led_times++;

   if(led_times==50){   //50*10ms=0.5s  一秒亮一次,一次亮0.5秒
      redled=~redled;        //闪烁,每0.5s改变一次状态就是一秒闪一次
      led_times=0;
      sounder_times++;
      sounder=0;
      }
   if(sounder_times==20){//1000*10ms=10s  蜂鸣器响一次
      sounder=1;
      sounder_times=0;
      }
   if(ge==10){
      ge=0;
      shi++;
      }
   if(shi==10){
      shi=0;
      bai++;
      }
}
四、实验结果及分析
成功完成了要求的程序以及拓展程序,一秒LED闪一次,十秒蜂鸣器响一次。
在本次试验中,我将0xD8给TH0,0xF0给低位,初始化65536-D8F0=10000,也就是定时10ms,每中断十次,也就是100ms,给小数点后的一位+1,满十则进,以此类推。
并且加了用来记定时到了多少次的变量,满50次(1S)则控制灯亮/灭,20次灯亮/灭(也就是10s)则控制蜂鸣器响。

原理图及程序在附件工程文件中
定时计数器之秒表(带拓展).zip (21.64 KB, 下载次数: 80)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:737761 发表于 2020-4-25 15:35 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

板凳
ID:581952 发表于 2020-11-19 13:42 | 只看该作者
这里面是什么文件啊,打不开。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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