专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
求个c51数显定时程序
2020-02-04 09:17
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
13283
11
11
求个c51数显定时程序
要求很简单;
四位显示,四个按键 一个加定时 一个减 一个开始计时 一个停止
设置好定时 按开始就计时 到定时自动停止
四位显示要求 前两位显定时时间后两位计时
开始时启动一个继电器 计时到时启动一个继电器并释放前一继电器
谢谢了 EMAIL:funluo@126.com
电路可根据程序来设计 也可以设计好电路再写程序
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
luozyou
1楼-- · 2020-02-05 14:36
呵呵 求归求也不用跪,我还没这么下贱
加载中...
lryxr2507
2楼-- · 2020-02-05 19:14
不会是用来、、、、、、、?
加载中...
elecfun
3楼-- · 2020-02-05 22:10
额 都一个月了
以前写过一个差不多的
/******************************
程序名称:MyDigit计时程序
程序作者:elecfun
编写时期:2010年8月23日
说明:此程序实现99时59分内的计时与显示,使用4位共阳数码管显示
当时与分均为0时,只显示秒;当时为0分不为0时,显示分、秒;当时不为0时,显示时、分
3个按键来控制开始、停止、清零(开始与停止按键可以合并而使用2个按键),清零只有在停止状态下才可用
在停止状态下按开始,继续计时
******************************/
#include <AT89X51.h>
#define LedBitData P2
#define LedSegData P0
sbit
KEY_START
=
P1
^
0
;
sbit
KEY_STOP
=
P1
^
1
;
sbit
KEY_CLEAR
=
P1
^
2
;
unsigned char
MS50
,
SEC
,
MIN
,
HOUR
;
unsigned char
SEG
[
4
];
//定义共阳数码管的显示数字
code
unsigned char
LedDisplayCode
[]=
{
0xC0
,
0xF9
,
0xA4
,
0xB0
,
0x99
,
0x92
,
0x82
,
0xF8
,
//0、1、2、3、4、5、6、7
0x80
,
0x90
//8、9
};
/**********延时子程序********/
void
Delay
(
unsigned int
t
)
{
unsigned char
t1
,
t2
;
for
(
t1
=
0
;
t1
<
t
;
t1
++)
for
(
t2
=
0
;
t2
<
120
;
t2
++)
;
}
/**********数码管扫描程序**********/
void
Scan
()
{
unsigned char
a
;
if
(
HOUR
==
0
)
{
if
(
MIN
==
0
)
//小时、分同时为0时,只显示秒
{
SEG
[
0
] =
0xFF
;
SEG
[
1
] =
0xFF
;
SEG
[
2
] =
LedDisplayCode
[
SEC
/
10
];
SEG
[
3
] =
LedDisplayCode
[
SEC
%
10
];
}
else
//小时为0分不为0时,显示分、秒
{
SEG
[
0
] =
LedDisplayCode
[
MIN
/
10
];
SEG
[
1
] =
LedDisplayCode
[
MIN
%
10
];
SEG
[
2
] =
LedDisplayCode
[
SEC
/
10
];
SEG
[
3
] =
LedDisplayCode
[
SEC
%
10
];
}
}
else
{
//小时不为0时,显示小时、分
SEG
[
0
] =
LedDisplayCode
[
HOUR
/
10
];
SEG
[
1
] =
LedDisplayCode
[
HOUR
%
10
];
SEG
[
2
] =
LedDisplayCode
[
MIN
/
10
];
SEG
[
3
] =
LedDisplayCode
[
MIN
%
10
];
}
if
(!
TR0
)
//停止状态下小数点点亮
{
SEG
[
1
] &=
0x7F
;
}
else
{
if
(
MS50
<
10
)
//小数点闪烁
{
SEG
[
1
] &=
0x7F
;
}
}
for
(
a
=
0
;
a
<
4
;
a
++)
//刷新
{
LedBitData
= ~(
1
<<
a
);
LedSegData
=
SEG
[
a
];
Delay
(
1
);
LedSegData
=
0xFF
;
}
}
/* 按键检测及处理 */
void
Key
(
void
)
{
if
(
KEY_START
==
0
)
//开始
{
Delay
(
1
);
if
(
KEY_START
==
0
)
{
while
(
KEY_START
==
0
)
Scan
();
TR0
=
1
;
}
}
if
(
KEY_STOP
==
0
)
//停止
{
Delay
(
1
);
if
(
KEY_STOP
==
0
)
{
while
(
KEY_STOP
==
0
)
Scan
();
TR0
=
0
;
}
}
if
(
KEY_CLEAR
==
0
)
//清零
{
Delay
(
1
);
if
(
KEY_CLEAR
==
0
)
{
if
(!
TR0
)
//停止时才可以清零
{
MS50
=
0
;
SEC
=
0
;
MIN
=
0
;
HOUR
=
0
;
}
}
}
}
/**********系统初始化**********/
void
SysInt
()
{
MS50
=
0
;
//初始时钟时间0:0:0
SEC
=
0
;
MIN
=
0
;
HOUR
=
0
;
EA
=
1
;
//开总中断
ET0
=
1
;
//开定时器0中断
TMOD
=
0x01
;
//定时器0为16位定时器模式
TH0
=
0x3c
;
//初始定时常数15536,即50ms
TL0
=
0xb0
;
}
/**********主程序**********/
void
main
()
{
SysInt
();
//系统初始化
while
(
1
)
{
Scan
();
//显示子程序
Key
();
//按键检测处理子程序
}
}
/**********定时器0中断**********/
void
Time0
(
void
)
interrupt
1
{
TH0
=
0x3c
;
TL0
=
0xaf
;
//重新赋初值
MS50
++;
//50ms寄存器加1
if
(
MS50
==
20
)
{
MS50
=
0
;
SEC
++;
if
(
SEC
==
60
)
//到1分钟则清零,分加1
{
SEC
=
0
;
MIN
++;
if
(
MIN
==
60
)
//到60分则清零,小时加1
{
MIN
=
0
;
HOUR
++;
if
(
HOUR
==
99
)
HOUR
=
0
;
//小时到99则清零
}
}
}
}
加载中...
fydzaa
4楼-- · 2020-02-05 23:13
elecfun 好人哦
加载中...
上一页
1
2
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
以前写过一个差不多的
/******************************
程序名称:MyDigit计时程序
程序作者:elecfun
编写时期:2010年8月23日
说明:此程序实现99时59分内的计时与显示,使用4位共阳数码管显示
当时与分均为0时,只显示秒;当时为0分不为0时,显示分、秒;当时不为0时,显示时、分
3个按键来控制开始、停止、清零(开始与停止按键可以合并而使用2个按键),清零只有在停止状态下才可用
在停止状态下按开始,继续计时
******************************/
#include <AT89X51.h>
#define LedBitData P2
#define LedSegData P0
sbit KEY_START = P1^0;
sbit KEY_STOP = P1^1;
sbit KEY_CLEAR = P1^2;
unsigned char MS50,SEC,MIN,HOUR;
unsigned char SEG[4];
//定义共阳数码管的显示数字
code unsigned char LedDisplayCode[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,//0、1、2、3、4、5、6、7
0x80,0x90 //8、9
};
/**********延时子程序********/
void Delay(unsigned int t)
{
unsigned char t1,t2;
for(t1=0;t1<t;t1++)
for(t2=0;t2<120;t2++)
;
}
/**********数码管扫描程序**********/
void Scan()
{
unsigned char a;
if (HOUR == 0)
{
if (MIN == 0) //小时、分同时为0时,只显示秒
{
SEG[0] = 0xFF;SEG[1] = 0xFF;
SEG[2] = LedDisplayCode[SEC/10];SEG[3] = LedDisplayCode[SEC%10];
} else //小时为0分不为0时,显示分、秒
{
SEG[0] = LedDisplayCode[MIN/10]; SEG[1] = LedDisplayCode[MIN%10];
SEG[2] = LedDisplayCode[SEC/10]; SEG[3] = LedDisplayCode[SEC%10];
}
}
else { //小时不为0时,显示小时、分
SEG[0] = LedDisplayCode[HOUR/10]; SEG[1] = LedDisplayCode[HOUR%10];
SEG[2] = LedDisplayCode[MIN/10]; SEG[3] = LedDisplayCode[MIN%10];
}
if (!TR0) //停止状态下小数点点亮
{
SEG[1] &= 0x7F;
} else
{
if (MS50 < 10) //小数点闪烁
{
SEG[1] &= 0x7F;
}
}
for(a=0; a<4; a++) //刷新
{
LedBitData = ~(1<<a);
LedSegData = SEG[a];
Delay(1);
LedSegData = 0xFF;
}
}
/* 按键检测及处理 */
void Key(void)
{
if (KEY_START == 0) //开始
{
Delay(1);
if (KEY_START == 0)
{
while(KEY_START == 0) Scan();
TR0 = 1;
}
}
if (KEY_STOP == 0) //停止
{
Delay(1);
if (KEY_STOP == 0)
{
while(KEY_STOP == 0) Scan();
TR0 = 0;
}
}
if (KEY_CLEAR == 0) //清零
{
Delay(1);
if (KEY_CLEAR == 0)
{
if (!TR0) //停止时才可以清零
{
MS50 = 0;
SEC = 0;
MIN = 0;
HOUR = 0;
}
}
}
}
/**********系统初始化**********/
void SysInt()
{
MS50 = 0; //初始时钟时间0:0:0
SEC = 0;
MIN = 0;
HOUR = 0;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TMOD = 0x01; //定时器0为16位定时器模式
TH0 = 0x3c; //初始定时常数15536,即50ms
TL0 = 0xb0;
}
/**********主程序**********/
void main()
{
SysInt(); //系统初始化
while(1)
{
Scan(); //显示子程序
Key(); //按键检测处理子程序
}
}
/**********定时器0中断**********/
void Time0(void) interrupt 1
{
TH0=0x3c;TL0=0xaf; //重新赋初值
MS50++; //50ms寄存器加1
if(MS50==20)
{
MS50=0;
SEC++;
if(SEC==60) //到1分钟则清零,分加1
{
SEC=0;
MIN++;
if(MIN==60) //到60分则清零,小时加1
{
MIN=0;
HOUR++;
if(HOUR==99) HOUR=0; //小时到99则清零
}
}
}
}
一周热门 更多>