历史上的今天
今天是:2025年01月20日(星期一)
2020年01月20日 | 基于51单片机的定时器程序设计
2020-01-20 来源:51hei
这个基于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)//蜂鸣器叫
{
史海拾趣
|
摘 要: 介绍了红外遥控发射和接收的原理,提出了一种用PLD(可编程逻辑器件)进行解码的方案,并分别用EPROM和GAL实现。该方案思路新颖、原理简单、工作可靠,可用于各种以键盘扫描为输入方式的智能仪器系统中。 关键词 ...… 查看全部问答> |
|
这个demo是在一个项目中用于测试的例程。测试MCF52211的USB模块,实现了CDC协议,从而在PC上虚拟出一个串口。MCF52211集成了一个USB OTG的模块,它是freescale coldfire v2核心的一款MCU。相关介绍请参考http://www.freescale.com … 查看全部问答> |
|
为什么设计芯片时有的将芯片管脚使用1作为有效(及高电平有效),而有的却使用0为有效(及低电平有效)? 为什么设计芯片时有的将芯片管脚使用1作为有效(及高电平有效),而有的却使用0有效(及低电平有效)? 为什么不统一使用高电平有效或低电平有效?这样有什么好处? 是什么因素决定该管脚需采用高电平还是低电平有效的? /Jack… 查看全部问答> |
|
写了个USB转COM口的驱动,但是为何系统启动过程中装载完驱动就迅速卸载? 打印信息, USBToCOM::Process Attach USBToCOM::Process Detach sources文件 RELEASETYPE=PLATFORM TARGETNAME=ucom TARGETTYPE=DYNLINK DLLENTRY=DllEntry DEF ...… 查看全部问答> |
|
LED模组和灯具的典型失效模式包含了不同层次的失效模式,涉及到LED封装结构以及工艺过程(如表1)。LED在实际使用中,由于复杂的环境以及封装工艺局限性从而使封装材料退化、荧光粉退化、金属电迁移、局部温度过高产生的热应力所引起的芯片和硅胶 ...… 查看全部问答> |
|
> Loading file E:\\车机项目\\A5V5_MA\\A5V5_v1\\Debug\\a5v5.s19 in PROGRAM MEMORY area ... FILE : line 195: Address 0x1019 is out of range and is ignored! FILE : line 195: Address 0x101A is out of range and is i ...… 查看全部问答> |
|
我的2812怎么转换精度那么差,本来是3V的时候应该是4095的,但是我的片子转换出来是3953,并且2.75V的时候转换出来只有3652,与理想值几乎相差100。 这样是不是2812转换精度太差了?? 各位高手请指点一下小妹,谢谢啦… 查看全部问答> |
|
PADS2007如何使用PADS2005中的元件封装库本人从事PCBLAYOUT现在转做PCB业务,专业生产铝基板和FR4板,希望大家多多关照。QQ: 520122524Skype:xcq185388740msn: xcq185388740@live.cn邮箱:xcq185388740@163.com… 查看全部问答> |




