/***功能介绍:按键K4(P1.0)是开始/暂停键,按键K3(P1.1)是选择调节秒,分,小时 ,年的
按键K1(1.2)是对 时钟的秒,分,小时和天进行增大修改的;
按键K2(1.3)是对 时钟的秒,分,小时和天进行减少修改的
***/
#include <reg52.h>
#define uint unsigned int //宏定义unsigned int为 int
#define uchar unsigned char //宏定义unsigned char为 char
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90}; //共阳数码管段码表
uint second,minute,hour,tian,secondl,secondh,minutel,minuteh,
hourl,hourh,tianh,tianl,k1num;
bit flag5=0; //暂停/开始切换标志位
sbit k1=P1^2; //加调节
sbit k2=P1^3; //减调节
sbit k3=P1^1; //切换键
sbit k4=P1^0; //暂停/开始键
sbit beep=P3^7;
uchar num,flag,num1,flag1,flag2,flag3,flag4;
void delay(uint z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
P0=0xff;
hourh=hour/10; //对小时求除,分离出小时的十位
hourl=hour%10; //对小时求余,分离出小时的个位
minuteh=minute/10; //对分求除,分离出小时的十位
minutel=minute%10; //对分求余,分离出小时的个位
secondh=second/10; //对秒求除,分离出小时的十位
secondl=second%10; //对秒求余,分离出小时的个位
tianh=tian/10; //对天求除,分离出小时的十位
tianl=tian%10; //对天求余,分离出小时的个位
if(flag1==1)
{
P2=0xfe; //1111 1110 数码管第八位显示秒个位
P0=table[secondl]; //送秒个位的段选码
delay(3);
P2=0xfd; //1111 1101 数码管的第七位显示秒十位
P0=table[secondh]; //送秒十位的段选码
delay(3);
}
else
{
P2=0xfc; //为使数码管闪烁
P0=0xff; //调时时flag1==0时,数码管秒两位什么也不显示
}
if(flag2==1)
{
P2=0xfb; //1111 1011 数码管的第六位显示分个位
P0=table[minutel]; //送分个位段选码
delay(3);
P2=0xf7; //1111 0111 数码管的第五位显示分十位
P0=table[minuteh]; //送分十位段选码
delay(3);
}
else
{
P2=0xf3;
P0=0xff; //调时时flag2==0时,数码管分两位什么也不显示
}
if(flag3==1)
{
P2=0xef; //1110 1111 数码管的第四位显示小时个位
P0=table[hourl]; //送小时的个位段选
delay(3);
P2=0xdf; //1101 1111 数码管的第三位显示小时十位
P0=table[hourh]; //送小时的十位的段选
delay(3);
}
else
{
P2=0xcf;
P0=0xff; //调时时flag3==0时,数码管小时两位什么也不显示
}
if(flag4==1)
{
P2=0xbf; // 1011 1111 数码管的第二位显示天个位
P0=table[tianl]; //送天的个位的段选
delay(3);
P2=0x7f; // 0111 1111 数码管的第二位显示天个位
P0=table[tianh]; //送天的十位的段选
delay(3);
}
else
{
P2=0x3f; //调时时flag4==0时,数码管天两位什么也不显示
P0=0xff;
}
}
void init() //初始化函数
{
flag1=1; //flag1,flag2,flag3,flag4四位均为1,这个正常显示倒计时
flag2=1;
flag3=1;
flag4=1;
TMOD=0x11; //设置定时器1工作方式1,定时器0工作方式1
TH0=(65536-50000)/256; //给定时器0赋初值50000,,50ms
TL0=(65536-50000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
EA=1; //打开总中断
ET0=1; //允许定时器0中断
ET1=1; //允许定时器1中断
TR0=1; //打开定时器0
TR1=1; //打开定时器1
tian=99; //设置开始倒计时时,天时分秒的初值
second=59;
minute=59;
hour=23;
}
void keyscan()
{
if(k1num!=0)
{
if(k1==0)
{
delay(5);
if(k1==0)
{
while(!k1)
{
display(); //当按下按键时数码管不会灭(重点)
}
if(k1num==1) // 当功能键按下一次时,此时按下K1,对秒进行增大调整
{
second++;
if(second==60) //当秒满60时,秒清0
second=0;
}
if(k1num==2) // 当功能键按下二次时,此时按下K1,对分进行增大调整
{
minute++;
if(minute==60) //当分满60时,分清0
minute=0;
}
if(k1num==3) // 当功能键按下三次时,此时按下K1,对时进行增大调整
{
hour++;
if(hour==24) //当小时等于24时,小时清0
hour=0;
}
if(k1num==4) // 当功能键按下四次时,此时按下K1,对天进行增大调整
{
tian++;
if(tian==99) //当天等于99时,天清0
tian=0;
}
}
}
if(k2==0)
{
while(!k2)
{
display(); //当按下按键时数码管不会灭(重点)
}
if(k1num==1) // 当功能键按下一次时,此时按下K2,对秒进行减小调整
{
second--;
if(second==-1) //当秒等于-1时,秒变为59
second=59;
}
if(k1num==2) // 当功能键按下二次时,此时按下K2,对分进行减小调整
{
minute--;
if(minute==-1) //当分等于-1时,分变为59
minute=59;
}
if(k1num==3) // 当功能键按下三次时,此时按下K2,对时进行减小调整
{
hour--;
if(hour==-1) //当时等于-1时,小时变为23
hour=23;
}
if(k1num==4) // 当功能键按下四次时,此时按下K2,对天进行减小调整
{
tian--;
if(tian==-1) //当天等于-1时,天变成99
tian=99;
}
}
}
if(k4==0) //倒计时启动 暂停
{
delay(5);
if(k4==0)
{
while(!k4);
flag5=~flag5;
if(flag5!=0) //当flag5==0时,倒计时进行,当flag5!=0,倒计时结束。可以进行调时
{
TR0=0;
TR1=1;
}
else
{
TR0=1;
TR1=0;
}
}
}
if(flag4!=0)
{
if(k3==0)
{
delay(5);
k1num++;
if(k1num==5)
{
k1num=0;
}
while(!k3)
{
display();
TR0=0;
}
}
}
}
void didi()
{
if(second==0&&minute==0) //当时整点时,蜂鸣器响一下
{
beep=0; //蜂鸣器响
}
else
{
beep=1; //蜂鸣器关闭
}
}
void main()
{
init();
while(1)
{
display(); //显示子程序
keyscan(); //按键扫描程序
didi(); //蜂鸣器报警程序
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; //给定时器0赋初值,50ms
TL0=(65536-50000)%256;
num++;
if(num==20) //num==20,满一秒,秒减一
{
num=0;
second--;
if(second==-1)
{
second=59; //秒减到-1,变为59,分减一
minute--;
if(minute==-1)
{
minute=59;
hour--; //分减到-1,分变为59,时减一
if(hour==-1)
{
hour=23;
tian--; // 时减到-1,变成23,天减一天
if(tian==-1)
{
while(1)
{
P0=0xc0;
P2=0x00;
}
}
}
}
}
}
}
void timer1() interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
num1++;
if(num1==100) //控制数码管闪烁时间0.5s闪烁一次
{
num1=0;
switch (k1num)
{
case 1:flag1=~flag1; //每0.5秒,flag1翻转一次,秒闪烁
flag2=1;
flag3=1;
flag4=1;
break;
case 2:flag2=~flag2; //每0.5秒,flag2翻转一次,分闪烁
flag1=1;
flag3=1;
flag4=1;
break;
case 3:flag3=~flag3; //每0.5秒,flag2翻转一次,时闪烁
flag1=1;
flag2=1;
flag4=1;
break;
case 4:flag4=~flag4; //每0.5秒,flag2翻转一次,天闪烁
flag1=1;
flag2=1;
flag3=1;
break;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源内容概要: 这是基于51单片机的一百天倒计时设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、proteus仿真图。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
79、基于51单片机一百天倒计时电路图及proteus仿真及程序.rar (33个子文件)
79、基于51单片机一百天倒计时电路图及proteus仿真及程序
电路图
12.PcbDoc 3.17MB
History
12.SchDoc 184KB
12.PrjPcb 28KB
12.pcbdoc_viewstate 3KB
12.PcbDoc.htm 7KB
100天倒计时程序
100天倒计时.M51 17KB
100天倒计时 11KB
100天倒计时_Uv2.Bak 0B
100天倒计时.plg 401B
100天倒计时.hex 3KB
daojishi.c 7KB
daojishi.LST 19KB
100天倒计时.Opt 968B
daojishi.OBJ 13KB
100天倒计时.lnp 51B
100天倒计时.Uv2 2KB
100天倒计时_Opt.Bak 974B
100天倒计时仿真
时表.DSN 88KB
Last Loaded 时表.DBK 88KB
倒计时.pdf 384KB
100天倒计时程序
100天倒计时.M51 17KB
100天倒计时 11KB
100天倒计时_Uv2.Bak 0B
100天倒计时.plg 3KB
100天倒计时.hex 3KB
daojishi.c 7KB
daojishi.LST 19KB
100天倒计时.Opt 979B
daojishi.OBJ 13KB
100天倒计时.lnp 51B
100天倒计时.Uv2 2KB
100天倒计时_Opt.Bak 976B
时表.PWI 935B
共 33 条
- 1
资源评论
>行者<
- 粉丝: 248
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- bdwptqmxgj11.zip
- onnxruntime-win-x86
- onnxruntime-win-x64-gpu-1.20.1.zip
- vs2019 c++20 语法规范 头文件 <ratio> 的源码阅读与注释,处理分数的存储,加减乘除,以及大小比较等运算
- 首次尝试使用 Win,DirectX C++ 中的形状渲染套件.zip
- 预乘混合模式是一种用途广泛的三合一混合模式 它已经存在很长时间了,但似乎每隔几年就会被重新发现 该项目包括使用预乘 alpha 的描述,示例和工具 .zip
- 项目描述 DirectX 引擎支持版本 9、10、11 库 Microsoft SDK 功能相机视图、照明、加载网格、动画、蒙皮、层次结构界面、动画控制器、网格容器、碰撞系统 .zip
- 项目 wiki 文档中使用的代码教程的源代码库.zip
- 面向对象的通用GUI框架.zip
- 基于Java语言的PlayerBase游戏角色设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功