这个基于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)//蜂鸣器叫
{
上一篇:基于热敏电阻的单片机温度测量系统设计
下一篇:软件模拟串行通信——UART协议实现
推荐阅读最新更新时间:2024-11-07 14:07
设计资源 培训 开发板 精华推荐
- 具有电源排序和 I2C 功能的 LTC3589IUJ-1 8 输出稳压器的典型应用电路
- AM1DM-1209DH60-NZ ±9 Vout、1W 双路输出 DC-DC 转换器的典型应用
- 使用 Analog Devices 的 LTC4162IUFD-FADM 的参考设计
- AM1/4S-2407SH30Z 7.2V 0.25W DC/DC 转换器的典型应用
- DC2326A-B,使用 LTC2345-16 八通道、16 位、200ksps 同步采样 SAR ADC 的演示板
- 使用 Infineon Technologies AG 的 OMR7812SR 的参考设计
- 爱心打地鼠:基于stc89c52单片机设计的一块菜菜打地鼠游戏
- AD8222-EVAL,评估套件具有两个用于双通道操作的 AD8222 仪表放大器
- 使用具有 B 类 EMI 滤波(单输出)的 RP10-4805SA DC/DC 转换器的典型应用
- 用于血糖仪的 ADA4505-4ARUZ 四极黄油值滤波器的典型应用电路
- 电工也疯狂!玩游戏,晒得分,赢4G U盘!
- 单片机零起点入门,带你DIY 51开发板
- 独乐乐不如众乐乐——TI培训“荐课”功能上线公测,邀你提议,参与抢楼!
- Arrow&allegro有奖直播:下一代磁感应解决方案:XtremeSense™ TMR 技术如何促进高效应用
- 电子工程师,如何更好地拥抱GaN?参与问卷有好礼!
- 月度原创精选评选:有料,够精彩,要的就是它!
- 全球首款Cortex-M23内核物联网芯片SAML10和SAM L11系列 闯关获取SAML10/SAML11法宝,拆除电子界安全危机,赢好礼!
- 看视频,了解泰克高性价比频谱分析仪,填卷赢好礼!
- 有奖直播|Keysight World 2020【电信基础设施、云与人工智能分论坛】
- 安世半导体&世平集团 Nexperia 在5G基础架构的应用 下载赢好礼!