这个基于51单片机的定时器设计,使用共阴数码管显示,如果要换成共阳数码管只需要将程序内数组改为共阳数码管的数组,38译码器LSA,LSB,LSC分别接单片机的P2^2,
P2^3,P2^4,蜂鸣器使用的是无源蜂鸣器,接单片机P1^5,三个低电平触发按键分别接的P3^1,P3^2,P3^3.
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit key0=P3^1; //定义P31口是k0
sbit key1=P3^0; //定义P33口是k1
sbit key2=P3^2; //定义P33口是k2
sbit beep=P1^5;
程序运行后,先进入设置模式,key0和key1分别设置秒和分,key2确定后进入定时模式,数码管显示时间,定时结束后蜂鸣器发声提示。
单片机源程序如下:
//基于stc89c52的定时器
//时间:2020年1月5日,作者:吃猫的鱼
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit key0=P3^1; //定义P31口是k0
sbit key1=P3^0; //定义P33口是k1
sbit key2=P3^2; //定义P33口是k2
sbit beep=P1^5;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x5e,0x3f,0x3f,0x6f};//显示0~F的值
u16 miao=0,fen=0;//时间参数
bit flag=1;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Timer1Init
* 函数功能 : 定时器1初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void good_init()
{
u8 i,j=1000;
while(j)
{
for(i=10;i<14;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(10):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(11):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(12):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(13):
LSA=1;LSB=1;LSC=0; break;//显示第2位
}
P0=smgduan[i];//发送段码
delay(300); //间隔一段时间扫描
P0=0x00;//消隐
}
j--;
}
}
void DigDisplay()
{
LSA=0;LSB=0;LSC=0;
P0=smgduan[miao%10];//发送段码
delay(500);
LSA=1;LSB=0;LSC=0;
P0=smgduan[miao/10];//发送段码
delay(500);
LSA=0;LSB=1;LSC=0;
P0=smgduan[fen%10];//发送段码
delay(500);
LSA=1;LSB=1;LSC=0;
P0=smgduan[fen/10];//发送段码
delay(500);
// delay(100); //间隔一段时间扫描
// P0=0x00;//消隐
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
good_init();
while(flag)
{
if(key0==0)//秒针
{
delay(1000);
if(key0==0)
{
miao++;
}
while(!key0);
}
if(key1==0)//分针
{
delay(1000);
if(key1==0)
{
fen++;
}
while(!key1);
}
if(key2==0)//确定
{
delay(1000);
if(key2==0)
{
flag=0;
}
while(!key2);
}
miao=miao%60;
fen=fen%60;
DigDisplay();
}
Timer1Init();//定时器初始化
while(1)//工作模式
{
if(miao<=1)
{
fen--;
miao=60;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』