这个基于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;
- }
- DigDisplay();
-
- }
- }
- /*******************************************************************************
- * 函 数 名 : void Timer1() interrupt 3
- * 函数功能 : 定时器0中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- static u16 i;
- TH1=0XFC; //给定时器赋初值,定时1ms
- TL1=0X18;
- i++;
- if(fen==0&&miao==1)//蜂鸣器叫
- {
- LSA=0;LSB=0;LSC=0;
- P0=smgduan[1];//发送段码
- delay(800000);
- ET1=0;//关闭定时器1中断允许
-
- while(1)
- {
- beep=~beep;
- delay(10); //延时大约100us 通过修改此延时时间达到不同的发声效果
- }
- }
- if(i==1000)
- {
- i=0;
- miao--;
- }
- }
复制代码
所有资料51hei提供下载:
基于51单片机的定时器源代码.rar
(34.45 KB, 下载次数: 37)
|